@north-light/cli 0.3.529 → 0.3.531

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 (509) hide show
  1. package/dist/api/dto/lifecycle.d.ts +3 -1
  2. package/dist/api/dto/messages.d.ts +5 -3
  3. package/dist/builtin-memory/crouter-plugin/bundles-and-memory.md +1 -1
  4. package/dist/builtin-memory/crouter-plugin/commands.md +1 -1
  5. package/dist/clients/attach/session/connection.js +1 -1
  6. package/dist/clients/attach/session/reconnect.js +1 -1
  7. package/dist/clients/attach/viewer.js +508 -508
  8. package/dist/commands/node/message.js +1 -1
  9. package/dist/commands/sys/join.js +1 -1
  10. package/dist/core/async-array.d.ts +7 -0
  11. package/dist/core/async-array.js +1 -0
  12. package/dist/core/audit.d.ts +1 -1
  13. package/dist/core/audit.js +2 -2
  14. package/dist/core/canvas/attention.d.ts +4 -4
  15. package/dist/core/canvas/attention.js +1 -1
  16. package/dist/core/canvas/boot.d.ts +4 -4
  17. package/dist/core/canvas/boot.js +1 -1
  18. package/dist/core/canvas/canvas.d.ts +59 -59
  19. package/dist/core/canvas/canvas.js +19 -19
  20. package/dist/core/canvas/context-strip.js +2 -2
  21. package/dist/core/canvas/crons.d.ts +27 -27
  22. package/dist/core/canvas/crons.js +11 -11
  23. package/dist/core/canvas/daemon-actions.d.ts +10 -10
  24. package/dist/core/canvas/daemon-actions.js +8 -8
  25. package/dist/core/canvas/daemon-owner.d.ts +3 -3
  26. package/dist/core/canvas/daemon-owner.js +2 -2
  27. package/dist/core/canvas/db.d.ts +19 -30
  28. package/dist/core/canvas/db.js +3 -2
  29. package/dist/core/canvas/deliveries.d.ts +16 -16
  30. package/dist/core/canvas/deliveries.js +24 -24
  31. package/dist/core/canvas/executions.d.ts +8 -8
  32. package/dist/core/canvas/executions.js +1 -1
  33. package/dist/core/canvas/focuses.d.ts +8 -8
  34. package/dist/core/canvas/focuses.js +1 -1
  35. package/dist/core/canvas/history.d.ts +3 -3
  36. package/dist/core/canvas/history.js +9 -9
  37. package/dist/core/canvas/install-id.d.ts +1 -1
  38. package/dist/core/canvas/install-id.js +1 -1
  39. package/dist/core/canvas/managed-worktree-sweep-candidates.d.ts +1 -1
  40. package/dist/core/canvas/managed-worktree-sweep-candidates.js +2 -2
  41. package/dist/core/canvas/memory-reads.d.ts +6 -6
  42. package/dist/core/canvas/memory-reads.js +1 -1
  43. package/dist/core/canvas/nav-model.d.ts +13 -13
  44. package/dist/core/canvas/nav-model.js +1 -1
  45. package/dist/core/canvas/node-agent-paths.d.ts +6 -6
  46. package/dist/core/canvas/node-agent-paths.js +1 -1
  47. package/dist/core/canvas/node-tokens.d.ts +7 -7
  48. package/dist/core/canvas/node-tokens.js +3 -3
  49. package/dist/core/canvas/outcome-actions.d.ts +5 -5
  50. package/dist/core/canvas/outcome-actions.js +3 -3
  51. package/dist/core/canvas/recovery.d.ts +26 -26
  52. package/dist/core/canvas/recovery.js +2 -2
  53. package/dist/core/canvas/render-source.d.ts +1 -1
  54. package/dist/core/canvas/render-source.js +1 -1
  55. package/dist/core/canvas/sessions.d.ts +10 -10
  56. package/dist/core/canvas/sessions.js +4 -4
  57. package/dist/core/canvas/source.js +1 -1
  58. package/dist/core/canvas/structured-requests.d.ts +15 -15
  59. package/dist/core/canvas/structured-requests.js +5 -5
  60. package/dist/core/canvas/tree.d.ts +9 -9
  61. package/dist/core/canvas/tree.js +5 -5
  62. package/dist/core/canvas/waits.d.ts +13 -13
  63. package/dist/core/canvas/waits.js +6 -6
  64. package/dist/core/canvas/worktrees.d.ts +15 -15
  65. package/dist/core/canvas/worktrees.js +1 -1
  66. package/dist/core/command-hooks/lifecycle-catalog.d.ts +4 -4
  67. package/dist/core/command-hooks/lifecycle-catalog.js +1 -1
  68. package/dist/core/command-hooks/transport/exec-lifecycle.js +1 -1
  69. package/dist/core/command-plugins/bundle.d.ts +1 -1
  70. package/dist/core/command-plugins/bundle.js +1 -1
  71. package/dist/core/conversation-store/file-store.d.ts +7 -7
  72. package/dist/core/conversation-store/file-store.js +9 -9
  73. package/dist/core/conversation-store/index.d.ts +16 -14
  74. package/dist/core/conversation-store/index.js +1 -1
  75. package/dist/core/conversation-store/listener.js +5 -5
  76. package/dist/core/conversation-store/patch.d.ts +3 -1
  77. package/dist/core/conversation-store/patch.js +1 -1
  78. package/dist/core/directory/join.d.ts +1 -1
  79. package/dist/core/feed/feed.js +3 -3
  80. package/dist/core/feed/inbox.d.ts +2 -2
  81. package/dist/core/feed/inbox.js +1 -1
  82. package/dist/core/feed/messages.d.ts +11 -12
  83. package/dist/core/feed/messages.js +5 -5
  84. package/dist/core/feed/reports.d.ts +4 -4
  85. package/dist/core/feed/reports.js +2 -2
  86. package/dist/core/grants/cover.d.ts +1 -1
  87. package/dist/core/grants/cover.js +1 -1
  88. package/dist/core/grants/local.d.ts +1 -1
  89. package/dist/core/grants/local.js +1 -1
  90. package/dist/core/grants/mirror.d.ts +19 -19
  91. package/dist/core/grants/mirror.js +2 -2
  92. package/dist/core/grants/on-sync.d.ts +1 -1
  93. package/dist/core/grants/on-sync.js +1 -1
  94. package/dist/core/grants/remove.js +1 -1
  95. package/dist/core/grants/sync.js +1 -1
  96. package/dist/core/graph/access.d.ts +17 -17
  97. package/dist/core/graph/access.js +3 -3
  98. package/dist/core/graph/custom.d.ts +16 -16
  99. package/dist/core/graph/custom.js +9 -9
  100. package/dist/core/graph/deletion.d.ts +3 -7
  101. package/dist/core/graph/deletion.js +4 -4
  102. package/dist/core/graph/documents.d.ts +24 -27
  103. package/dist/core/graph/documents.js +7 -7
  104. package/dist/core/graph/edges.d.ts +13 -13
  105. package/dist/core/graph/edges.js +1 -1
  106. package/dist/core/graph/events.d.ts +7 -9
  107. package/dist/core/graph/events.js +8 -8
  108. package/dist/core/graph/exposures.d.ts +6 -6
  109. package/dist/core/graph/exposures.js +4 -4
  110. package/dist/core/graph/jobs.d.ts +6 -8
  111. package/dist/core/graph/jobs.js +2 -2
  112. package/dist/core/graph/kinds/action.js +1 -1
  113. package/dist/core/graph/kinds/custom.js +2 -2
  114. package/dist/core/graph/kinds/document.d.ts +1 -0
  115. package/dist/core/graph/kinds/document.js +4 -4
  116. package/dist/core/graph/kinds/dto.d.ts +2 -2
  117. package/dist/core/graph/kinds/dto.js +1 -1
  118. package/dist/core/graph/kinds/job.js +2 -2
  119. package/dist/core/graph/kinds/kind.d.ts +6 -8
  120. package/dist/core/graph/kinds/kind.js +1 -1
  121. package/dist/core/graph/kinds/node.js +5 -5
  122. package/dist/core/graph/kinds/owner.js +2 -2
  123. package/dist/core/graph/kinds/registry.d.ts +6 -9
  124. package/dist/core/graph/kinds/registry.js +1 -1
  125. package/dist/core/graph/names.d.ts +6 -6
  126. package/dist/core/graph/names.js +3 -3
  127. package/dist/core/graph/object-waits.d.ts +4 -7
  128. package/dist/core/graph/object-waits.js +1 -1
  129. package/dist/core/graph/objects.d.ts +14 -14
  130. package/dist/core/graph/objects.js +9 -9
  131. package/dist/core/graph/package-docs.d.ts +2 -7
  132. package/dist/core/graph/package-docs.js +5 -5
  133. package/dist/core/graph/package-kinds.d.ts +2 -5
  134. package/dist/core/graph/package-kinds.js +1 -1
  135. package/dist/core/graph/package-reconcile.d.ts +2 -5
  136. package/dist/core/graph/package-reconcile.js +1 -1
  137. package/dist/core/graph/reader.d.ts +18 -18
  138. package/dist/core/graph/reader.js +3 -3
  139. package/dist/core/graph/receivers.d.ts +4 -4
  140. package/dist/core/graph/receivers.js +5 -5
  141. package/dist/core/graph/repo-sync/exchange.d.ts +3 -7
  142. package/dist/core/graph/repo-sync/exchange.js +2 -2
  143. package/dist/core/graph/repo-sync/repos.d.ts +7 -5
  144. package/dist/core/graph/repo-sync/repos.js +3 -3
  145. package/dist/core/graph/repo-sync/sync.d.ts +3 -6
  146. package/dist/core/graph/repo-sync/sync.js +2 -2
  147. package/dist/core/graph/rules.d.ts +5 -5
  148. package/dist/core/graph/rules.js +3 -3
  149. package/dist/core/graph/spaces/app.js +1 -1
  150. package/dist/core/graph/spaces/index.d.ts +4 -5
  151. package/dist/core/graph/spaces/index.js +1 -1
  152. package/dist/core/graph/spaces/own-memory.d.ts +4 -4
  153. package/dist/core/graph/spaces/own-memory.js +1 -1
  154. package/dist/core/graph/spaces/person.js +3 -3
  155. package/dist/core/graph/spaces/repo.d.ts +1 -1
  156. package/dist/core/graph/spaces/repo.js +1 -1
  157. package/dist/core/graph/watches.d.ts +15 -15
  158. package/dist/core/graph/watches.js +10 -10
  159. package/dist/core/human/feedback-companion.d.ts +2 -2
  160. package/dist/core/human/feedback-companion.js +1 -1
  161. package/dist/core/human/feedback.d.ts +3 -3
  162. package/dist/core/human/feedback.js +1 -1
  163. package/dist/core/human/requests.d.ts +34 -33
  164. package/dist/core/human/requests.js +20 -20
  165. package/dist/core/human/scan.d.ts +2 -2
  166. package/dist/core/human/scan.js +1 -1
  167. package/dist/core/human/tickets.d.ts +9 -9
  168. package/dist/core/human/tickets.js +1 -1
  169. package/dist/core/llm/app-rungs.d.ts +1 -1
  170. package/dist/core/llm/app-rungs.js +1 -1
  171. package/dist/core/llm/run.js +1 -1
  172. package/dist/core/peer/directory.d.ts +1 -1
  173. package/dist/core/peer/directory.js +1 -1
  174. package/dist/core/peer/envelope.d.ts +3 -3
  175. package/dist/core/peer/envelope.js +1 -1
  176. package/dist/core/peer/home.d.ts +7 -7
  177. package/dist/core/peer/home.js +2 -2
  178. package/dist/core/peer/ingest.d.ts +6 -6
  179. package/dist/core/peer/ingest.js +1 -1
  180. package/dist/core/peer/outbox-store.d.ts +14 -14
  181. package/dist/core/peer/outbox-store.js +5 -5
  182. package/dist/core/peer/receiver.d.ts +2 -2
  183. package/dist/core/peer/receiver.js +1 -1
  184. package/dist/core/peer/stubs.d.ts +10 -10
  185. package/dist/core/peer/stubs.js +1 -1
  186. package/dist/core/providers/approval.d.ts +2 -2
  187. package/dist/core/providers/approval.js +2 -2
  188. package/dist/core/providers/audit.d.ts +3 -3
  189. package/dist/core/providers/audit.js +2 -2
  190. package/dist/core/providers/bundles.js +2 -2
  191. package/dist/core/providers/call.d.ts +2 -2
  192. package/dist/core/providers/call.js +1 -1
  193. package/dist/core/providers/files.d.ts +1 -1
  194. package/dist/core/providers/files.js +1 -1
  195. package/dist/core/providers/mint.js +1 -1
  196. package/dist/core/providers/receipts.d.ts +1 -1
  197. package/dist/core/providers/receipts.js +2 -2
  198. package/dist/core/review/birth.js +1 -1
  199. package/dist/core/review/comments.d.ts +19 -19
  200. package/dist/core/review/comments.js +5 -5
  201. package/dist/core/review/companion.d.ts +1 -1
  202. package/dist/core/review/companion.js +1 -1
  203. package/dist/core/review/document.d.ts +3 -3
  204. package/dist/core/review/document.js +2 -2
  205. package/dist/core/review/fork.js +2 -2
  206. package/dist/core/review/realize.js +1 -1
  207. package/dist/core/review/remap.d.ts +2 -2
  208. package/dist/core/review/remap.js +4 -4
  209. package/dist/core/review/stage.d.ts +1 -1
  210. package/dist/core/review/stage.js +1 -1
  211. package/dist/core/review/store.d.ts +21 -21
  212. package/dist/core/review/store.js +1 -1
  213. package/dist/core/runs/activity.d.ts +1 -1
  214. package/dist/core/runs/activity.js +5 -5
  215. package/dist/core/runs/confinement.d.ts +7 -7
  216. package/dist/core/runs/confinement.js +2 -2
  217. package/dist/core/runs/events.d.ts +12 -12
  218. package/dist/core/runs/events.js +4 -4
  219. package/dist/core/runs/operations.d.ts +11 -11
  220. package/dist/core/runs/operations.js +5 -5
  221. package/dist/core/runs/questions.d.ts +10 -10
  222. package/dist/core/runs/questions.js +3 -3
  223. package/dist/core/runtime/auth-reload.js +1 -1
  224. package/dist/core/runtime/bearings.d.ts +5 -5
  225. package/dist/core/runtime/bearings.js +6 -6
  226. package/dist/core/runtime/broker-inventory.js +1 -1
  227. package/dist/core/runtime/broker-request.js +1 -1
  228. package/dist/core/runtime/broker.js +1 -1
  229. package/dist/core/runtime/close.d.ts +3 -3
  230. package/dist/core/runtime/close.js +1 -1
  231. package/dist/core/runtime/deliver-live.js +1 -1
  232. package/dist/core/runtime/fleet.d.ts +2 -2
  233. package/dist/core/runtime/host.d.ts +3 -3
  234. package/dist/core/runtime/host.js +3 -3
  235. package/dist/core/runtime/kickoff.d.ts +12 -12
  236. package/dist/core/runtime/kickoff.js +17 -17
  237. package/dist/core/runtime/launch-target.d.ts +1 -1
  238. package/dist/core/runtime/launch-target.js +1 -1
  239. package/dist/core/runtime/ledger.d.ts +3 -3
  240. package/dist/core/runtime/ledger.js +3 -3
  241. package/dist/core/runtime/lifecycle.d.ts +1 -1
  242. package/dist/core/runtime/lifecycle.js +2 -2
  243. package/dist/core/runtime/memory-admission.js +1 -1
  244. package/dist/core/runtime/model-swap.d.ts +2 -2
  245. package/dist/core/runtime/model-swap.js +1 -1
  246. package/dist/core/runtime/node-read.d.ts +1 -1
  247. package/dist/core/runtime/node-read.js +2 -2
  248. package/dist/core/runtime/nodes.d.ts +6 -6
  249. package/dist/core/runtime/nodes.js +1 -1
  250. package/dist/core/runtime/outcome-document.d.ts +1 -1
  251. package/dist/core/runtime/outcome-document.js +1 -1
  252. package/dist/core/runtime/persona.d.ts +3 -3
  253. package/dist/core/runtime/persona.js +2 -2
  254. package/dist/core/runtime/placement.d.ts +11 -11
  255. package/dist/core/runtime/placement.js +1 -1
  256. package/dist/core/runtime/promote.d.ts +3 -3
  257. package/dist/core/runtime/promote.js +1 -1
  258. package/dist/core/runtime/recycle.js +1 -1
  259. package/dist/core/runtime/reopen.d.ts +21 -10
  260. package/dist/core/runtime/reopen.js +1 -1
  261. package/dist/core/runtime/reset.d.ts +4 -4
  262. package/dist/core/runtime/reset.js +1 -1
  263. package/dist/core/runtime/revive-all.d.ts +2 -2
  264. package/dist/core/runtime/revive-all.js +1 -1
  265. package/dist/core/runtime/revive.d.ts +4 -4
  266. package/dist/core/runtime/revive.js +2 -2
  267. package/dist/core/runtime/roadmap.d.ts +6 -6
  268. package/dist/core/runtime/roadmap.js +5 -5
  269. package/dist/core/runtime/session-branch.d.ts +1 -1
  270. package/dist/core/runtime/session-branch.js +1 -1
  271. package/dist/core/runtime/session-list-cache.js +1 -1
  272. package/dist/core/runtime/situational-live.js +1 -1
  273. package/dist/core/runtime/spawn.d.ts +2 -2
  274. package/dist/core/runtime/spawn.js +2 -2
  275. package/dist/core/runtime/stop-guard.d.ts +2 -2
  276. package/dist/core/runtime/stop-guard.js +3 -3
  277. package/dist/core/runtime/warm-pool.d.ts +2 -2
  278. package/dist/core/runtime/warm-pool.js +1 -1
  279. package/dist/core/spaces/mounts.d.ts +2 -2
  280. package/dist/core/spaces/mounts.js +1 -1
  281. package/dist/core/spaces/permissions.d.ts +1 -1
  282. package/dist/core/spaces/permissions.js +1 -1
  283. package/dist/core/spaces/process.d.ts +1 -1
  284. package/dist/core/spaces/process.js +1 -1
  285. package/dist/core/spaces/space.js +1 -1
  286. package/dist/core/spaces/stop.d.ts +3 -3
  287. package/dist/core/spaces/stop.js +2 -2
  288. package/dist/core/spaces/users.d.ts +6 -6
  289. package/dist/core/spaces/users.js +1 -1
  290. package/dist/core/storage/attachments.d.ts +2 -2
  291. package/dist/core/storage/attachments.js +1 -1
  292. package/dist/core/storage/shares.d.ts +2 -2
  293. package/dist/core/storage/shares.js +1 -1
  294. package/dist/core/storage/tables.d.ts +21 -21
  295. package/dist/core/storage/tables.js +3 -3
  296. package/dist/core/substrate/delivery/corpus.d.ts +5 -8
  297. package/dist/core/substrate/delivery/corpus.js +3 -3
  298. package/dist/core/substrate/delivery/deliver.d.ts +10 -15
  299. package/dist/core/substrate/delivery/deliver.js +3 -3
  300. package/dist/core/substrate/delivery/plan.d.ts +2 -12
  301. package/dist/core/substrate/delivery/plan.js +3 -3
  302. package/dist/core/substrate/delivery/render-boot.d.ts +4 -4
  303. package/dist/core/substrate/delivery/render-boot.js +18 -18
  304. package/dist/core/substrate/delivery/render-event.d.ts +7 -14
  305. package/dist/core/substrate/delivery/render-event.js +4 -4
  306. package/dist/core/substrate/subject.d.ts +2 -2
  307. package/dist/core/substrate/subject.js +1 -1
  308. package/dist/core/usage/ledger.d.ts +6 -6
  309. package/dist/core/usage/ledger.js +4 -4
  310. package/dist/core/worktree-close.js +4 -4
  311. package/dist/core/worktree-mutation-async.js +7 -7
  312. package/dist/core/worktree-quarantine.js +1 -1
  313. package/dist/core/worktree-sweep.d.ts +1 -1
  314. package/dist/core/worktree-sweep.js +6 -6
  315. package/dist/core/worktree.d.ts +5 -5
  316. package/dist/core/worktree.js +13 -13
  317. package/dist/daemon/analytics/compute.d.ts +2 -2
  318. package/dist/daemon/analytics/compute.js +1 -1
  319. package/dist/daemon/api/app-listener.d.ts +4 -4
  320. package/dist/daemon/api/app-listener.js +13 -13
  321. package/dist/daemon/api/bridge.js +5 -5
  322. package/dist/daemon/api/document-listener.js +6 -6
  323. package/dist/daemon/api/handlers/analytics.js +1 -1
  324. package/dist/daemon/api/handlers/attach.js +1 -1
  325. package/dist/daemon/api/handlers/bash-jobs.js +1 -1
  326. package/dist/daemon/api/handlers/bash.js +1 -1
  327. package/dist/daemon/api/handlers/broker-ops.d.ts +1 -1
  328. package/dist/daemon/api/handlers/broker-ops.js +1 -1
  329. package/dist/daemon/api/handlers/broker-recovery.d.ts +1 -1
  330. package/dist/daemon/api/handlers/broker-recovery.js +1 -1
  331. package/dist/daemon/api/handlers/broker-signals.d.ts +2 -2
  332. package/dist/daemon/api/handlers/broker-signals.js +2 -2
  333. package/dist/daemon/api/handlers/canvas.d.ts +1 -1
  334. package/dist/daemon/api/handlers/canvas.js +4 -4
  335. package/dist/daemon/api/handlers/chat-inventory.js +1 -1
  336. package/dist/daemon/api/handlers/crons.js +1 -1
  337. package/dist/daemon/api/handlers/custom-objects.d.ts +4 -4
  338. package/dist/daemon/api/handlers/custom-objects.js +3 -3
  339. package/dist/daemon/api/handlers/delivery-retry.js +1 -1
  340. package/dist/daemon/api/handlers/delivery.js +1 -1
  341. package/dist/daemon/api/handlers/docs.d.ts +4 -4
  342. package/dist/daemon/api/handlers/docs.js +1 -1
  343. package/dist/daemon/api/handlers/feedback-comments.js +3 -3
  344. package/dist/daemon/api/handlers/files.js +1 -1
  345. package/dist/daemon/api/handlers/focus.js +1 -1
  346. package/dist/daemon/api/handlers/health.js +3 -3
  347. package/dist/daemon/api/handlers/hook-exec.js +1 -1
  348. package/dist/daemon/api/handlers/human-requests.js +1 -1
  349. package/dist/daemon/api/handlers/inbox-page.d.ts +1 -1
  350. package/dist/daemon/api/handlers/inbox-page.js +1 -1
  351. package/dist/daemon/api/handlers/inbox.d.ts +1 -1
  352. package/dist/daemon/api/handlers/inbox.js +1 -1
  353. package/dist/daemon/api/handlers/llm.d.ts +1 -1
  354. package/dist/daemon/api/handlers/llm.js +3 -3
  355. package/dist/daemon/api/handlers/memory-reads.js +1 -1
  356. package/dist/daemon/api/handlers/memory.d.ts +5 -5
  357. package/dist/daemon/api/handlers/memory.js +5 -5
  358. package/dist/daemon/api/handlers/messages.js +2 -2
  359. package/dist/daemon/api/handlers/node-events.d.ts +2 -2
  360. package/dist/daemon/api/handlers/node-events.js +3 -3
  361. package/dist/daemon/api/handlers/node-outcomes.js +1 -1
  362. package/dist/daemon/api/handlers/node-records.js +2 -2
  363. package/dist/daemon/api/handlers/nodes.d.ts +1 -1
  364. package/dist/daemon/api/handlers/nodes.js +1 -1
  365. package/dist/daemon/api/handlers/objects.js +3 -3
  366. package/dist/daemon/api/handlers/package-docs.js +1 -1
  367. package/dist/daemon/api/handlers/plugin-app-token.d.ts +1 -1
  368. package/dist/daemon/api/handlers/plugin-app-token.js +1 -1
  369. package/dist/daemon/api/handlers/profiles.d.ts +3 -3
  370. package/dist/daemon/api/handlers/profiles.js +1 -1
  371. package/dist/daemon/api/handlers/providers.d.ts +1 -1
  372. package/dist/daemon/api/handlers/providers.js +1 -1
  373. package/dist/daemon/api/handlers/questions.js +1 -1
  374. package/dist/daemon/api/handlers/reports.d.ts +1 -1
  375. package/dist/daemon/api/handlers/reports.js +5 -5
  376. package/dist/daemon/api/handlers/review-comments.js +1 -1
  377. package/dist/daemon/api/handlers/reviews.js +1 -1
  378. package/dist/daemon/api/handlers/runs.js +1 -1
  379. package/dist/daemon/api/handlers/structured-requests.js +1 -1
  380. package/dist/daemon/api/handlers/subscriptions.js +1 -1
  381. package/dist/daemon/api/handlers/transfer.js +1 -1
  382. package/dist/daemon/api/map.d.ts +3 -3
  383. package/dist/daemon/api/map.js +1 -1
  384. package/dist/daemon/api/principal.d.ts +1 -1
  385. package/dist/daemon/api/principal.js +1 -1
  386. package/dist/daemon/api/reader.d.ts +5 -5
  387. package/dist/daemon/api/reader.js +1 -1
  388. package/dist/daemon/api/router.d.ts +5 -5
  389. package/dist/daemon/api/router.js +1 -1
  390. package/dist/daemon/api/server.js +1 -1
  391. package/dist/daemon/broker-signals/bus.d.ts +1 -1
  392. package/dist/daemon/broker-signals/bus.js +1 -1
  393. package/dist/daemon/companion-retire.js +1 -1
  394. package/dist/daemon/cron/armed-context.d.ts +2 -2
  395. package/dist/daemon/cron/armed-context.js +1 -1
  396. package/dist/daemon/cron/authority.d.ts +2 -2
  397. package/dist/daemon/cron/authority.js +1 -1
  398. package/dist/daemon/cron/disposition.js +1 -1
  399. package/dist/daemon/cron/ended.d.ts +1 -1
  400. package/dist/daemon/cron/ended.js +2 -2
  401. package/dist/daemon/cron/escalation.js +3 -3
  402. package/dist/daemon/cron/folders.d.ts +1 -1
  403. package/dist/daemon/cron/folders.js +1 -1
  404. package/dist/daemon/cron/held.d.ts +1 -1
  405. package/dist/daemon/cron/held.js +1 -1
  406. package/dist/daemon/cron/lease-recovery.d.ts +1 -1
  407. package/dist/daemon/cron/lease-recovery.js +1 -1
  408. package/dist/daemon/cron/passes.d.ts +2 -2
  409. package/dist/daemon/cron/passes.js +1 -1
  410. package/dist/daemon/cron/run-socket.d.ts +1 -1
  411. package/dist/daemon/cron/run-socket.js +1 -1
  412. package/dist/daemon/cron/settle.js +1 -1
  413. package/dist/daemon/cron/sinks.d.ts +1 -1
  414. package/dist/daemon/cron/sinks.js +2 -2
  415. package/dist/daemon/cron-run.d.ts +12 -3
  416. package/dist/daemon/cron-run.js +2 -2
  417. package/dist/daemon/crtrd.js +6 -6
  418. package/dist/daemon/delivery/run-delivery.js +1 -1
  419. package/dist/daemon/due-sources.d.ts +3 -3
  420. package/dist/daemon/due-sources.js +1 -1
  421. package/dist/daemon/due.d.ts +3 -3
  422. package/dist/daemon/due.js +7 -7
  423. package/dist/daemon/fleet.d.ts +2 -2
  424. package/dist/daemon/fleet.js +11 -11
  425. package/dist/daemon/human/finish.js +3 -3
  426. package/dist/daemon/human/settle.d.ts +1 -1
  427. package/dist/daemon/human/settle.js +1 -1
  428. package/dist/daemon/human/sweep.js +1 -1
  429. package/dist/daemon/joined-owner.d.ts +3 -3
  430. package/dist/daemon/joined-owner.js +1 -1
  431. package/dist/daemon/messaging/node-message.js +1 -1
  432. package/dist/daemon/park-activity.d.ts +2 -2
  433. package/dist/daemon/park-activity.js +1 -1
  434. package/dist/daemon/peer/authority.js +1 -1
  435. package/dist/daemon/peer/forward.d.ts +6 -6
  436. package/dist/daemon/peer/forward.js +1 -1
  437. package/dist/daemon/peer/handlers.js +1 -1
  438. package/dist/daemon/peer/ingress.d.ts +4 -4
  439. package/dist/daemon/peer/ingress.js +1 -1
  440. package/dist/daemon/peer/outbox.d.ts +2 -2
  441. package/dist/daemon/peer/outbox.js +1 -1
  442. package/dist/daemon/peer/relay-service.js +1 -1
  443. package/dist/daemon/plugin-objects/read-leaf.d.ts +2 -2
  444. package/dist/daemon/plugin-objects/read-leaf.js +2 -2
  445. package/dist/daemon/profile-delete.js +1 -1
  446. package/dist/daemon/readiness.d.ts +2 -2
  447. package/dist/daemon/readiness.js +1 -1
  448. package/dist/daemon/reconcilers/action-lane.d.ts +1 -1
  449. package/dist/daemon/reconcilers/action-lane.js +1 -1
  450. package/dist/daemon/reconcilers/bash-deadline.js +2 -2
  451. package/dist/daemon/reconcilers/broker-supervision.d.ts +1 -1
  452. package/dist/daemon/reconcilers/broker-supervision.js +4 -4
  453. package/dist/daemon/reconcilers/controller-death.d.ts +1 -1
  454. package/dist/daemon/reconcilers/controller-death.js +1 -1
  455. package/dist/daemon/reconcilers/cron-lane.d.ts +1 -1
  456. package/dist/daemon/reconcilers/cron-lane.js +1 -1
  457. package/dist/daemon/reconcilers/delivery-lane.d.ts +1 -1
  458. package/dist/daemon/reconcilers/delivery-lane.js +2 -2
  459. package/dist/daemon/reconcilers/fault-retry-backstop.d.ts +3 -3
  460. package/dist/daemon/reconcilers/fault-retry-backstop.js +1 -1
  461. package/dist/daemon/reconcilers/grove-instance-sweep.d.ts +2 -2
  462. package/dist/daemon/reconcilers/grove-instance-sweep.js +1 -1
  463. package/dist/daemon/reconcilers/live-obligation.d.ts +6 -6
  464. package/dist/daemon/reconcilers/live-obligation.js +1 -1
  465. package/dist/daemon/reconcilers/managed-worktree-sweep.js +1 -1
  466. package/dist/daemon/reconcilers/node-deadline.d.ts +1 -1
  467. package/dist/daemon/reconcilers/node-deadline.js +1 -1
  468. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -1
  469. package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.d.ts +3 -3
  470. package/dist/daemon/reconcilers/node-lifecycle/respawn-policy.js +1 -1
  471. package/dist/daemon/reconcilers/node-lifecycle/terminating.js +1 -1
  472. package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -1
  473. package/dist/daemon/reconcilers/node-lifecycle/wants-execution.d.ts +1 -1
  474. package/dist/daemon/reconcilers/node-lifecycle/wants-execution.js +1 -1
  475. package/dist/daemon/reconcilers/pending-review-submit.d.ts +1 -1
  476. package/dist/daemon/reconcilers/pending-review-submit.js +1 -1
  477. package/dist/daemon/reconcilers/storage-due-work.js +1 -1
  478. package/dist/daemon/reconcilers/storage-maintenance.d.ts +1 -1
  479. package/dist/daemon/reconcilers/storage-maintenance.js +2 -2
  480. package/dist/daemon/reconcilers/structured-request-lane.d.ts +1 -1
  481. package/dist/daemon/reconcilers/structured-request-lane.js +1 -1
  482. package/dist/daemon/review/comment-notify.js +2 -2
  483. package/dist/daemon/review/companion.d.ts +3 -3
  484. package/dist/daemon/review/companion.js +1 -1
  485. package/dist/daemon/review/finish.js +1 -1
  486. package/dist/daemon/review/sweep.js +1 -1
  487. package/dist/daemon/run-notices.d.ts +4 -4
  488. package/dist/daemon/run-notices.js +1 -1
  489. package/dist/daemon/runs/append-section.d.ts +2 -2
  490. package/dist/daemon/runs/append-section.js +2 -2
  491. package/dist/daemon/runs/observer.d.ts +2 -2
  492. package/dist/daemon/runs/observer.js +2 -2
  493. package/dist/daemon/structured-requests/boot.d.ts +1 -1
  494. package/dist/daemon/structured-requests/boot.js +1 -1
  495. package/dist/daemon/structured-requests/effects.js +1 -1
  496. package/dist/daemon/structured-requests/sidecar.d.ts +1 -1
  497. package/dist/daemon/structured-requests/sidecar.js +1 -1
  498. package/dist/launcher/run.js +1 -1
  499. package/dist/migrations/004-canvas-documents/apply.d.ts +3 -3
  500. package/dist/migrations/004-canvas-documents/apply.js +1 -1
  501. package/dist/migrations/004-canvas-documents/index.d.ts +2 -2
  502. package/dist/migrations/004-canvas-documents/index.js +2 -2
  503. package/dist/migrations/activation.js +2 -2
  504. package/docs/plugin/bundles-and-memory.md +1 -1
  505. package/docs/plugin/commands.md +1 -1
  506. package/docs/public-api.md +11 -0
  507. package/package.json +4 -3
  508. package/packages/crouter-identity/package.json +1 -1
  509. package/runtime.lock.json +12 -12
@@ -1,3 +1,3 @@
1
- var l=Object.defineProperty;var a=(e,t)=>l(e,"name",{value:t,configurable:!0});import{prepared as d}from"../sqlite-statements.js";import{openDb as _}from"../canvas/db.js";const s=a(e=>e??_(),"handle"),p=a(()=>new Date().toISOString(),"now");function T(e,t){d(s(t),"INSERT INTO uploads (upload_id, grantee, name, media_type, size, created_at, delete_pending_since) VALUES (?, ?, ?, ?, ?, ?, NULL)").run(e.upload_id,e.grantee,e.name,e.media_type,e.size,e.created_at)}a(T,"insertUpload");function f(e,t){return d(s(t),"SELECT * FROM uploads WHERE upload_id = ?").get(e)??null}a(f,"getUpload");function L(e,t){d(s(t),"DELETE FROM uploads WHERE upload_id = ?").run(e)}a(L,"deleteUploadRow");function O(e){return d(s(e),"SELECT * FROM uploads WHERE delete_pending_since IS NOT NULL ORDER BY delete_pending_since, upload_id").all()}a(O,"pendingUploadDeletes");function i(e,t,n=p()){const r=d(s(t),"UPDATE uploads SET delete_pending_since = COALESCE(delete_pending_since, ?) WHERE upload_id = ?");for(const o of e)r.run(n,o)}a(i,"markUploadsDeletePending");function D(e,t){const n=d(s(t),"INSERT INTO upload_uses (upload_id, run_id, path) VALUES (?, ?, ?)");for(const r of e)n.run(r.upload_id,r.run_id,r.path)}a(D,"insertUploadUses");function x(e,t){d(s(t),"DELETE FROM upload_uses WHERE upload_id = ? AND run_id = ? AND path = ?").run(e.upload_id,e.run_id,e.path)}a(x,"deleteUploadUse");function U(e,t,n){d(s(n),"UPDATE uploads SET size = ? WHERE upload_id = ?").run(t,e)}a(U,"setUploadSize");function N(e,t){return d(s(t),"SELECT upload_id, run_id, path FROM upload_uses WHERE path = ? ORDER BY run_id LIMIT 1").get(e)??null}a(N,"uploadUseAt");function g(e,t){const n=s(t);if(!e.length)return[];const r=e.map(()=>"?").join(","),o=n.prepare(`SELECT DISTINCT upload_id FROM upload_uses WHERE run_id IN (${r})`).all(...e).map(E=>E.upload_id);n.prepare(`DELETE FROM upload_uses WHERE run_id IN (${r})`).run(...e);const u=o.filter(E=>!d(n,"SELECT 1 FROM upload_uses WHERE upload_id = ? LIMIT 1").get(E));return i(u,n),u}a(g,"releaseRunUploads");function A(e,t){return d(s(t),`SELECT upload_id FROM uploads u WHERE delete_pending_since IS NULL AND created_at <= ?
2
- AND NOT EXISTS (SELECT 1 FROM upload_uses x WHERE x.upload_id = u.upload_id)`).all(e).map(n=>n.upload_id)}a(A,"staleUnusedUploads");function C(e,t){d(s(t),`INSERT INTO shares (share_id, source_space, source_path, storage_key, url, created_by, created_at, expires_at, status, object_deleted_at)
3
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'on', NULL)`).run(e.share_id,e.source_space,e.source_path,e.storage_key,e.url,e.created_by,e.created_at,e.expires_at)}a(C,"insertShare");function H(e,t){return d(s(t),"SELECT * FROM shares WHERE share_id = ?").get(e)??null}a(H,"getShare");function W(e,t){return e===null?d(s(t),"SELECT * FROM shares ORDER BY created_at DESC, share_id").all():d(s(t),"SELECT * FROM shares WHERE created_by = ? ORDER BY created_at DESC, share_id").all(e)}a(W,"listShares");function c(e,t){d(s(t),"UPDATE shares SET status = 'off' WHERE share_id = ?").run(e)}a(c,"turnShareOff");function m(e,t){const n=s(t),r=d(n,"SELECT share_id FROM shares WHERE created_by = ? AND status = 'on'").all(e).map(o=>o.share_id);return d(n,"UPDATE shares SET status = 'off' WHERE created_by = ? AND status = 'on'").run(e),r}a(m,"turnSharesOffFor");function M(e=p(),t){const n=s(t),r=d(n,"SELECT share_id FROM shares WHERE status = 'on' AND expires_at IS NOT NULL AND expires_at <= ?").all(e).map(o=>o.share_id);for(const o of r)c(o,n);return r}a(M,"expireShares");function F(e){return d(s(e),"SELECT * FROM shares WHERE status = 'off' AND object_deleted_at IS NULL ORDER BY created_at, share_id").all()}a(F,"sharesOwingObjectDelete");function I(e,t,n=p()){d(s(t),"UPDATE shares SET object_deleted_at = COALESCE(object_deleted_at, ?) WHERE share_id = ?").run(n,e)}a(I,"markShareObjectDeleted");function b(e,t,n=p()){const r=s(t),o=d(r,"SELECT upload_id FROM uploads WHERE grantee = ? AND delete_pending_since IS NULL").all(e).map(u=>u.upload_id);return i(o,r,n),o}a(b,"markGranteeUploadsDeletePending");export{L as deleteUploadRow,x as deleteUploadUse,M as expireShares,H as getShare,f as getUpload,C as insertShare,T as insertUpload,D as insertUploadUses,W as listShares,b as markGranteeUploadsDeletePending,I as markShareObjectDeleted,i as markUploadsDeletePending,O as pendingUploadDeletes,g as releaseRunUploads,U as setUploadSize,F as sharesOwingObjectDelete,A as staleUnusedUploads,c as turnShareOff,m as turnSharesOffFor,N as uploadUseAt};
1
+ var E=Object.defineProperty;var t=(a,e)=>E(a,"name",{value:e,configurable:!0});import{openDb as l}from"../canvas/db.js";import{filterAsync as _}from"../async-array.js";const n=t(async a=>a??await l(),"handle"),d=t(()=>new Date().toISOString(),"now");async function w(a,e){await(await n(e)).prepare("INSERT INTO uploads (upload_id, grantee, name, media_type, size, created_at, delete_pending_since) VALUES (?, ?, ?, ?, ?, ?, NULL)").run(a.upload_id,a.grantee,a.name,a.media_type,a.size,a.created_at)}t(w,"insertUpload");async function T(a,e){return await(await n(e)).prepare("SELECT * FROM uploads WHERE upload_id = ?").get(a)??null}t(T,"getUpload");async function f(a,e){await(await n(e)).prepare("DELETE FROM uploads WHERE upload_id = ?").run(a)}t(f,"deleteUploadRow");async function L(a){return await(await n(a)).prepare("SELECT * FROM uploads WHERE delete_pending_since IS NOT NULL ORDER BY delete_pending_since, upload_id").all()}t(L,"pendingUploadDeletes");async function u(a,e,r=d()){const i=(await n(e)).prepare("UPDATE uploads SET delete_pending_since = COALESCE(delete_pending_since, ?) WHERE upload_id = ?");for(const s of a)await i.run(r,s)}t(u,"markUploadsDeletePending");async function O(a,e){const r=(await n(e)).prepare("INSERT INTO upload_uses (upload_id, run_id, path) VALUES (?, ?, ?)");for(const i of a)await r.run(i.upload_id,i.run_id,i.path)}t(O,"insertUploadUses");async function D(a,e){await(await n(e)).prepare("DELETE FROM upload_uses WHERE upload_id = ? AND run_id = ? AND path = ?").run(a.upload_id,a.run_id,a.path)}t(D,"deleteUploadUse");async function U(a,e,r){await(await n(r)).prepare("UPDATE uploads SET size = ? WHERE upload_id = ?").run(e,a)}t(U,"setUploadSize");async function x(a,e){return await(await n(e)).prepare("SELECT upload_id, run_id, path FROM upload_uses WHERE path = ? ORDER BY run_id LIMIT 1").get(a)??null}t(x,"uploadUseAt");async function y(a,e){const r=await n(e);if(!a.length)return[];const i=a.map(()=>"?").join(","),s=(await r.prepareUncached(`SELECT DISTINCT upload_id FROM upload_uses WHERE run_id IN (${i})`).all(...a)).map(o=>o.upload_id);await r.prepareUncached(`DELETE FROM upload_uses WHERE run_id IN (${i})`).run(...a);const p=await _(s,async o=>!await r.prepare("SELECT 1 FROM upload_uses WHERE upload_id = ? LIMIT 1").get(o));return await u(p,r),p}t(y,"releaseRunUploads");async function N(a,e){return(await(await n(e)).prepare(`SELECT upload_id FROM uploads u WHERE delete_pending_since IS NULL AND created_at <= ?
2
+ AND NOT EXISTS (SELECT 1 FROM upload_uses x WHERE x.upload_id = u.upload_id)`).all(a)).map(r=>r.upload_id)}t(N,"staleUnusedUploads");async function g(a,e){await(await n(e)).prepare(`INSERT INTO shares (share_id, source_space, source_path, storage_key, url, created_by, created_at, expires_at, status, object_deleted_at)
3
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'on', NULL)`).run(a.share_id,a.source_space,a.source_path,a.storage_key,a.url,a.created_by,a.created_at,a.expires_at)}t(g,"insertShare");async function A(a,e){return await(await n(e)).prepare("SELECT * FROM shares WHERE share_id = ?").get(a)??null}t(A,"getShare");async function C(a,e){return a===null?await(await n(e)).prepare("SELECT * FROM shares ORDER BY created_at DESC, share_id").all():await(await n(e)).prepare("SELECT * FROM shares WHERE created_by = ? ORDER BY created_at DESC, share_id").all(a)}t(C,"listShares");async function c(a,e){await(await n(e)).prepare("UPDATE shares SET status = 'off' WHERE share_id = ?").run(a)}t(c,"turnShareOff");async function H(a,e){const r=await n(e),i=(await r.prepare("SELECT share_id FROM shares WHERE created_by = ? AND status = 'on'").all(a)).map(s=>s.share_id);return await r.prepare("UPDATE shares SET status = 'off' WHERE created_by = ? AND status = 'on'").run(a),i}t(H,"turnSharesOffFor");async function W(a=d(),e){const r=await n(e),i=(await r.prepare("SELECT share_id FROM shares WHERE status = 'on' AND expires_at IS NOT NULL AND expires_at <= ?").all(a)).map(s=>s.share_id);for(const s of i)await c(s,r);return i}t(W,"expireShares");async function m(a){return await(await n(a)).prepare("SELECT * FROM shares WHERE status = 'off' AND object_deleted_at IS NULL ORDER BY created_at, share_id").all()}t(m,"sharesOwingObjectDelete");async function M(a,e,r=d()){await(await n(e)).prepare("UPDATE shares SET object_deleted_at = COALESCE(object_deleted_at, ?) WHERE share_id = ?").run(r,a)}t(M,"markShareObjectDeleted");async function F(a,e,r=d()){const i=await n(e),s=(await i.prepare("SELECT upload_id FROM uploads WHERE grantee = ? AND delete_pending_since IS NULL").all(a)).map(p=>p.upload_id);return await u(s,i,r),s}t(F,"markGranteeUploadsDeletePending");export{f as deleteUploadRow,D as deleteUploadUse,W as expireShares,A as getShare,T as getUpload,g as insertShare,w as insertUpload,O as insertUploadUses,C as listShares,F as markGranteeUploadsDeletePending,M as markShareObjectDeleted,u as markUploadsDeletePending,L as pendingUploadDeletes,y as releaseRunUploads,U as setUploadSize,m as sharesOwingObjectDelete,N as staleUnusedUploads,c as turnShareOff,H as turnSharesOffFor,x as uploadUseAt};
@@ -1,12 +1,9 @@
1
- /** The documents delivery may consider for one reader: rule rows of the
2
- * owners in the reader's view, joined to their objects and documents, and
3
- * filtered by `canRead`. */
4
- import type { DatabaseSync } from 'node:sqlite';
5
1
  import type { ObjectRow, Reader, RuleOn } from '../../graph/types.js';
6
2
  import type { ProfileManifest } from '../../../types.js';
7
3
  import { type NodeConfigSubject } from '../subject.js';
8
4
  import type { Rung } from '../schema.js';
9
5
  import type { DeliveryDoc } from './types.js';
6
+ import type { CanvasDb } from '../../canvas/db.js';
10
7
  export declare function ownerHandle(owner: ObjectRow): string;
11
8
  /** The key that names one owner exactly in `delivery_limits`: `<type>:<handle>`,
12
9
  * the typed form `resolveName` accepts (`repo:crouter`, `person:user`, `app:terminal`). */
@@ -18,10 +15,10 @@ export declare function typedLimitKey(owner: ObjectRow): string;
18
15
  export declare function deliveryLimitFor(manifest: ProfileManifest | null, owner: ObjectRow, reader?: Reader): Rung;
19
16
  /** Documents with a rule on one of `on` whose owner is in the reader's view,
20
17
  * in view order. At `boot` a node's own documents come in even without a boot rule. */
21
- export declare function loadCorpus(db: DatabaseSync, reader: Reader, on: RuleOn[]): DeliveryDoc[];
18
+ export declare function loadCorpus(db: CanvasDb, reader: Reader, on: RuleOn[]): Promise<DeliveryDoc[]>;
22
19
  /** One document as a delivery document for `reader`, with all its rules (an explicit read). */
23
- export declare function deliveryDocOf(db: DatabaseSync, reader: Reader, doc: ObjectRow): DeliveryDoc;
20
+ export declare function deliveryDocOf(db: CanvasDb, reader: Reader, doc: ObjectRow): Promise<DeliveryDoc>;
24
21
  /** Every listed document of one owner the reader can read, for prefix listings. */
25
- export declare function listingCorpus(db: DatabaseSync, reader: Reader, owner: ObjectRow): DeliveryDoc[];
22
+ export declare function listingCorpus(db: CanvasDb, reader: Reader, owner: ObjectRow): Promise<DeliveryDoc[]>;
26
23
  /** The node reader's gate subject, with `repo` from the reader's eligible repos (cwd's, then its profile projects'). */
27
- export declare function nodeSubject(_db: DatabaseSync, reader: Reader): NodeConfigSubject;
24
+ export declare function nodeSubject(_db: CanvasDb, reader: Reader): Promise<NodeConfigSubject>;
@@ -1,3 +1,3 @@
1
- var O=Object.defineProperty;var s=(o,e)=>O(o,"name",{value:e,configurable:!0});import{prepared as R}from"../../sqlite-statements.js";import{canRead as $}from"../../graph/access.js";import{bodyOf as D}from"../../graph/bodies.js";import{resolveName as k,viewOf as m}from"../../graph/names.js";import{rulesForOwners as S,rulesOf as N}from"../../graph/rules.js";import{loadExactProfileManifest as M}from"../../profiles/manifest.js";import{assembleNodeSubject as L}from"../subject.js";function h(o){return o.type==="node"?o.id:o.name}s(h,"ownerHandle");function C(o){return`${o.type}:${h(o)}`}s(C,"typedLimitKey");function H(o,e,n){if(n?.class==="node"&&n.profile!==null&&n.profile.rowid===e.rowid)return"content";const t=o?.delivery_limits;return t?t[C(e)]??t[h(e)]??"content":"content"}s(H,"deliveryLimitFor");function E(o,e){if(e.class!=="node"||e.profile===null)return null;const n=R(o,"SELECT external_id FROM identities WHERE object = ? AND scheme = 'profile'").get(e.profile.rowid);if(!n)throw new Error(`profile object ${e.profile.id} has no profile identity`);return M(n.external_id).manifest}s(E,"readerManifest");function f(o,e,n){return o.prepare(`SELECT o.*, d.heads_key, d.unlisted, d.source_path FROM objects o JOIN documents d ON d.object = o.rowid
2
- WHERE o.type = 'document' AND o.deleted_at IS NULL AND ${e} ORDER BY o.rowid`).all(...n)}s(f,"documentRows");function b(o,e){const n=e.heads_key.split(","),t=o.prepare(`SELECT body_hash FROM revisions WHERE document = ? AND rev_id IN (${n.map(()=>"?").join(",")})
3
- ORDER BY number DESC LIMIT 1`).get(e.rowid,...n);if(!t)throw new Error(`document ${e.id} has no head revision ${e.heads_key}`);return t.body_hash}s(b,"headBodyHash");function y(o,e,n){const t=new Map;return{view:n,readable:s(i=>{let c=t.get(i.rowid);return c===void 0&&t.set(i.rowid,c=$(o,e,i)),c},"readable")}}s(y,"resolveContext");function j(o,e,n,t,i,c){const{view:l}=n,d=l.findIndex(x=>x.rowid===i.owner),u=d>=0?l[d]:R(o,"SELECT * FROM objects WHERE rowid = ?").get(i.owner),a=h(u),p=k(o,e,i.name,n),r=b(o,i),{heads_key:w,unlisted:_,source_path:v,...g}=i;return{object:g,owner:u,ownerHandle:a,viewRank:d>=0?d:l.length,ownNode:e.class==="node"&&i.owner===e.node.rowid,shipped:v!==null,kind:i.kind==="preference"?"preference":"knowledge",name:i.name,displayName:"object"in p&&p.object.rowid===i.rowid?i.name:`${a}/${i.name}`,preview:i.preview,unlisted:_!==0,headsKey:w,bodyHash:r,body:s(()=>D(r,v),"body"),rules:c,limit:H(t,u,e)}}s(j,"toDeliveryDoc");function J(o,e,n){const t=m(o,e),i=y(o,e,t),c=E(o,e),l=new Map;for(const r of S(o,n,t.map(w=>w.rowid)))l.set(r.object,[...l.get(r.object)??[],r]);const d=e.class==="node"&&n.includes("boot")?f(o,"o.owner = ?",[e.node.rowid]):[],u=[...new Set([...l.keys(),...d.map(r=>r.rowid)])],a=u.length===0?[]:f(o,`o.rowid IN (${u.map(()=>"?").join(",")})`,u),p=new Map(t.map((r,w)=>[r.rowid,w]));return a.filter(i.readable).sort((r,w)=>p.get(r.owner)-p.get(w.owner)||r.rowid-w.rowid).map(r=>j(o,e,i,c,r,l.get(r.rowid)??[]))}s(J,"loadCorpus");function P(o,e,n){const t=f(o,"o.rowid = ?",[n.rowid])[0];if(!t)throw new Error(`document ${n.id} has no documents row`);return j(o,e,y(o,e,m(o,e)),E(o,e),t,N(o,t))}s(P,"deliveryDocOf");function U(o,e,n){const t=y(o,e,m(o,e)),i=E(o,e);return f(o,"o.owner = ? AND d.unlisted = 0",[n.rowid]).filter(t.readable).map(c=>j(o,e,t,i,c,N(o,c)))}s(U,"listingCorpus");function q(o,e){if(e.class!=="node")throw new Error(`nodeSubject needs a node reader, got ${e.class}`);const n=L(e.node.id,[...e.repos,...e.projectRepos]);if(n===null)throw new Error(`no node ${e.node.id}`);return n}s(q,"nodeSubject");export{P as deliveryDocOf,H as deliveryLimitFor,U as listingCorpus,J as loadCorpus,q as nodeSubject,h as ownerHandle,C as typedLimitKey};
1
+ var $=Object.defineProperty;var r=(n,e)=>$(n,"name",{value:e,configurable:!0});import{canRead as D}from"../../graph/access.js";import{bodyOf as k}from"../../graph/bodies.js";import{resolveName as M,viewOf as m}from"../../graph/names.js";import{rulesForOwners as S,rulesOf as R}from"../../graph/rules.js";import{loadExactProfileManifest as L}from"../../profiles/manifest.js";import{assembleNodeSubject as C}from"../subject.js";import{filterAsync as N,mapAsync as _}from"../../async-array.js";function y(n){return n.type==="node"?n.id:n.name}r(y,"ownerHandle");function H(n){return`${n.type}:${y(n)}`}r(H,"typedLimitKey");function b(n,e,t){if(t?.class==="node"&&t.profile!==null&&t.profile.rowid===e.rowid)return"content";const o=n?.delivery_limits;return o?o[H(e)]??o[y(e)]??"content":"content"}r(b,"deliveryLimitFor");async function h(n,e){if(e.class!=="node"||e.profile===null)return null;const t=await n.prepare("SELECT external_id FROM identities WHERE object = ? AND scheme = 'profile'").get(e.profile.rowid);if(!t)throw new Error(`profile object ${e.profile.id} has no profile identity`);return L(t.external_id).manifest}r(h,"readerManifest");async function f(n,e,t){return await n.prepareUncached(`SELECT o.*, d.heads_key, d.unlisted, d.source_path FROM objects o JOIN documents d ON d.object = o.rowid
2
+ WHERE o.type = 'document' AND o.deleted_at IS NULL AND ${e} ORDER BY o.rowid`).all(...t)}r(f,"documentRows");async function A(n,e){const t=e.heads_key.split(","),o=await n.prepareUncached(`SELECT body_hash FROM revisions WHERE document = ? AND rev_id IN (${t.map(()=>"?").join(",")})
3
+ ORDER BY number DESC LIMIT 1`).get(e.rowid,...t);if(!o)throw new Error(`document ${e.id} has no head revision ${e.heads_key}`);return o.body_hash}r(A,"headBodyHash");function E(n,e,t){const o=new Map;return{view:t,readable:r(async i=>{let s=o.get(i.rowid);return s===void 0&&o.set(i.rowid,s=await D(n,e,i)),s},"readable")}}r(E,"resolveContext");async function j(n,e,t,o,i,s){const{view:w}=t,u=w.findIndex(O=>O.rowid===i.owner),l=u>=0?w[u]:await n.prepare("SELECT * FROM objects WHERE rowid = ?").get(i.owner),p=y(l),d=await M(n,e,i.name,t),a=await A(n,i),{heads_key:c,unlisted:g,source_path:v,...x}=i;return{object:x,owner:l,ownerHandle:p,viewRank:u>=0?u:w.length,ownNode:e.class==="node"&&i.owner===e.node.rowid,shipped:v!==null,kind:i.kind==="preference"?"preference":"knowledge",name:i.name,displayName:"object"in d&&d.object.rowid===i.rowid?i.name:`${p}/${i.name}`,preview:i.preview,unlisted:g!==0,headsKey:c,bodyHash:a,body:r(()=>k(a,v),"body"),rules:s,limit:b(o,l,e)}}r(j,"toDeliveryDoc");async function J(n,e,t){const o=await m(n,e),i=E(n,e,o),s=await h(n,e),w=new Map;for(const a of await S(n,t,o.map(c=>c.rowid)))w.set(a.object,[...w.get(a.object)??[],a]);const u=e.class==="node"&&t.includes("boot")?await f(n,"o.owner = ?",[e.node.rowid]):[],l=[...new Set([...w.keys(),...u.map(a=>a.rowid)])],p=l.length===0?[]:await f(n,`o.rowid IN (${l.map(()=>"?").join(",")})`,l),d=new Map(o.map((a,c)=>[a.rowid,c]));return await _((await N(p,i.readable)).sort((a,c)=>d.get(a.owner)-d.get(c.owner)||a.rowid-c.rowid),async a=>await j(n,e,i,s,a,w.get(a.rowid)??[]))}r(J,"loadCorpus");async function P(n,e,t){const o=(await f(n,"o.rowid = ?",[t.rowid]))[0];if(!o)throw new Error(`document ${t.id} has no documents row`);return await j(n,e,E(n,e,await m(n,e)),await h(n,e),o,await R(n,o))}r(P,"deliveryDocOf");async function q(n,e,t){const o=E(n,e,await m(n,e)),i=await h(n,e);return await _(await N(await f(n,"o.owner = ? AND d.unlisted = 0",[t.rowid]),o.readable),async s=>await j(n,e,o,i,s,await R(n,s)))}r(q,"listingCorpus");async function z(n,e){if(e.class!=="node")throw new Error(`nodeSubject needs a node reader, got ${e.class}`);const t=await C(e.node.id,[...e.repos,...e.projectRepos]);if(t===null)throw new Error(`no node ${e.node.id}`);return t}r(z,"nodeSubject");export{P as deliveryDocOf,b as deliveryLimitFor,q as listingCorpus,J as loadCorpus,z as nodeSubject,y as ownerHandle,H as typedLimitKey};
@@ -1,9 +1,3 @@
1
- /** The one-phase delivery transaction behind `POST /v1/nodes/:id/delivery`:
2
- * load the node's ledger, render the activity, record a `deliver` watch and a
3
- * `read` event for every document delivered at content, save the ledger. The
4
- * caller runs it inside one `withCanvasWrite`, so exposures, watches and
5
- * events land together or not at all. */
6
- import type { DatabaseSync } from 'node:sqlite';
7
1
  import { type ReposFn } from '../../graph/reader.js';
8
2
  import type { ObjectRow, Reader } from '../../graph/types.js';
9
3
  import type { DeliveryActivity, DeliveryCommandDTO } from '../../../api/dto/delivery.js';
@@ -11,6 +5,7 @@ import type { RefMeta } from '../../runtime/broker-protocol.js';
11
5
  import type { NodeConfigSubject } from '../subject-fields.js';
12
6
  import { type DeliveryPlan } from './plan.js';
13
7
  import { type DeliveredDoc } from './render-event.js';
8
+ import type { CanvasDb } from '../../canvas/db.js';
14
9
  export interface DeliveryRequestInput {
15
10
  activity: DeliveryActivity;
16
11
  subject?: string;
@@ -27,12 +22,12 @@ export interface DeliveryResult {
27
22
  }
28
23
  /** Record the content deliveries: a `deliver` watch at the delivered heads, a `read` event each,
29
24
  * and a `loaded` row in the analytics memory log (a full body that entered the context). */
30
- export declare function recordContentDelivery(db: DatabaseSync, reader: Reader, delivered: readonly DeliveredDoc[], reposFn?: ReposFn): void;
25
+ export declare function recordContentDelivery(db: CanvasDb, reader: Reader, delivered: readonly DeliveredDoc[], reposFn?: ReposFn): Promise<void>;
31
26
  /** Activities only a dry run performs: a live node's workspace-open arrives
32
27
  * inside its boot, and a document read goes through the read route. */
33
28
  export declare const DRY_RUN_ONLY: readonly DeliveryActivity[];
34
29
  /** One delivery for a live node. Call inside `withCanvasWrite`. */
35
- export declare function deliver(db: DatabaseSync, reader: Reader, req: DeliveryRequestInput): DeliveryResult;
30
+ export declare function deliver(db: CanvasDb, reader: Reader, req: DeliveryRequestInput): Promise<DeliveryResult>;
36
31
  /** A node that does not exist, described by what delivery reads of one:
37
32
  * the directory it would work in, its profile and app, and the fields rule
38
33
  * `if` conditions see. Every field but `cwd` has a default. */
@@ -50,27 +45,27 @@ export interface HypotheticalNode {
50
45
  }
51
46
  /** Fill a hypothetical node's unset fields from a live node, so `--node` with
52
47
  * `--cwd` or `--profile` starts from that node and dials away from it. */
53
- export declare function hypotheticalFrom(nodeId: string, h: Partial<HypotheticalNode>): HypotheticalNode;
48
+ export declare function hypotheticalFrom(nodeId: string, h: Partial<HypotheticalNode>): Promise<HypotheticalNode>;
54
49
  /** The reader and gate subject of a node that does not exist. Resolving its
55
50
  * app, profile and repos may create their owner objects, so call it only
56
51
  * inside a transaction that rolls back. */
57
- export declare function hypotheticalReader(db: DatabaseSync, h: HypotheticalNode): {
52
+ export declare function hypotheticalReader(db: CanvasDb, h: HypotheticalNode): Promise<{
58
53
  reader: Extract<Reader, {
59
54
  class: 'node';
60
55
  }>;
61
56
  subject: NodeConfigSubject;
62
- };
57
+ }>;
63
58
  /** A dry run for inspection: render against an empty ledger and record nothing.
64
59
  * `subjectOverride` replaces fields of the gate subject — the node's own, or
65
60
  * `baseSubject` for a hypothetical reader. */
66
- export declare function inspect(db: DatabaseSync, reader: Reader, req: DeliveryRequestInput, subjectOverride?: Partial<NodeConfigSubject>, baseSubject?: NodeConfigSubject): {
61
+ export declare function inspect(db: CanvasDb, reader: Reader, req: DeliveryRequestInput, subjectOverride?: Partial<NodeConfigSubject>, baseSubject?: NodeConfigSubject): Promise<{
67
62
  result: DeliveryResult;
68
63
  plan: DeliveryPlan | null;
69
- };
64
+ }>;
70
65
  /** Watched documents with a revision created after `since` that the node did not author (D8). */
71
- export declare function changedWhileDone(db: DatabaseSync, node: ObjectRow, since: string): Array<{
66
+ export declare function changedWhileDone(db: CanvasDb, node: ObjectRow, since: string): Promise<Array<{
72
67
  doc: ObjectRow;
73
68
  from: number | null;
74
69
  to: number;
75
70
  authors: string[];
76
- }>;
71
+ }>>;
@@ -1,6 +1,6 @@
1
- var L=Object.defineProperty;var a=(t,e)=>L(t,"name",{value:e,configurable:!0});import{prepared as v}from"../../sqlite-statements.js";import{dirname as F}from"node:path";import{clearLedger as $,demoteTranscript as M,freezePreferences as g,loadLedger as P,saveLedger as T}from"../../graph/exposures.js";import{recordWatch as H}from"../../graph/watches.js";import{publish as x}from"../../graph/events.js";import{viewOf as W}from"../../graph/names.js";import{checkoutsForCwd as y}from"../../graph/repo-sync/repos.js";import{liveLookups as Y,profileObject as U,viewRepos as B}from"../../graph/reader.js";import{ownerForGrantee as G}from"../../graph/objects.js";import{resolveName as J}from"../../graph/names.js";import{SCOPE_VOCABULARY as K}from"../../scopes.js";import{getNode as V}from"../../canvas/index.js";import{recordMemoryReadsIn as X}from"../../canvas/memory-reads.js";import{lookupProfile as z}from"../../profiles/manifest.js";import{getDefaultProfileId as Q}from"../../profiles/default-binding.js";import{effectiveScopes as Z,profileNameFor as q,scopeForCwd as ee}from"../subject-fields.js";import{spineDepth as te}from"../subject.js";import{appForNode as oe}from"../../canvas/node-agent-paths.js";import{interpolateNodePaths as ne}from"../../canvas/paths.js";import{readableProjectForScopes as re}from"../../spaces/permissions.js";import{ApiError as u}from"../../../api/errors.js";import{buildContextBearings as ie}from"../../runtime/bearings.js";import{deliveryDocOf as j,listingCorpus as se,loadCorpus as w,nodeSubject as N}from"./corpus.js";import{listingPrefixes as ce}from"./listings.js";import{planDelivery as de}from"./plan.js";import{renderEvent as O,renderExplicitRead as k}from"./render-event.js";import{renderConfigDelta as ae,renderKnowledge as le,renderPreferences as _,renderWorkspaceOpen as S}from"./render-boot.js";function f(t){if(t.class!=="node")throw new Error(`delivery needs a node reader, got ${t.class}`);return t}a(f,"nodeOf");const R=-1;function h(t){return t.node.rowid===R}a(h,"isHypothetical");function E(t,e){if(!h(e))return oe(e.node.id);const o=v(t,"SELECT external_id FROM identities WHERE object = ?").get(e.app.rowid);if(!o)throw new Error(`app object ${e.app.id} has no identity`);return o.external_id}a(E,"granteeOf");function pe(t,e,o,r=i=>y(t,i)){const i=f(e).node,d=new Set,n=new Date().toISOString(),s=[];for(const{doc:c,level:l}of o)l!=="content"||d.has(c.object.rowid)||(d.add(c.object.rowid),H(t,i,c.object,"deliver",{readHeadsKey:c.headsKey}),x(t,{event:"read",object:c.object,actor:i,attrs:{}},r),s.push({name:c.name,scope:c.ownerHandle,at:n,type:"loaded"}));h(f(e))||X(t,i.id,s)}a(pe,"recordContentDelivery");function C(t,e,o){const r=y(t,F(o)).filter(i=>!e.repos.some(d=>d.rowid===i.repo.rowid));return r.length===0?e:{...e,repos:[...e.repos,...r.map(i=>i.repo)],checkouts:[...e.checkouts,...r]}}a(C,"fileReadReader");function ue(t,e,o){const r=E(t,e);if(!(o.startsWith("/")&&(process.platform!=="linux"&&r==="app:terminal"||re(o,r,e.scopes??[],null))))throw new u(403,"scope_missing","read file is outside the run mounts")}a(ue,"assertReadableFile");function me(t){const e=f(t.reader),o=e.node,r=E(t.db,e),i=w(t.db,t.reader,["slash-command"]),d=i.map(n=>{const s=n.body();return{name:n.displayName,command_name:n.displayName,description:n.preview,canonical_body:s,execution_body:ne(s,o.id,r)}});return{docs:i,commands:d}}a(me,"slashCommands");function fe(t){if(t.shipped)return"builtin";switch(t.owner.type){case"node":return"node";case"repo":return"project";case"profile":return"profile";default:return"user"}}a(fe,"scopeOf");function we(t,e){const o=[],r=new Set;for(const i of W(t,e)){const d=se(t,e,i);for(const n of d){o.push({name:n.displayName,kind:n.kind,scope:fe(n),shortForm:n.preview,gatewayVisible:!n.shipped}),r.add(n.displayName);const s=n.displayName===n.name?"":`${n.ownerHandle}/`;for(const c of ce(d,n.name))r.add(`${s}${c}`)}}return{refs:o,names:[...r]}}a(we,"composerNames");function D(t,e){const o=f(t.reader),{db:r,ledger:i}=t,d=a(()=>{if(typeof e.subject!="string"||e.subject==="")throw new u(400,"usage",`delivery activity ${e.activity} requires a subject`);return e.subject},"requireSubject");switch(e.activity){case"boot":{if(e.inherited===!0){for(const[c,l]of i.objects)if(l.transcript===void 0)i.objects.delete(c);else{const{system:p,...m}=l;i.objects.set(c,m)}for(const[c,l]of i.listed)l.transcript===void 0?i.listed.delete(c):i.listed.set(c,{transcript:l.transcript});return i.preferenceSnapshot=null,{result:{content:"",inherited:!0},delivered:[]}}const n=h(o)?ve(t):ie(o.node.id,t),s=_({...t,channel:"system"});return g(i,s.content),{result:{content:n.content},delivered:[...n.delivered,...s.delivered]}}case"system-prompt":{if(i.preferenceSnapshot!==null)return{result:{content:i.preferenceSnapshot},delivered:[]};const n=_({...t,channel:"system"});return{result:{content:g(i,n.content)},delivered:n.delivered}}case"compact":{for(const n of w(r,o,["pre-command"]))M(i,n.object.rowid);return{result:{content:""},delivered:[]}}case"persona":{const n=ae(t);return{result:{content:n.content},delivered:n.delivered}}case"file-read":{const n=d();ue(r,o,n);const s=C(r,o,n),c={...t,reader:s},l=O(c,"file-read",{absoluteFile:n},w(r,s,["file-read"]));return{result:{content:l.content},delivered:l.delivered}}case"command":case"pre-command":{const n=O(t,e.activity,{command:d()});return{result:{content:n.content},delivered:n.delivered}}case"slash-command":{const{docs:n,commands:s}=me(t);if(e.subject===void 0||e.subject==="")return{result:{content:"",commands:s},delivered:[]};const c=n.findIndex(m=>m.displayName===e.subject||m.name===e.subject);if(c<0)throw new u(404,"not_found",`no slash command named ${e.subject}`);const l=n[c],p=k(t,l,!0);return{result:{content:"",execution_body:s[c].execution_body,blocks:p.attachments===""?[]:[p.attachments]},delivered:[{doc:l,level:"content"},...p.delivered]}}case"workspace-open":{const n=S(t);return{result:{content:n.content},delivered:n.delivered}}case"document-read":{const n=I(r,o,d()),s=k(t,j(r,o,n),!0);return{result:{content:s.attachments},delivered:s.delivered}}case"names":return{result:{content:"",...we(r,o)},delivered:[]};default:throw new u(400,"usage",`unknown delivery activity ${String(e.activity)}`)}}a(D,"render");function ve(t){const e=le(t),o=S(t);return{content:[e.content,o.content].filter(r=>r!=="").join(`
2
- `),delivered:[...e.delivered,...o.delivered]}}a(ve,"hypotheticalBearings");function I(t,e,o){const r=J(t,e,o);if("object"in r&&r.object.type==="document")return r.object;throw"ambiguous"in r?new u(409,"ambiguous",`${o} names ${r.ambiguous.length} documents; name one as <type>:<owner>/<name>`):new u(404,"not_found",`no document ${o} the reader can read`)}a(I,"readDocument");const ye=["workspace-open","document-read"];function Ve(t,e,o){if(ye.includes(o.activity))throw new u(400,"usage",`delivery activity ${o.activity} is available to a dry run only`);const r=f(e).node;o.activity==="boot"&&o.inherited!==!0&&$(t,r.rowid);const i=P(t,r.rowid),d={db:t,reader:e,subject:N(t,e),ledger:i,channel:"transcript"},{result:n,delivered:s}=D(d,o);return pe(t,e,s),T(t,i),n}a(Ve,"deliver");const he={boot:"boot","workspace-open":"workspace-open","file-read":"file-read","document-read":"document-read",command:"command","pre-command":"pre-command","slash-command":"slash-command"};function Xe(t,e){const o=V(t);if(o===null)throw new u(404,"not_found",`no node ${t}`);return{cwd:e.cwd??o.cwd,profile:e.profile!==void 0?e.profile:o.profile_id,grantee:e.grantee??o.grantee,kind:e.kind??o.kind,mode:e.mode??o.mode,lifecycle:e.lifecycle??o.lifecycle,hasManager:e.hasManager??(o.parent??null)!==null,depth:e.depth??te(t)}}a(Xe,"hypotheticalFrom");function be(t,e){if(t===null)return null;if(t===void 0||t==="")return Q(e);const o=z(t);if(o.kind!=="resolved"){const r=`no profile ${t}`;throw new u(404,"not_found",r,{error:"not_found",message:r,next:"List profile ids and names with `crtr profile list`."})}return o.entry.profileId}a(be,"resolveProfileId");function ze(t,e){const o=G(t,e.grantee??"app:terminal"),r=be(e.profile,e.cwd),i=B(e.cwd,r,p=>y(t,p),Y(t)),{repos:d}=i,n=e.mode??"base",c={class:"node",node:{rowid:R,id:"hypothetical",type:"node",kind:e.kind??"general",owner:o.rowid,privacy:"private",name:"hypothetical",preview:"",created_at:new Date(0).toISOString(),deleted_at:null},app:o,scopes:[...K],cwd:e.cwd,...i,profile:r===null?null:U(t,r,o)},l={kind:e.kind??"general",mode:n,lifecycle:e.lifecycle??(n==="orchestrator"?"resident":"terminal"),hasManager:e.hasManager??!0,cwd:e.cwd,scope:ee(e.cwd),orchestration:{depth:e.depth??0},profile:q(r),scopes:Z(null),repo:[...d,...i.projectRepos].map(p=>p.name)};return{reader:c,subject:l}}a(ze,"hypotheticalReader");function Qe(t,e,o,r,i){const n={node:f(e).node.rowid,preferenceSnapshot:null,objects:new Map,listed:new Map},s={...i??N(t,e),...r},c={db:t,reader:e,subject:s,ledger:n,channel:"transcript"},{result:l}=D(c,o),p=he[o.activity];let m=null;if(p!==void 0){const A=o.activity==="file-read"?{absoluteFile:o.subject}:o.activity==="command"||o.activity==="pre-command"?{command:o.subject}:o.activity==="document-read"&&o.subject!==void 0?{doc:j(t,e,I(t,e,o.subject))}:{},b=o.activity==="file-read"&&o.subject!==void 0?C(t,f(e),o.subject):e;m=de(t,s,b,w(t,b,[p]),p,A)}return{result:l,plan:m}}a(Qe,"inspect");function Ze(t,e,o){return v(t,`SELECT o.*, MAX(r.number) AS to_seq, GROUP_CONCAT(DISTINCT a.id) AS authors
1
+ var I=Object.defineProperty;var d=(t,e)=>I(t,"name",{value:e,configurable:!0});import{dirname as L}from"node:path";import{clearLedger as F,demoteTranscript as $,freezePreferences as b,loadLedger as M,saveLedger as P}from"../../graph/exposures.js";import{recordWatch as T}from"../../graph/watches.js";import{publish as H}from"../../graph/events.js";import{viewOf as x}from"../../graph/names.js";import{checkoutsForCwd as y}from"../../graph/repo-sync/repos.js";import{liveLookups as W,profileObject as Y,viewRepos as U}from"../../graph/reader.js";import{ownerForGrantee as B}from"../../graph/objects.js";import{resolveName as G}from"../../graph/names.js";import{SCOPE_VOCABULARY as J}from"../../scopes.js";import{getNode as K}from"../../canvas/index.js";import{recordMemoryReadsIn as V}from"../../canvas/memory-reads.js";import{lookupProfile as X}from"../../profiles/manifest.js";import{getDefaultProfileId as z}from"../../profiles/default-binding.js";import{effectiveScopes as Q,profileNameFor as Z,scopeForCwd as q}from"../subject-fields.js";import{spineDepth as ee}from"../subject.js";import{appForNode as te}from"../../canvas/node-agent-paths.js";import{interpolateNodePaths as oe}from"../../canvas/paths.js";import{readableProjectForScopes as ne}from"../../spaces/permissions.js";import{ApiError as u}from"../../../api/errors.js";import{buildContextBearings as re}from"../../runtime/bearings.js";import{deliveryDocOf as g,listingCorpus as ie,loadCorpus as w,nodeSubject as j}from"./corpus.js";import{listingPrefixes as ae}from"./listings.js";import{planDelivery as se}from"./plan.js";import{renderEvent as N,renderExplicitRead as O}from"./render-event.js";import{renderConfigDelta as ce,renderKnowledge as de,renderPreferences as k,renderWorkspaceOpen as _}from"./render-boot.js";import{mapAsync as le}from"../../async-array.js";function f(t){if(t.class!=="node")throw new Error(`delivery needs a node reader, got ${t.class}`);return t}d(f,"nodeOf");const R=-1;function v(t){return t.node.rowid===R}d(v,"isHypothetical");async function S(t,e){if(!v(e))return await te(e.node.id);const o=await t.prepare("SELECT external_id FROM identities WHERE object = ?").get(e.app.rowid);if(!o)throw new Error(`app object ${e.app.id} has no identity`);return o.external_id}d(S,"granteeOf");async function pe(t,e,o,r=async i=>await y(t,i)){const i=f(e).node,c=new Set,n=new Date().toISOString(),a=[];for(const{doc:s,level:l}of o)l!=="content"||c.has(s.object.rowid)||(c.add(s.object.rowid),await T(t,i,s.object,"deliver",{readHeadsKey:s.headsKey}),await H(t,{event:"read",object:s.object,actor:i,attrs:{}},r),a.push({name:s.name,scope:s.ownerHandle,at:n,type:"loaded"}));v(f(e))||await V(t,i.id,a)}d(pe,"recordContentDelivery");async function E(t,e,o){const r=(await y(t,L(o))).filter(i=>!e.repos.some(c=>c.rowid===i.repo.rowid));return r.length===0?e:{...e,repos:[...e.repos,...r.map(i=>i.repo)],checkouts:[...e.checkouts,...r]}}d(E,"fileReadReader");async function ue(t,e,o){const r=await S(t,e);if(!(o.startsWith("/")&&(process.platform!=="linux"&&r==="app:terminal"||ne(o,r,e.scopes??[],null))))throw new u(403,"scope_missing","read file is outside the run mounts")}d(ue,"assertReadableFile");async function me(t){const e=f(t.reader),o=e.node,r=await S(t.db,e),i=await w(t.db,t.reader,["slash-command"]),c=i.map(n=>{const a=n.body();return{name:n.displayName,command_name:n.displayName,description:n.preview,canonical_body:a,execution_body:oe(a,o.id,r)}});return{docs:i,commands:c}}d(me,"slashCommands");function fe(t){if(t.shipped)return"builtin";switch(t.owner.type){case"node":return"node";case"repo":return"project";case"profile":return"profile";default:return"user"}}d(fe,"scopeOf");async function we(t,e){const o=[],r=new Set;for(const i of await x(t,e)){const c=await ie(t,e,i);for(const n of c){o.push({name:n.displayName,kind:n.kind,scope:fe(n),shortForm:n.preview,gatewayVisible:!n.shipped}),r.add(n.displayName);const a=n.displayName===n.name?"":`${n.ownerHandle}/`;for(const s of ae(c,n.name))r.add(`${a}${s}`)}}return{refs:o,names:[...r]}}d(we,"composerNames");async function C(t,e){const o=f(t.reader),{db:r,ledger:i}=t,c=d(()=>{if(typeof e.subject!="string"||e.subject==="")throw new u(400,"usage",`delivery activity ${e.activity} requires a subject`);return e.subject},"requireSubject");switch(e.activity){case"boot":{if(e.inherited===!0){for(const[s,l]of i.objects)if(l.transcript===void 0)i.objects.delete(s);else{const{system:p,...m}=l;i.objects.set(s,m)}for(const[s,l]of i.listed)l.transcript===void 0?i.listed.delete(s):i.listed.set(s,{transcript:l.transcript});return i.preferenceSnapshot=null,{result:{content:"",inherited:!0},delivered:[]}}const n=v(o)?await ye(t):await re(o.node.id,t),a=await k({...t,channel:"system"});return b(i,a.content),{result:{content:n.content},delivered:[...n.delivered,...a.delivered]}}case"system-prompt":{if(i.preferenceSnapshot!==null)return{result:{content:i.preferenceSnapshot},delivered:[]};const n=await k({...t,channel:"system"});return{result:{content:b(i,n.content)},delivered:n.delivered}}case"compact":{for(const n of await w(r,o,["pre-command"]))$(i,n.object.rowid);return{result:{content:""},delivered:[]}}case"persona":{const n=await ce(t);return{result:{content:n.content},delivered:n.delivered}}case"file-read":{const n=c();await ue(r,o,n);const a=await E(r,o,n),s={...t,reader:a},l=await N(s,"file-read",{absoluteFile:n},await w(r,a,["file-read"]));return{result:{content:l.content},delivered:l.delivered}}case"command":case"pre-command":{const n=await N(t,e.activity,{command:c()});return{result:{content:n.content},delivered:n.delivered}}case"slash-command":{const{docs:n,commands:a}=await me(t);if(e.subject===void 0||e.subject==="")return{result:{content:"",commands:a},delivered:[]};const s=n.findIndex(m=>m.displayName===e.subject||m.name===e.subject);if(s<0)throw new u(404,"not_found",`no slash command named ${e.subject}`);const l=n[s],p=await O(t,l,!0);return{result:{content:"",execution_body:a[s].execution_body,blocks:p.attachments===""?[]:[p.attachments]},delivered:[{doc:l,level:"content"},...p.delivered]}}case"workspace-open":{const n=await _(t);return{result:{content:n.content},delivered:n.delivered}}case"document-read":{const n=await D(r,o,c()),a=await O(t,await g(r,o,n),!0);return{result:{content:a.attachments},delivered:a.delivered}}case"names":return{result:{content:"",...await we(r,o)},delivered:[]};default:throw new u(400,"usage",`unknown delivery activity ${String(e.activity)}`)}}d(C,"render");async function ye(t){const e=await de(t),o=await _(t);return{content:[e.content,o.content].filter(r=>r!=="").join(`
2
+ `),delivered:[...e.delivered,...o.delivered]}}d(ye,"hypotheticalBearings");async function D(t,e,o){const r=await G(t,e,o);if("object"in r&&r.object.type==="document")return r.object;throw"ambiguous"in r?new u(409,"ambiguous",`${o} names ${r.ambiguous.length} documents; name one as <type>:<owner>/<name>`):new u(404,"not_found",`no document ${o} the reader can read`)}d(D,"readDocument");const ve=["workspace-open","document-read"];async function Ve(t,e,o){if(ve.includes(o.activity))throw new u(400,"usage",`delivery activity ${o.activity} is available to a dry run only`);const r=f(e).node;o.activity==="boot"&&o.inherited!==!0&&await F(t,r.rowid);const i=await M(t,r.rowid),c={db:t,reader:e,subject:await j(t,e),ledger:i,channel:"transcript"},{result:n,delivered:a}=await C(c,o);return await pe(t,e,a),await P(t,i),n}d(Ve,"deliver");const he={boot:"boot","workspace-open":"workspace-open","file-read":"file-read","document-read":"document-read",command:"command","pre-command":"pre-command","slash-command":"slash-command"};async function Xe(t,e){const o=await K(t);if(o===null)throw new u(404,"not_found",`no node ${t}`);return{cwd:e.cwd??o.cwd,profile:e.profile!==void 0?e.profile:o.profile_id,grantee:e.grantee??o.grantee,kind:e.kind??o.kind,mode:e.mode??o.mode,lifecycle:e.lifecycle??o.lifecycle,hasManager:e.hasManager??(o.parent??null)!==null,depth:e.depth??await ee(t)}}d(Xe,"hypotheticalFrom");function be(t,e){if(t===null)return null;if(t===void 0||t==="")return z(e);const o=X(t);if(o.kind!=="resolved"){const r=`no profile ${t}`;throw new u(404,"not_found",r,{error:"not_found",message:r,next:"List profile ids and names with `crtr profile list`."})}return o.entry.profileId}d(be,"resolveProfileId");async function ze(t,e){const o=await B(t,e.grantee??"app:terminal"),r=be(e.profile,e.cwd),i=await U(e.cwd,r,async p=>await y(t,p),W(t)),{repos:c}=i,n=e.mode??"base",s={class:"node",node:{rowid:R,id:"hypothetical",type:"node",kind:e.kind??"general",owner:o.rowid,privacy:"private",name:"hypothetical",preview:"",created_at:new Date(0).toISOString(),deleted_at:null},app:o,scopes:[...J],cwd:e.cwd,...i,profile:r===null?null:await Y(t,r,o)},l={kind:e.kind??"general",mode:n,lifecycle:e.lifecycle??(n==="orchestrator"?"resident":"terminal"),hasManager:e.hasManager??!0,cwd:e.cwd,scope:q(e.cwd),orchestration:{depth:e.depth??0},profile:Z(r),scopes:Q(null),repo:[...c,...i.projectRepos].map(p=>p.name)};return{reader:s,subject:l}}d(ze,"hypotheticalReader");async function Qe(t,e,o,r,i){const n={node:f(e).node.rowid,preferenceSnapshot:null,objects:new Map,listed:new Map},a={...i??await j(t,e),...r},s={db:t,reader:e,subject:a,ledger:n,channel:"transcript"},{result:l}=await C(s,o),p=he[o.activity];let m=null;if(p!==void 0){const A=o.activity==="file-read"?{absoluteFile:o.subject}:o.activity==="command"||o.activity==="pre-command"?{command:o.subject}:o.activity==="document-read"&&o.subject!==void 0?{doc:await g(t,e,await D(t,e,o.subject))}:{},h=o.activity==="file-read"&&o.subject!==void 0?await E(t,f(e),o.subject):e;m=await se(t,a,h,await w(t,h,[p]),p,A)}return{result:l,plan:m}}d(Qe,"inspect");async function Ze(t,e,o){const r=await t.prepare(`SELECT o.*, MAX(r.number) AS to_seq, GROUP_CONCAT(DISTINCT a.id) AS authors
3
3
  FROM watches w JOIN objects o ON o.rowid = w.object AND o.type = 'document' AND o.deleted_at IS NULL
4
4
  JOIN revisions r ON r.document = o.rowid LEFT JOIN objects a ON a.rowid = r.author
5
5
  WHERE w.watcher = ? AND r.created_at > ? AND (r.author IS NULL OR r.author != ?)
6
- GROUP BY o.rowid ORDER BY o.rowid`).all(e.rowid,o,e.rowid).map(({to_seq:i,authors:d,...n})=>{const s=v(t,"SELECT MAX(number) AS seq FROM revisions WHERE document = ? AND created_at <= ?").get(n.rowid,o);return{doc:n,from:s.seq,to:i,authors:d===null?[]:d.split(",")}})}a(Ze,"changedWhileDone");export{ye as DRY_RUN_ONLY,Ze as changedWhileDone,Ve as deliver,Xe as hypotheticalFrom,ze as hypotheticalReader,Qe as inspect,pe as recordContentDelivery};
6
+ GROUP BY o.rowid ORDER BY o.rowid`).all(e.rowid,o,e.rowid);return await le(r,async({to_seq:i,authors:c,...n})=>{const a=await t.prepare("SELECT MAX(number) AS seq FROM revisions WHERE document = ? AND created_at <= ?").get(n.rowid,o);return{doc:n,from:a.seq,to:i,authors:c===null?[]:c.split(",")}})}d(Ze,"changedWhileDone");export{ve as DRY_RUN_ONLY,Ze as changedWhileDone,Ve as deliver,Xe as hypotheticalFrom,ze as hypotheticalReader,Qe as inspect,pe as recordContentDelivery};
@@ -1,20 +1,10 @@
1
- /** The row-backed delivery planner: for one activity it decides, per corpus
2
- * document, which rule matched and at what level it delivers. It renders
3
- * nothing and writes nothing; the ledger and renderers are downstream.
4
- *
5
- * - The profile's delivery limit caps `boot` and `workspace-open` only, and
6
- * never the node's own documents.
7
- * - At `boot` a node's own document with no boot rule is raised to `name`.
8
- * - `boot` and `workspace-open` keep bare-name shadowing: the first document
9
- * in view order with a bare name wins it (per boot block), as `[[name]]`
10
- * resolves. Every other activity delivers every matching document. */
11
- import type { DatabaseSync } from 'node:sqlite';
12
1
  import type { RuleRow } from '../../graph/rules.js';
13
2
  import type { Reader, RuleOn } from '../../graph/types.js';
14
3
  import { type Rung } from '../schema.js';
15
4
  import type { NodeConfigSubject } from '../subject-fields.js';
16
5
  import { type GateOutcome } from './match.js';
17
6
  import type { DeliveryDoc } from './types.js';
7
+ import type { CanvasDb } from '../../canvas/db.js';
18
8
  export type { GateOutcome } from './match.js';
19
9
  /** What the activity exposes. An activity invoked without its field matches nothing. */
20
10
  export interface DeliveryPayload {
@@ -64,4 +54,4 @@ export interface DeliveryPlan {
64
54
  /** Which boot block a record belongs to: the node's own documents ride in the knowledge block whatever their kind. */
65
55
  export declare function bootPartitionOf(record: Pick<DeliveryRecord, 'doc'>): 'knowledge' | 'preference';
66
56
  /** Plan one activity over an already-loaded corpus (view order, from `loadCorpus`). */
67
- export declare function planDelivery(db: DatabaseSync, subject: NodeConfigSubject | null, reader: Reader, corpus: readonly DeliveryDoc[], on: RuleOn, payload?: DeliveryPayload): DeliveryPlan;
57
+ export declare function planDelivery(db: CanvasDb, subject: NodeConfigSubject | null, reader: Reader, corpus: readonly DeliveryDoc[], on: RuleOn, payload?: DeliveryPayload): Promise<DeliveryPlan>;
@@ -1,3 +1,3 @@
1
- var h=Object.defineProperty;var d=(e,i)=>h(e,"name",{value:i,configurable:!0});import{prepared as m}from"../../sqlite-statements.js";import{dirname as w}from"node:path";import{parseFrontmatterGeneric as g}from"../../frontmatter.js";import{readText as R,realpathOrSelf as b}from"../../fs-utils.js";import{checkoutChain as k}from"../../graph/repo-sync/identity.js";import{minRung as N,rungAtLeast as O,rungRank as p}from"../schema.js";import{ruleConstraintsFit as F,ruleGate as E}from"./match.js";function v(e){return e.doc.ownNode?"knowledge":e.doc.kind}d(v,"bootPartitionOf");function B(e,i,t,s,o,n={}){const r=x(e,o,n),u=(o==="document-read"&&n.doc!==void 0?s.filter(c=>c.object.rowid!==n.doc.object.rowid):s).map(c=>S(c,i,o,r));return C(o,u),{on:o,subject:i,reader:t,docs:u}}d(B,"planDelivery");function x(e,i,t){if(i!=="file-read"||t.absoluteFile===void 0)return t;const s=b(t.absoluteFile);return{...t,absoluteFile:s,readFrontmatter:t.readFrontmatter??j(s),repoRoots:A(e,s)}}d(x,"resolvePayload");function j(e){if(!/\.(md|mdx|markdown)$/i.test(e))return{};try{return g(R(e)).data??{}}catch{return{}}}d(j,"readFileFrontmatter");function A(e,i){const t=new Map,s=m(e,`SELECT o.rowid FROM identities i JOIN objects o ON o.rowid = i.object
2
- WHERE o.type = 'repo' AND i.scheme = ? AND i.external_id = ?`);for(const n of k(w(i))){if(!n.ok)break;const r=s.get(n.scheme,n.externalId);r!==void 0&&!t.has(r.rowid)&&t.set(r.rowid,n.root)}const o=m(e,`SELECT o.rowid, i.external_id AS path FROM identities i JOIN objects o ON o.rowid = i.object
3
- WHERE o.type = 'repo' AND i.scheme = 'local-path'`).all();for(const{rowid:n,path:r}of o)!t.has(n)&&i.startsWith(r.endsWith("/")?r:`${r}/`)&&t.set(n,r);return t}d(A,"repoRootsOf");function S(e,i,t,s){const o=e.rules.filter(a=>a.on===t).map(a=>{const f=E(a,i);return{rule:a,gate:f,matched:f.pass&&F(a,e,t,s)}});let n=null;for(const{rule:a,matched:f}of o)f&&(n===null||p(a.deliver)>p(n.deliver))&&(n=a);const r=n?.deliver??"none",l=(t==="boot"||t==="workspace-open")&&!e.ownNode?e.limit:null,u=l===null?r:N(r,l),c=t==="boot"&&e.ownNode&&o.length===0?"name":u;return{doc:e,authoredRules:o,matchedRule:n,authoredRung:r,limit:l,cappedRung:u,ruleGate:o.length===0?null:n!==null?{pass:!0}:o.find(a=>!a.gate.pass)?.gate??{pass:!0},finalRung:c,winner:!1,shadowedBy:null}}d(S,"decide");function W(e,i){if(i==="boot"){const t=e.authoredRules.length>0&&e.authoredRules.every(s=>!s.gate.pass);return e.limit!=="none"&&!t}return O(e.finalRung,"name")}d(W,"holdsName");function C(e,i){const t=e==="boot"||e==="workspace-open",s=new Map;for(const o of i){if(!W(o,e))continue;if(!t){o.winner=!0;continue}const n=e==="boot"?`${v(o)}:${o.doc.name}`:o.doc.name,r=s.get(n);r===void 0?(s.set(n,o),o.winner=!0):o.shadowedBy=r.doc}}d(C,"resolveWinners");export{v as bootPartitionOf,B as planDelivery};
1
+ var p=Object.defineProperty;var d=(e,i)=>p(e,"name",{value:i,configurable:!0});import{dirname as h}from"node:path";import{parseFrontmatterGeneric as w}from"../../frontmatter.js";import{readText as g,realpathOrSelf as R}from"../../fs-utils.js";import{checkoutChain as b}from"../../graph/repo-sync/identity.js";import{minRung as k,rungAtLeast as N,rungRank as m}from"../schema.js";import{ruleConstraintsFit as O,ruleGate as F}from"./match.js";function E(e){return e.doc.ownNode?"knowledge":e.doc.kind}d(E,"bootPartitionOf");async function L(e,i,t,a,o,n={}){const r=await v(e,o,n),c=(o==="document-read"&&n.doc!==void 0?a.filter(u=>u.object.rowid!==n.doc.object.rowid):a).map(u=>j(u,i,o,r));return W(o,c),{on:o,subject:i,reader:t,docs:c}}d(L,"planDelivery");async function v(e,i,t){if(i!=="file-read"||t.absoluteFile===void 0)return t;const a=R(t.absoluteFile);return{...t,absoluteFile:a,readFrontmatter:t.readFrontmatter??x(a),repoRoots:await y(e,a)}}d(v,"resolvePayload");function x(e){if(!/\.(md|mdx|markdown)$/i.test(e))return{};try{return w(g(e)).data??{}}catch{return{}}}d(x,"readFileFrontmatter");async function y(e,i){const t=new Map,a=e.prepare(`SELECT o.rowid FROM identities i JOIN objects o ON o.rowid = i.object
2
+ WHERE o.type = 'repo' AND i.scheme = ? AND i.external_id = ?`);for(const n of b(h(i))){if(!n.ok)break;const r=await a.get(n.scheme,n.externalId);r!==void 0&&!t.has(r.rowid)&&t.set(r.rowid,n.root)}const o=await e.prepare(`SELECT o.rowid, i.external_id AS path FROM identities i JOIN objects o ON o.rowid = i.object
3
+ WHERE o.type = 'repo' AND i.scheme = 'local-path'`).all();for(const{rowid:n,path:r}of o)!t.has(n)&&i.startsWith(r.endsWith("/")?r:`${r}/`)&&t.set(n,r);return t}d(y,"repoRootsOf");function j(e,i,t,a){const o=e.rules.filter(s=>s.on===t).map(s=>{const f=F(s,i);return{rule:s,gate:f,matched:f.pass&&O(s,e,t,a)}});let n=null;for(const{rule:s,matched:f}of o)f&&(n===null||m(s.deliver)>m(n.deliver))&&(n=s);const r=n?.deliver??"none",l=(t==="boot"||t==="workspace-open")&&!e.ownNode?e.limit:null,c=l===null?r:k(r,l),u=t==="boot"&&e.ownNode&&o.length===0?"name":c;return{doc:e,authoredRules:o,matchedRule:n,authoredRung:r,limit:l,cappedRung:c,ruleGate:o.length===0?null:n!==null?{pass:!0}:o.find(s=>!s.gate.pass)?.gate??{pass:!0},finalRung:u,winner:!1,shadowedBy:null}}d(j,"decide");function A(e,i){if(i==="boot"){const t=e.authoredRules.length>0&&e.authoredRules.every(a=>!a.gate.pass);return e.limit!=="none"&&!t}return N(e.finalRung,"name")}d(A,"holdsName");function W(e,i){const t=e==="boot"||e==="workspace-open",a=new Map;for(const o of i){if(!A(o,e))continue;if(!t){o.winner=!0;continue}const n=e==="boot"?`${E(o)}:${o.doc.name}`:o.doc.name,r=a.get(n);r===void 0?(a.set(n,o),o.winner=!0):o.shadowedBy=r.doc}}d(W,"resolveWinners");export{E as bootPartitionOf,L as planDelivery};
@@ -7,14 +7,14 @@ export interface BootRender {
7
7
  * sub-persona menu as operating protocol, then `<memory kind="preference">`
8
8
  * holding the usage guidance, the other preference bodies and the catalog.
9
9
  * Frozen once per session: a later call returns the frozen block unchanged. */
10
- export declare function renderPreferences(ctx: RenderContext): BootRender;
10
+ export declare function renderPreferences(ctx: RenderContext): Promise<BootRender>;
11
11
  /** The `<memory kind="knowledge">` block of the first message: knowledge
12
12
  * documents plus the node's own documents of any kind. '' when empty. */
13
- export declare function renderKnowledge(ctx: RenderContext): BootRender;
13
+ export declare function renderKnowledge(ctx: RenderContext): Promise<BootRender>;
14
14
  /** Workspace-open deliveries for the reader's repos, outermost repo first. The
15
15
  * nearest owner wins a shared name; display runs general to specific. */
16
- export declare function renderWorkspaceOpen(ctx: RenderContext): BootRender;
16
+ export declare function renderWorkspaceOpen(ctx: RenderContext): Promise<BootRender>;
17
17
  /** What a configuration change newly exposes: boot winners not yet held at
18
18
  * their level, as protocol prose, a preference block and a knowledge block
19
19
  * (each dropped when empty). Never touches the frozen preference block. */
20
- export declare function renderConfigDelta(ctx: RenderContext): BootRender;
20
+ export declare function renderConfigDelta(ctx: RenderContext): Promise<BootRender>;
@@ -1,35 +1,35 @@
1
- var Y=Object.defineProperty;var l=(e,s)=>Y(e,"name",{value:s,configurable:!0});import{heldAtOrAbove as $,hold as _,freezePreferences as F}from"../../graph/exposures.js";import{interpolateNodePaths as z}from"../../canvas/paths.js";import{buildSubPersonaMenu as B}from"./sub-persona-menu.js";import{rungAtLeast as k}from"../schema.js";import{loadCorpus as A}from"./corpus.js";import{listingPrefixes as H}from"./listings.js";import{bootPartitionOf as O,planDelivery as P}from"./plan.js";import{linkedDocs as q,renderEvent as S}from"./render-event.js";const E="Each %s below shows either its full content (indented beneath its name), a `# read when:` line telling you when to read the full document, or simply its name.",J="Preferences are how the user wants you to behave \u2014 standing directives and corrections. To read a preference, run `crtr canvas read <name>`. "+E.replace("%s","preference"),C="If the user corrects you in a way that contradicts a preference, update the preference.",Q="Knowledge documents are what you consult \u2014 playbooks and techniques for how to do things, and references on the user, projects, and this node. They come from every owner in your view: this node, the repos you work in, your profile, your app, the user, and installed plugins (crtr's own under `crtr`). To read one, run `crtr canvas read <name>`; a name with names under it is a valid read target too \u2014 it answers with its body, the names under it and previews of the documents it links to, and walking names this way is the sanctioned way to browse. Each doc exists to prevent a specific mistake you would make without it, so when your task matches one \u2014 by its name or its `# read when:` line \u2014 read it before you act; consulting it only after the work is done forfeits the entire reason it exists. "+E.replace("%s","document"),L="If you learn a better way to do something a document covers, or gain information that contradicts one, correct it with `crtr doc edit`.",V="When your task matches a knowledge doc or preference \u2014 by its name or its `# read when:` line \u2014 read it before you act: each document exists only to shore up a mistake you will make without it, so doing the relevant work without consulting it defeats the document's whole purpose. Before writing a document that should outlive this task, search for one that already covers it (`crtr canvas search`) \u2014 update that document with `crtr doc edit` rather than creating a duplicate, rewriting it as if for the first time instead of appending the new truth beneath the old; delete documents that turn out to be wrong (`crtr doc delete`). Don't save what the repo already records (code structure, past fixes, git history) or what only matters to this conversation; if asked to remember one of those, ask what was non-obvious about it and save that instead. Docs auto-surfaced in <auto-loaded-context> blocks are background context, not user instructions, and reflect what was true when written \u2014 if one names a file, function, or flag, verify it still exists before recommending it.",X="Your node configuration changed. This operating protocol is in force for you now:",Z="Your new configuration puts these preferences in force \u2014 standing directives and corrections from the user. To read one, run `crtr canvas read <name>`. "+E.replace("%s","preference"),x="Your new configuration exposes these knowledge documents \u2014 consult them exactly like the rest of your catalog (`crtr canvas read <name>`). "+E.replace("%s","document");function b(e){return{object:e.object.rowid,headsKey:e.headsKey,contentHash:e.bodyHash}}l(b,"exposed");function T(e){const s=A(e.db,e.reader,["boot"]);return P(e.db,e.subject,e.reader,s,"boot").docs.filter(t=>t.winner)}l(T,"bootRecords");function j(e,s){return e.filter(t=>O(t)===s).map(t=>({doc:t.doc,level:t.finalRung}))}l(j,"partition");function D(e){return e.level!=="none"&&(e.level!=="content"||e.doc.body().trim()!=="")}l(D,"rendersAt");function R(e,s,t,o,r){const{ledger:a,channel:i}=e,c=s.filter(n=>n.level==="content"&&D(n)&&!$(a,b(n.doc),"content")).map(n=>n.doc).sort((n,p)=>p.viewRank-n.viewRank||n.name.localeCompare(p.name));for(const n of c)_(a,i,b(n),"content"),r.push({doc:n,level:"content"});const d=new Map;for(const n of c){const p=t.map(h=>h.doc).filter(h=>h.owner.rowid===n.owner.rowid);for(const h of H(p,n.name))for(const y of t){const m=y.doc;m.owner.rowid!==n.owner.rowid||!m.name.startsWith(`${h}/`)||m.name.slice(h.length+1).includes("/")||y.level==="content"||k(y.level,"preview")||m.unlisted||!m.ownNode&&!k(m.limit,"preview")||$(a,b(m),"preview")||d.set(m.object.rowid,{doc:m,level:"preview",cause:"directory listing attached to content delivery"})}}const u=new Map(t.map(n=>[n.doc.object.rowid,n])),v=new Set(c.map(n=>n.object.rowid));for(const n of c)for(const p of q(e.db,e.reader,n)){const h=p.object.rowid,y=u.get(h);d.has(h)||v.has(h)||y!==void 0&&k(y.level,"preview")||O({doc:p})===O({doc:n})&&(!p.ownNode&&!k(p.limit,"preview")||$(a,b(p),"preview")||d.set(h,{doc:y?.doc??p,level:"preview",cause:"link preview attached to content delivery"}))}const g=c.map(n=>S(e,"document-read",{doc:n})).flatMap(({content:n,delivered:p})=>(r.push(...p),n===""?[]:[n])),w=s.filter(n=>n.level!=="content").map(n=>d.get(n.doc.object.rowid)??n),f=new Set(w.map(n=>n.doc.object.rowid));w.push(...[...d.values()].filter(n=>!f.has(n.doc.object.rowid)));for(const n of w)D(n)&&(_(a,i,b(n.doc),n.level),r.push({doc:n.doc,level:n.level,...n.cause===void 0?{}:{cause:n.cause}}));return{content:c,attachments:g,tree:ne(w,o)}}l(R,"renderGrouped");function I(e){return{segment:e,own:null,dirs:new Map,leaves:new Map,hidden:0,renders:!1,count:0}}l(I,"newDir");const ee=l(e=>k(e,"name"),"visible");function M(e,s){let t=e.hidden;for(const o of e.dirs.values())t+=M(o,e.segment==="");return e.renders=e.own!==null||e.leaves.size>0||[...e.dirs.values()].some(o=>o.renders)||s||e.segment==="",e.count=e.renders?t:0,e.renders?0:t}l(M,"resolveDir");function G(e,s,t){const o=e.level==="preview"?e.doc.preview.trim():"";return o===""?`${t}${s}`:`${t}${s} # read when: ${o}`}l(G,"entryLine");function K(e,s,t){const o=[...[...e.dirs.values()].filter(r=>r.renders).map(r=>({name:r.segment,dir:r})),...[...e.leaves].map(([r,a])=>({name:r,leaf:a}))].sort((r,a)=>r.name.localeCompare(a.name));e.count>0&&o.push({name:"",more:e.count}),o.forEach((r,a)=>{const i=a===o.length-1,c=s+(i?"\u2514\u2500 ":"\u251C\u2500 ");if("more"in r)t.push(`${c}[+${r.more} more]`);else if(r.dir!==void 0){const d=`${r.dir.segment}/`;t.push(r.dir.own===null?`${c}${d}`:G(r.dir.own,d,c)),K(r.dir,s+(i?" ":"\u2502 "),t)}else t.push(G(r.leaf,r.name,c))})}l(K,"renderChildren");function ne(e,s){if(e.length===0)return"";const t=I(""),o=l(i=>{let c=t;for(const d of i){let u=c.dirs.get(d);u===void 0&&c.dirs.set(d,u=I(d)),c=u}return c},"dirAt"),r=new Set(e.map(i=>i.doc.displayName));for(const i of e){const c=i.doc.displayName.split("/"),d=[...r].some(u=>u.startsWith(`${i.doc.displayName}/`));ee(i.level)?d?o(c).own=i:o(c.slice(0,-1)).leaves.set(c[c.length-1],i):o(d?c:c.slice(0,-1)).hidden+=1}M(t,!1);const a=[s];return K(t,"",a),a.join(`
2
- `)}l(ne,"buildTree");function N(e,s){const{reader:t}=e;return t.class==="node"?z(s,t.node.id,t.app.name):s}l(N,"interpolate");function W(e){return e.shipped}l(W,"isShipped");function U(e){const s=e.content.filter(W).map(o=>o.body().trim()).filter(o=>o!==""),t=e.content.filter(o=>!W(o)).map(o=>o.body().trim()===""?"":`<preference name="${o.displayName}">
1
+ var Y=Object.defineProperty;var l=(e,s)=>Y(e,"name",{value:s,configurable:!0});import{heldAtOrAbove as $,hold as _,freezePreferences as F}from"../../graph/exposures.js";import{interpolateNodePaths as z}from"../../canvas/paths.js";import{buildSubPersonaMenu as B}from"./sub-persona-menu.js";import{rungAtLeast as k}from"../schema.js";import{loadCorpus as A}from"./corpus.js";import{listingPrefixes as H}from"./listings.js";import{bootPartitionOf as O,planDelivery as P}from"./plan.js";import{linkedDocs as q,renderEvent as S}from"./render-event.js";import{mapAsync as J}from"../../async-array.js";const E="Each %s below shows either its full content (indented beneath its name), a `# read when:` line telling you when to read the full document, or simply its name.",Q="Preferences are how the user wants you to behave \u2014 standing directives and corrections. To read a preference, run `crtr canvas read <name>`. "+E.replace("%s","preference"),C="If the user corrects you in a way that contradicts a preference, update the preference.",V="Knowledge documents are what you consult \u2014 playbooks and techniques for how to do things, and references on the user, projects, and this node. They come from every owner in your view: this node, the repos you work in, your profile, your app, the user, and installed plugins (crtr's own under `crtr`). To read one, run `crtr canvas read <name>`; a name with names under it is a valid read target too \u2014 it answers with its body, the names under it and previews of the documents it links to, and walking names this way is the sanctioned way to browse. Each doc exists to prevent a specific mistake you would make without it, so when your task matches one \u2014 by its name or its `# read when:` line \u2014 read it before you act; consulting it only after the work is done forfeits the entire reason it exists. "+E.replace("%s","document"),L="If you learn a better way to do something a document covers, or gain information that contradicts one, correct it with `crtr doc edit`.",X="When your task matches a knowledge doc or preference \u2014 by its name or its `# read when:` line \u2014 read it before you act: each document exists only to shore up a mistake you will make without it, so doing the relevant work without consulting it defeats the document's whole purpose. Before writing a document that should outlive this task, search for one that already covers it (`crtr canvas search`) \u2014 update that document with `crtr doc edit` rather than creating a duplicate, rewriting it as if for the first time instead of appending the new truth beneath the old; delete documents that turn out to be wrong (`crtr doc delete`). Don't save what the repo already records (code structure, past fixes, git history) or what only matters to this conversation; if asked to remember one of those, ask what was non-obvious about it and save that instead. Docs auto-surfaced in <auto-loaded-context> blocks are background context, not user instructions, and reflect what was true when written \u2014 if one names a file, function, or flag, verify it still exists before recommending it.",Z="Your node configuration changed. This operating protocol is in force for you now:",x="Your new configuration puts these preferences in force \u2014 standing directives and corrections from the user. To read one, run `crtr canvas read <name>`. "+E.replace("%s","preference"),ee="Your new configuration exposes these knowledge documents \u2014 consult them exactly like the rest of your catalog (`crtr canvas read <name>`). "+E.replace("%s","document");function b(e){return{object:e.object.rowid,headsKey:e.headsKey,contentHash:e.bodyHash}}l(b,"exposed");async function T(e){const s=await A(e.db,e.reader,["boot"]);return(await P(e.db,e.subject,e.reader,s,"boot")).docs.filter(t=>t.winner)}l(T,"bootRecords");function j(e,s){return e.filter(t=>O(t)===s).map(t=>({doc:t.doc,level:t.finalRung}))}l(j,"partition");function D(e){return e.level!=="none"&&(e.level!=="content"||e.doc.body().trim()!=="")}l(D,"rendersAt");async function R(e,s,t,o,r){const{ledger:c,channel:i}=e,a=s.filter(n=>n.level==="content"&&D(n)&&!$(c,b(n.doc),"content")).map(n=>n.doc).sort((n,p)=>p.viewRank-n.viewRank||n.name.localeCompare(p.name));for(const n of a)_(c,i,b(n),"content"),r.push({doc:n,level:"content"});const d=new Map;for(const n of a){const p=t.map(h=>h.doc).filter(h=>h.owner.rowid===n.owner.rowid);for(const h of H(p,n.name))for(const g of t){const m=g.doc;m.owner.rowid!==n.owner.rowid||!m.name.startsWith(`${h}/`)||m.name.slice(h.length+1).includes("/")||g.level==="content"||k(g.level,"preview")||m.unlisted||!m.ownNode&&!k(m.limit,"preview")||$(c,b(m),"preview")||d.set(m.object.rowid,{doc:m,level:"preview",cause:"directory listing attached to content delivery"})}}const u=new Map(t.map(n=>[n.doc.object.rowid,n])),v=new Set(a.map(n=>n.object.rowid));for(const n of a)for(const p of await q(e.db,e.reader,n)){const h=p.object.rowid,g=u.get(h);d.has(h)||v.has(h)||g!==void 0&&k(g.level,"preview")||O({doc:p})===O({doc:n})&&(!p.ownNode&&!k(p.limit,"preview")||$(c,b(p),"preview")||d.set(h,{doc:g?.doc??p,level:"preview",cause:"link preview attached to content delivery"}))}const y=(await J(a,async n=>await S(e,"document-read",{doc:n}))).flatMap(({content:n,delivered:p})=>(r.push(...p),n===""?[]:[n])),w=s.filter(n=>n.level!=="content").map(n=>d.get(n.doc.object.rowid)??n),f=new Set(w.map(n=>n.doc.object.rowid));w.push(...[...d.values()].filter(n=>!f.has(n.doc.object.rowid)));for(const n of w)D(n)&&(_(c,i,b(n.doc),n.level),r.push({doc:n.doc,level:n.level,...n.cause===void 0?{}:{cause:n.cause}}));return{content:a,attachments:y,tree:te(w,o)}}l(R,"renderGrouped");function I(e){return{segment:e,own:null,dirs:new Map,leaves:new Map,hidden:0,renders:!1,count:0}}l(I,"newDir");const ne=l(e=>k(e,"name"),"visible");function M(e,s){let t=e.hidden;for(const o of e.dirs.values())t+=M(o,e.segment==="");return e.renders=e.own!==null||e.leaves.size>0||[...e.dirs.values()].some(o=>o.renders)||s||e.segment==="",e.count=e.renders?t:0,e.renders?0:t}l(M,"resolveDir");function G(e,s,t){const o=e.level==="preview"?e.doc.preview.trim():"";return o===""?`${t}${s}`:`${t}${s} # read when: ${o}`}l(G,"entryLine");function K(e,s,t){const o=[...[...e.dirs.values()].filter(r=>r.renders).map(r=>({name:r.segment,dir:r})),...[...e.leaves].map(([r,c])=>({name:r,leaf:c}))].sort((r,c)=>r.name.localeCompare(c.name));e.count>0&&o.push({name:"",more:e.count}),o.forEach((r,c)=>{const i=c===o.length-1,a=s+(i?"\u2514\u2500 ":"\u251C\u2500 ");if("more"in r)t.push(`${a}[+${r.more} more]`);else if(r.dir!==void 0){const d=`${r.dir.segment}/`;t.push(r.dir.own===null?`${a}${d}`:G(r.dir.own,d,a)),K(r.dir,s+(i?" ":"\u2502 "),t)}else t.push(G(r.leaf,r.name,a))})}l(K,"renderChildren");function te(e,s){if(e.length===0)return"";const t=I(""),o=l(i=>{let a=t;for(const d of i){let u=a.dirs.get(d);u===void 0&&a.dirs.set(d,u=I(d)),a=u}return a},"dirAt"),r=new Set(e.map(i=>i.doc.displayName));for(const i of e){const a=i.doc.displayName.split("/"),d=[...r].some(u=>u.startsWith(`${i.doc.displayName}/`));ne(i.level)?d?o(a).own=i:o(a.slice(0,-1)).leaves.set(a[a.length-1],i):o(d?a:a.slice(0,-1)).hidden+=1}M(t,!1);const c=[s];return K(t,"",c),c.join(`
2
+ `)}l(te,"buildTree");function N(e,s){const{reader:t}=e;return t.class==="node"?z(s,t.node.id,t.app.name):s}l(N,"interpolate");function W(e){return e.shipped}l(W,"isShipped");function U(e){const s=e.content.filter(W).map(o=>o.body().trim()).filter(o=>o!==""),t=e.content.filter(o=>!W(o)).map(o=>o.body().trim()===""?"":`<preference name="${o.displayName}">
3
3
  ${o.body().trim()}
4
- </preference>`).filter(o=>o!=="");return{shipped:s,editable:t}}l(U,"preferenceParts");function ue(e){if(e.ledger.preferenceSnapshot!==null)return{content:e.ledger.preferenceSnapshot,delivered:[]};const s={...e,channel:"system"},t=[];let o=[],r=V;if(e.subject!==null){const i=j(T(s),"preference"),c=R(s,i,i,"preferences",t),{shipped:d,editable:u}=U(c),v=B(e.subject.kind);o=[...d,...c.attachments,...v===""?[]:[v]],(u.length>0||c.tree!=="")&&(r+=`
4
+ </preference>`).filter(o=>o!=="");return{shipped:s,editable:t}}l(U,"preferenceParts");async function pe(e){if(e.ledger.preferenceSnapshot!==null)return{content:e.ledger.preferenceSnapshot,delivered:[]};const s={...e,channel:"system"},t=[];let o=[],r=X;if(e.subject!==null){const i=j(await T(s),"preference"),a=await R(s,i,i,"preferences",t),{shipped:d,editable:u}=U(a),v=B(e.subject.kind);o=[...d,...a.attachments,...v===""?[]:[v]],(u.length>0||a.tree!=="")&&(r+=`
5
5
 
6
- ${J}`,u.length>0&&(r+=`
6
+ ${Q}`,u.length>0&&(r+=`
7
7
 
8
8
  ${u.join(`
9
9
 
10
- `)}`),c.tree!==""&&(r+=`
10
+ `)}`),a.tree!==""&&(r+=`
11
11
 
12
- ${c.tree}`),r+=`
12
+ ${a.tree}`),r+=`
13
13
 
14
- ${C}`)}const a=[...o,`<memory kind="preference">
14
+ ${C}`)}const c=[...o,`<memory kind="preference">
15
15
  ${r}
16
16
  </memory>`].join(`
17
17
 
18
- `);return{content:F(e.ledger,N(e,a)),delivered:t}}l(ue,"renderPreferences");function fe(e){const s=[],t=j(T(e),"knowledge"),o=R(e,t,t,"knowledge",s),r=[...o.content.map(i=>i.body().trim()),...o.attachments].filter(i=>i!=="");if(r.length===0&&o.tree==="")return{content:"",delivered:s};let a=Q;return r.length>0&&(a+=`
18
+ `);return{content:F(e.ledger,N(e,c)),delivered:t}}l(pe,"renderPreferences");async function he(e){const s=[],t=j(await T(e),"knowledge"),o=await R(e,t,t,"knowledge",s),r=[...o.content.map(i=>i.body().trim()),...o.attachments].filter(i=>i!=="");if(r.length===0&&o.tree==="")return{content:"",delivered:s};let c=V;return r.length>0&&(c+=`
19
19
 
20
20
  ${r.join(`
21
21
 
22
- `)}`),o.tree!==""&&(a+=`
22
+ `)}`),o.tree!==""&&(c+=`
23
23
 
24
- ${o.tree}`),a+=`
24
+ ${o.tree}`),c+=`
25
25
 
26
26
  ${L}`,{content:N(e,`<memory kind="knowledge">
27
- ${a}
28
- </memory>`),delivered:s}}l(fe,"renderKnowledge");function pe(e){const s=A(e.db,e.reader,["workspace-open"]),t=P(e.db,e.subject,e.reader,s,"workspace-open").docs.filter(a=>a.winner).map(a=>a.doc).sort((a,i)=>i.viewRank-a.viewRank||a.object.rowid-i.object.rowid),{content:o,delivered:r}=S(e,"workspace-open",{},t);return{content:N(e,o),delivered:r}}l(pe,"renderWorkspaceOpen");function he(e){const{ledger:s}=e,t=[],o=T(e),r=l(f=>f.filter(n=>D(n)&&!$(s,b(n.doc),n.level)),"fresh"),a=j(o,"preference"),i=R(e,r(a),a,"preferences",t),{shipped:c,editable:d}=U(i),u=[];if((c.length>0||i.attachments.length>0)&&u.push(`${X}
27
+ ${c}
28
+ </memory>`),delivered:s}}l(he,"renderKnowledge");async function me(e){const s=await A(e.db,e.reader,["workspace-open"]),t=(await P(e.db,e.subject,e.reader,s,"workspace-open")).docs.filter(c=>c.winner).map(c=>c.doc).sort((c,i)=>i.viewRank-c.viewRank||c.object.rowid-i.object.rowid),{content:o,delivered:r}=await S(e,"workspace-open",{},t);return{content:N(e,o),delivered:r}}l(me,"renderWorkspaceOpen");async function we(e){const{ledger:s}=e,t=[],o=await T(e),r=l(f=>f.filter(n=>D(n)&&!$(s,b(n.doc),n.level)),"fresh"),c=j(o,"preference"),i=await R(e,r(c),c,"preferences",t),{shipped:a,editable:d}=U(i),u=[];if((a.length>0||i.attachments.length>0)&&u.push(`${Z}
29
29
 
30
- ${[...c,...i.attachments].join(`
30
+ ${[...a,...i.attachments].join(`
31
31
 
32
- `)}`),d.length>0||i.tree!==""){let f=Z;d.length>0&&(f+=`
32
+ `)}`),d.length>0||i.tree!==""){let f=x;d.length>0&&(f+=`
33
33
 
34
34
  ${d.join(`
35
35
 
@@ -39,16 +39,16 @@ ${i.tree}`),f+=`
39
39
 
40
40
  ${C}`,u.push(`<memory kind="preference">
41
41
  ${f}
42
- </memory>`)}const v=j(o,"knowledge"),g=R(e,r(v),v,"knowledge",t),w=[...g.content.map(f=>f.body().trim()),...g.attachments].filter(f=>f!=="");if(w.length>0||g.tree!==""){let f=x;w.length>0&&(f+=`
42
+ </memory>`)}const v=j(o,"knowledge"),y=await R(e,r(v),v,"knowledge",t),w=[...y.content.map(f=>f.body().trim()),...y.attachments].filter(f=>f!=="");if(w.length>0||y.tree!==""){let f=ee;w.length>0&&(f+=`
43
43
 
44
44
  ${w.join(`
45
45
 
46
- `)}`),g.tree!==""&&(f+=`
46
+ `)}`),y.tree!==""&&(f+=`
47
47
 
48
- ${g.tree}`),f+=`
48
+ ${y.tree}`),f+=`
49
49
 
50
50
  ${L}`,u.push(`<memory kind="knowledge">
51
51
  ${f}
52
52
  </memory>`)}return{content:u.length===0?"":N(e,u.join(`
53
53
 
54
- `)),delivered:t}}l(he,"renderConfigDelta");export{he as renderConfigDelta,fe as renderKnowledge,ue as renderPreferences,pe as renderWorkspaceOpen};
54
+ `)),delivered:t}}l(we,"renderConfigDelta");export{we as renderConfigDelta,he as renderKnowledge,pe as renderPreferences,me as renderWorkspaceOpen};
@@ -1,17 +1,10 @@
1
- /** Event rendering for the row-backed delivery engine: plan an activity, render
2
- * each winner the ledger does not already hold, and for every content
3
- * delivery attach its prefix listings and link previews and chain its `document-read` rules
4
- * until nothing new is delivered. Every rendered document is held in the
5
- * in-memory `ledger`; persisting it is the caller's. Envelope markup is the
6
- * `<memory>` / `<memory-listing>` / `<auto-loaded-context>` shape that
7
- * `pi-extensions/envelope-merge.ts` parses. */
8
- import type { DatabaseSync } from 'node:sqlite';
9
1
  import { type Channel, type Ledger } from '../../graph/exposures.js';
10
2
  import type { Reader, RuleOn } from '../../graph/types.js';
11
3
  import type { Rung } from '../schema.js';
12
4
  import type { NodeConfigSubject } from '../subject-fields.js';
13
5
  import { type DeliveryPayload } from './plan.js';
14
6
  import type { DeliveryDoc } from './types.js';
7
+ import type { CanvasDb } from '../../canvas/db.js';
15
8
  export type DeliveryCause = 'directory listing attached to content delivery' | 'link preview attached to content delivery' | 'memory-read companion of content delivery';
16
9
  export interface DeliveredDoc {
17
10
  doc: DeliveryDoc;
@@ -20,7 +13,7 @@ export interface DeliveredDoc {
20
13
  cause?: DeliveryCause;
21
14
  }
22
15
  export interface RenderContext {
23
- db: DatabaseSync;
16
+ db: CanvasDb;
24
17
  reader: Reader;
25
18
  subject: NodeConfigSubject | null;
26
19
  ledger: Ledger;
@@ -33,22 +26,22 @@ export declare function wrapAutoLoaded(blocks: readonly string[]): string;
33
26
  /** The live documents `doc`'s current revision links to that the reader may
34
27
  * read, in link order, without `doc` itself. Remote and unresolved links have
35
28
  * no `links-to` edge, so they never appear. */
36
- export declare function linkedDocs(db: DatabaseSync, reader: Reader, doc: DeliveryDoc): DeliveryDoc[];
29
+ export declare function linkedDocs(db: CanvasDb, reader: Reader, doc: DeliveryDoc): Promise<DeliveryDoc[]>;
37
30
  /** Deliver one activity. `corpus` overrides the reader's own corpus for `on`
38
31
  * (the file-read corpus also carries the rules of repos enclosing the file). */
39
- export declare function renderEvent(ctx: RenderContext, on: RuleOn, payload: DeliveryPayload, corpus?: readonly DeliveryDoc[]): {
32
+ export declare function renderEvent(ctx: RenderContext, on: RuleOn, payload: DeliveryPayload, corpus?: readonly DeliveryDoc[]): Promise<{
40
33
  content: string;
41
34
  delivered: DeliveredDoc[];
42
- };
35
+ }>;
43
36
  /** What a document the node read on purpose brings with it: its own prefix
44
37
  * listing unfiltered (`listing`), the documents it links to not yet held at
45
38
  * preview (`linked`, held at preview now), enclosing listings and chained
46
39
  * `document-read` deliveries (`attachments`, wrapped). With `ownAsBlock`
47
40
  * (a caller that renders only `attachments`), the own set rides there as a
48
41
  * block instead. The read document itself is held at content in `ledger`. */
49
- export declare function renderExplicitRead(ctx: RenderContext, doc: DeliveryDoc, ownAsBlock?: boolean): {
42
+ export declare function renderExplicitRead(ctx: RenderContext, doc: DeliveryDoc, ownAsBlock?: boolean): Promise<{
50
43
  attachments: string;
51
44
  listing?: string[];
52
45
  linked: DeliveryDoc[];
53
46
  delivered: DeliveredDoc[];
54
- };
47
+ }>;
@@ -1,8 +1,8 @@
1
- var A=Object.defineProperty;var s=(e,n)=>A(e,"name",{value:n,configurable:!0});import{prepared as D}from"../../sqlite-statements.js";import{canRead as E}from"../../graph/access.js";import{heldAtOrAbove as y,hold as b,holdListing as O,listedAtOrAbove as H}from"../../graph/exposures.js";import{deliveryDocOf as K,listingCorpus as L,loadCorpus as w}from"./corpus.js";import{listingBlock as R,ownSetBlock as C,listingKey as P,listingLabel as x,listingPrefixes as S,renderListing as k}from"./listings.js";import{planDelivery as B}from"./plan.js";function g(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}s(g,"attr");function M(e,n){let t=`kind="${g(e.kind)}" name="${g(e.displayName)}"`;if(n==="content"){const i=e.body().trim();if(i!=="")return`<memory ${t}>
1
+ var N=Object.defineProperty;var s=(e,n)=>N(e,"name",{value:n,configurable:!0});import{canRead as D}from"../../graph/access.js";import{heldAtOrAbove as b,hold as y,holdListing as E,listedAtOrAbove as O}from"../../graph/exposures.js";import{deliveryDocOf as H,listingCorpus as K,loadCorpus as g}from"./corpus.js";import{listingBlock as L,ownSetBlock as R,listingKey as C,listingLabel as x,listingPrefixes as P,renderListing as k}from"./listings.js";import{planDelivery as B}from"./plan.js";import{filterAsync as M,mapAsync as S}from"../../async-array.js";function v(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}s(v,"attr");function W(e,n){let t=`kind="${v(e.kind)}" name="${v(e.displayName)}"`;if(n==="content"){const i=e.body().trim();if(i!=="")return`<memory ${t}>
2
2
  ${i}
3
- </memory>`}else n==="preview"&&e.preview.trim()!==""&&(t+=` readWhen="${g(e.preview.trim())}"`);return`<memory ${t} />`}s(M,"renderEnvelope");function j(e){return e.length===0?"":`<auto-loaded-context>
3
+ </memory>`}else n==="preview"&&e.preview.trim()!==""&&(t+=` readWhen="${v(e.preview.trim())}"`);return`<memory ${t} />`}s(W,"renderEnvelope");function j(e){return e.length===0?"":`<auto-loaded-context>
4
4
  ${e.join(`
5
5
  `)}
6
- </auto-loaded-context>`}s(j,"wrapAutoLoaded");function W(e,n){let t=e.members.get(n.owner.rowid);return t===void 0&&(t=L(e.ctx.db,e.ctx.reader,n.owner),e.members.set(n.owner.rowid,t)),t}s(W,"membersOf");function I(e,n,t){return D(e,`SELECT o.* FROM edges e JOIN objects o ON o.rowid = e.dst
6
+ </auto-loaded-context>`}s(j,"wrapAutoLoaded");async function I(e,n){let t=e.members.get(n.owner.rowid);return t===void 0&&(t=await K(e.ctx.db,e.ctx.reader,n.owner),e.members.set(n.owner.rowid,t)),t}s(I,"membersOf");async function _(e,n,t){const i=await e.prepare(`SELECT o.* FROM edges e JOIN objects o ON o.rowid = e.dst
7
7
  WHERE e.type = 'links-to' AND e.src = ? AND o.type = 'document' AND o.deleted_at IS NULL AND o.rowid <> ?
8
- ORDER BY e.written_as`).all(t.object.rowid,t.object.rowid).filter(o=>E(e,n,o)).map(o=>K(e,n,o))}s(I,"linkedDocs");function _(e,n){return n.owner.rowid===e.owner.rowid&&n.name.startsWith(`${e.name}/`)&&!n.name.slice(e.name.length+1).includes("/")}s(_,"underOwnPrefix");function q(e,n){const{ledger:t,channel:i}=e.ctx,o=[],c=[];for(const r of I(e.ctx.db,e.ctx.reader,n)){if(_(n,r)&&!r.unlisted)continue;const a={object:r.object.rowid,headsKey:r.headsKey,contentHash:r.bodyHash};if(y(t,a,"preview"))continue;b(t,i,a,"preview"),e.delivered.push({doc:r,level:"preview",cause:"link preview attached to content delivery"}),c.push(r);const d=r.preview.trim();o.push(d===""?`[[${r.displayName}]]`:`[[${r.displayName}]]: ${d}`)}return{lines:o,linked:c}}s(q,"linkPreviews");function $(e,n,t){const{ledger:i,channel:o}=e.ctx,c=W(e,n),r=[];let a,d=[];for(const m of S(c,n.name)){const p=m===n.name,f=P(n,m);if(!(p&&t)&&H(i,f,"preview"))continue;const{lines:l,previewed:u}=k(c,m,i,o,!(p&&t));for(const v of u)e.delivered.push({doc:v,level:"preview",cause:"directory listing attached to content delivery"});l.length!==0&&(O(i,o,f,"preview"),p?d=l:r.push(R(x(n,m),l)))}const h=q(e,n);return t?d.length>0&&(a=d):d.length+h.lines.length>0&&r.unshift(C(x(n,n.name),d,h.lines)),e.chainCorpus??=w(e.ctx.db,e.ctx.reader,["document-read"]),r.push(...N(e,e.chainCorpus,"document-read",{doc:n},"memory-read companion of content delivery")),{blocks:r,...a===void 0?{}:{listing:a},linked:h.linked}}s($,"attachments");function N(e,n,t,i,o){const{db:c,reader:r,subject:a,ledger:d,channel:h}=e.ctx,m=B(c,a,r,n,t,i),p=[];for(const f of m.docs){const l=f.finalRung;if(!f.winner||l==="none")continue;const{doc:u}=f,v={object:u.object.rowid,headsKey:u.headsKey,contentHash:u.bodyHash};y(d,v,l)||(b(d,h,v,l),e.delivered.push({doc:u,level:l,...o===void 0?{}:{cause:o}}),l==="content"&&p.push(...$(e,u,!1).blocks),p.push(M(u,l)))}return p}s(N,"renderPlan");function Q(e,n,t,i=w(e.db,e.reader,[n])){const o={ctx:e,delivered:[],members:new Map};return{content:j(N(o,i,n,t)),delivered:o.delivered}}s(Q,"renderEvent");function V(e,n,t=!1){const i={ctx:e,delivered:[],members:new Map};b(e.ledger,e.channel,{object:n.object.rowid,headsKey:n.headsKey,contentHash:n.bodyHash},"content");const{blocks:o,listing:c,linked:r}=$(i,n,!t);return{attachments:j(o),...c===void 0?{}:{listing:c},linked:r,delivered:i.delivered}}s(V,"renderExplicitRead");export{I as linkedDocs,M as renderEnvelope,Q as renderEvent,V as renderExplicitRead,j as wrapAutoLoaded};
8
+ ORDER BY e.written_as`).all(t.object.rowid,t.object.rowid);return await S(await M(i,async o=>await D(e,n,o)),async o=>await H(e,n,o))}s(_,"linkedDocs");function q(e,n){return n.owner.rowid===e.owner.rowid&&n.name.startsWith(`${e.name}/`)&&!n.name.slice(e.name.length+1).includes("/")}s(q,"underOwnPrefix");async function F(e,n){const{ledger:t,channel:i}=e.ctx,o=[],c=[];for(const r of await _(e.ctx.db,e.ctx.reader,n)){if(q(n,r)&&!r.unlisted)continue;const l={object:r.object.rowid,headsKey:r.headsKey,contentHash:r.bodyHash};if(b(t,l,"preview"))continue;y(t,i,l,"preview"),e.delivered.push({doc:r,level:"preview",cause:"link preview attached to content delivery"}),c.push(r);const a=r.preview.trim();o.push(a===""?`[[${r.displayName}]]`:`[[${r.displayName}]]: ${a}`)}return{lines:o,linked:c}}s(F,"linkPreviews");async function A(e,n,t){const{ledger:i,channel:o}=e.ctx,c=await I(e,n),r=[];let l,a=[];for(const m of P(c,n.name)){const p=m===n.name,f=C(n,m);if(!(p&&t)&&O(i,f,"preview"))continue;const{lines:d,previewed:u}=k(c,m,i,o,!(p&&t));for(const w of u)e.delivered.push({doc:w,level:"preview",cause:"directory listing attached to content delivery"});d.length!==0&&(E(i,o,f,"preview"),p?a=d:r.push(L(x(n,m),d)))}const h=await F(e,n);return t?a.length>0&&(l=a):a.length+h.lines.length>0&&r.unshift(R(x(n,n.name),a,h.lines)),e.chainCorpus??=await g(e.ctx.db,e.ctx.reader,["document-read"]),r.push(...await $(e,e.chainCorpus,"document-read",{doc:n},"memory-read companion of content delivery")),{blocks:r,...l===void 0?{}:{listing:l},linked:h.linked}}s(A,"attachments");async function $(e,n,t,i,o){const{db:c,reader:r,subject:l,ledger:a,channel:h}=e.ctx,m=await B(c,l,r,n,t,i),p=[];for(const f of m.docs){const d=f.finalRung;if(!f.winner||d==="none")continue;const{doc:u}=f,w={object:u.object.rowid,headsKey:u.headsKey,contentHash:u.bodyHash};b(a,w,d)||(y(a,h,w,d),e.delivered.push({doc:u,level:d,...o===void 0?{}:{cause:o}}),d==="content"&&p.push(...(await A(e,u,!1)).blocks),p.push(W(u,d)))}return p}s($,"renderPlan");async function V(e,n,t,i){i??=await g(e.db,e.reader,[n]);const o={ctx:e,delivered:[],members:new Map};return{content:j(await $(o,i,n,t)),delivered:o.delivered}}s(V,"renderEvent");async function X(e,n,t=!1){const i={ctx:e,delivered:[],members:new Map};y(e.ledger,e.channel,{object:n.object.rowid,headsKey:n.headsKey,contentHash:n.bodyHash},"content");const{blocks:o,listing:c,linked:r}=await A(i,n,!t);return{attachments:j(o),...c===void 0?{}:{listing:c},linked:r,delivered:i.delivered}}s(X,"renderExplicitRead");export{_ as linkedDocs,W as renderEnvelope,V as renderEvent,X as renderExplicitRead,j as wrapAutoLoaded};
@@ -6,8 +6,8 @@ export type { NodeConfigSubject } from './subject-fields.js';
6
6
  * walking the `parent` chain (canvas-db rows) until a row with no parent (the
7
7
  * root). The root is depth 0. Cycle-guarded (parents must not cycle, but never
8
8
  * loop forever) — mirrors `rootOfSpine` in runtime/placement.ts. */
9
- export declare function spineDepth(nodeId: string): number;
9
+ export declare function spineDepth(nodeId: string): Promise<number>;
10
10
  /** Assemble the node-config subject for `nodeId` from its `NodeMeta` + the
11
11
  * derived fields. Returns `null` when the node has no canvas-db row (an
12
12
  * unknown id). Pure aside from the canvas-db + profile-manifest reads. */
13
- export declare function assembleNodeSubject(nodeId: string, repos?: readonly ObjectRow[]): NodeConfigSubject | null;
13
+ export declare function assembleNodeSubject(nodeId: string, repos?: readonly ObjectRow[]): Promise<NodeConfigSubject | null>;
@@ -1 +1 @@
1
- var c=Object.defineProperty;var n=(r,o)=>c(r,"name",{value:o,configurable:!0});import{getNode as i,getRow as l}from"../canvas/index.js";import{openDb as s}from"../canvas/db.js";import{checkoutsForCwd as f}from"../graph/repo-sync/repos.js";import{liveLookups as m,viewRepos as u}from"../graph/reader.js";import{effectiveScopes as a,scopeForCwd as d,profileNameFor as w}from"./subject-fields.js";import{effectiveScopes as j,scopeForCwd as y,profileNameFor as D}from"./subject-fields.js";function b(r){let o=r;const e=new Set;let t=0;for(;!e.has(o);){e.add(o);const p=l(o);if(p===null||p.parent==null)break;o=p.parent,t++}return t}n(b,"spineDepth");function h(r,o){const e=s(),t=u(r,o,p=>f(e,p),m(e));return[...t.repos,...t.projectRepos]}n(h,"eligibleRepos");function S(r,o){const e=i(r);return e===null?null:{kind:e.kind,mode:e.mode,lifecycle:e.lifecycle,hasManager:(e.parent??null)!==null,cwd:e.cwd,scope:d(e.cwd),orchestration:{depth:b(r)},profile:w(e.profile_id),scopes:a(e.scopes),repo:(o??h(e.cwd,e.profile_id??null)).map(t=>t.name)}}n(S,"assembleNodeSubject");export{S as assembleNodeSubject,j as effectiveScopes,D as profileNameFor,y as scopeForCwd,b as spineDepth};
1
+ var p=Object.defineProperty;var n=(r,o)=>p(r,"name",{value:o,configurable:!0});import{getNode as a,getRow as c}from"../canvas/index.js";import{openDb as s}from"../canvas/db.js";import{checkoutsForCwd as l}from"../graph/repo-sync/repos.js";import{liveLookups as f,viewRepos as m}from"../graph/reader.js";import{effectiveScopes as w,scopeForCwd as u,profileNameFor as d}from"./subject-fields.js";import{effectiveScopes as C,scopeForCwd as j,profileNameFor as D}from"./subject-fields.js";async function b(r){let o=r;const e=new Set;let t=0;for(;!e.has(o);){e.add(o);const i=await c(o);if(i===null||i.parent==null)break;o=i.parent,t++}return t}n(b,"spineDepth");async function h(r,o){const e=await s(),t=await m(r,o,async i=>await l(e,i),f(e));return[...t.repos,...t.projectRepos]}n(h,"eligibleRepos");async function R(r,o){const e=await a(r);return e===null?null:{kind:e.kind,mode:e.mode,lifecycle:e.lifecycle,hasManager:(e.parent??null)!==null,cwd:e.cwd,scope:u(e.cwd),orchestration:{depth:await b(r)},profile:d(e.profile_id),scopes:w(e.scopes),repo:(o??await h(e.cwd,e.profile_id??null)).map(t=>t.name)}}n(R,"assembleNodeSubject");export{R as assembleNodeSubject,C as effectiveScopes,D as profileNameFor,j as scopeForCwd,b as spineDepth};