@plurnk/plurnk-service 1.3.12 → 1.5.0

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 (488) hide show
  1. package/.env.defaults +95 -91
  2. package/INSTALL.md +54 -28
  3. package/README.md +25 -10
  4. package/SPEC.md +2426 -942
  5. package/dist/Paths.d.ts +4 -1
  6. package/dist/Paths.d.ts.map +1 -1
  7. package/dist/Paths.js +24 -23
  8. package/dist/Paths.js.map +1 -1
  9. package/dist/build-info.json +1 -1
  10. package/dist/content/edit-receipt.d.ts +13 -28
  11. package/dist/content/edit-receipt.d.ts.map +1 -1
  12. package/dist/content/edit-receipt.js +285 -104
  13. package/dist/content/edit-receipt.js.map +1 -1
  14. package/dist/content/edited-span.d.ts.map +1 -1
  15. package/dist/content/edited-span.js +2 -5
  16. package/dist/content/edited-span.js.map +1 -1
  17. package/dist/content/index.d.ts +4 -3
  18. package/dist/content/index.d.ts.map +1 -1
  19. package/dist/content/index.js +2 -1
  20. package/dist/content/index.js.map +1 -1
  21. package/dist/content/line-marker.d.ts +10 -9
  22. package/dist/content/line-marker.d.ts.map +1 -1
  23. package/dist/content/line-marker.js +8 -11
  24. package/dist/content/line-marker.js.map +1 -1
  25. package/dist/content/matcher.d.ts +15 -26
  26. package/dist/content/matcher.d.ts.map +1 -1
  27. package/dist/content/matcher.js +77 -107
  28. package/dist/content/matcher.js.map +1 -1
  29. package/dist/content/mimetype-binary.d.ts +2 -2
  30. package/dist/content/mimetype-binary.d.ts.map +1 -1
  31. package/dist/content/mimetype-binary.js +10 -10
  32. package/dist/content/mimetype-binary.js.map +1 -1
  33. package/dist/content/path-mimetype.js +3 -3
  34. package/dist/content/path-mimetype.js.map +1 -1
  35. package/dist/content/read-projector.d.ts +14 -0
  36. package/dist/content/read-projector.d.ts.map +1 -0
  37. package/dist/content/read-projector.js +86 -0
  38. package/dist/content/read-projector.js.map +1 -0
  39. package/dist/content/read-resolve.d.ts +6 -7
  40. package/dist/content/read-resolve.d.ts.map +1 -1
  41. package/dist/content/read-resolve.js +36 -59
  42. package/dist/content/read-resolve.js.map +1 -1
  43. package/dist/core/BranchReceipt.d.ts +6 -0
  44. package/dist/core/BranchReceipt.d.ts.map +1 -0
  45. package/dist/core/BranchReceipt.js +24 -0
  46. package/dist/core/BranchReceipt.js.map +1 -0
  47. package/dist/core/BudgetOverflow.d.ts +20 -0
  48. package/dist/core/BudgetOverflow.d.ts.map +1 -0
  49. package/dist/core/BudgetOverflow.js +49 -0
  50. package/dist/core/BudgetOverflow.js.map +1 -0
  51. package/dist/core/BudgetReadout.d.ts +8 -0
  52. package/dist/core/BudgetReadout.d.ts.map +1 -0
  53. package/dist/core/BudgetReadout.js +79 -0
  54. package/dist/core/BudgetReadout.js.map +1 -0
  55. package/dist/core/ChannelWrite.d.ts +31 -9
  56. package/dist/core/ChannelWrite.d.ts.map +1 -1
  57. package/dist/core/ChannelWrite.js +30 -23
  58. package/dist/core/ChannelWrite.js.map +1 -1
  59. package/dist/core/ChannelWrite.sql +14 -12
  60. package/dist/core/CoreSchemeServices.d.ts +18 -4
  61. package/dist/core/CoreSchemeServices.d.ts.map +1 -1
  62. package/dist/core/CoreSchemeServices.js +7 -1
  63. package/dist/core/CoreSchemeServices.js.map +1 -1
  64. package/dist/core/Dispatcher.d.ts +26 -21
  65. package/dist/core/Dispatcher.d.ts.map +1 -1
  66. package/dist/core/Dispatcher.js +1626 -671
  67. package/dist/core/Dispatcher.js.map +1 -1
  68. package/dist/core/DurableStatement.d.ts +6 -0
  69. package/dist/core/DurableStatement.d.ts.map +1 -0
  70. package/dist/core/DurableStatement.js +51 -0
  71. package/dist/core/DurableStatement.js.map +1 -0
  72. package/dist/core/Engine.d.ts +64 -29
  73. package/dist/core/Engine.d.ts.map +1 -1
  74. package/dist/core/Engine.js +1348 -835
  75. package/dist/core/Engine.js.map +1 -1
  76. package/dist/core/Engine.sql +329 -234
  77. package/dist/core/EnvFlags.js +1 -1
  78. package/dist/core/EnvFlags.js.map +1 -1
  79. package/dist/core/ErrorDetail.d.ts +6 -0
  80. package/dist/core/ErrorDetail.d.ts.map +1 -0
  81. package/dist/core/ErrorDetail.js +20 -0
  82. package/dist/core/ErrorDetail.js.map +1 -0
  83. package/dist/core/ExecutorRegistry.d.ts +14 -3
  84. package/dist/core/ExecutorRegistry.d.ts.map +1 -1
  85. package/dist/core/ExecutorRegistry.js +56 -30
  86. package/dist/core/ExecutorRegistry.js.map +1 -1
  87. package/dist/core/GitBranch.d.ts +20 -0
  88. package/dist/core/GitBranch.d.ts.map +1 -0
  89. package/dist/core/GitBranch.js +110 -0
  90. package/dist/core/GitBranch.js.map +1 -0
  91. package/dist/core/JournalTurn.d.ts +9 -0
  92. package/dist/core/JournalTurn.d.ts.map +1 -0
  93. package/dist/core/JournalTurn.js +14 -0
  94. package/dist/core/JournalTurn.js.map +1 -0
  95. package/dist/core/JournalTurn.sql +10 -0
  96. package/dist/core/LogBody.d.ts +18 -0
  97. package/dist/core/LogBody.d.ts.map +1 -0
  98. package/dist/core/LogBody.js +180 -0
  99. package/dist/core/LogBody.js.map +1 -0
  100. package/dist/core/LoopFlagsReader.d.ts +7 -0
  101. package/dist/core/LoopFlagsReader.d.ts.map +1 -0
  102. package/dist/core/LoopFlagsReader.js +33 -0
  103. package/dist/core/LoopFlagsReader.js.map +1 -0
  104. package/dist/core/LoopLifecycle.d.ts +8 -2
  105. package/dist/core/LoopLifecycle.d.ts.map +1 -1
  106. package/dist/core/LoopLifecycle.js +54 -11
  107. package/dist/core/LoopLifecycle.js.map +1 -1
  108. package/dist/core/LoopLifecycle.sql +10 -7
  109. package/dist/core/NoticeChannel.d.ts +13 -0
  110. package/dist/core/NoticeChannel.d.ts.map +1 -0
  111. package/dist/core/NoticeChannel.js +40 -0
  112. package/dist/core/NoticeChannel.js.map +1 -0
  113. package/dist/core/Owner.d.ts +0 -1
  114. package/dist/core/Owner.d.ts.map +1 -1
  115. package/dist/core/Owner.js +2 -5
  116. package/dist/core/Owner.js.map +1 -1
  117. package/dist/core/PacketBuilder.d.ts +27 -25
  118. package/dist/core/PacketBuilder.d.ts.map +1 -1
  119. package/dist/core/PacketBuilder.js +321 -383
  120. package/dist/core/PacketBuilder.js.map +1 -1
  121. package/dist/core/ProblemLog.d.ts +26 -0
  122. package/dist/core/ProblemLog.d.ts.map +1 -0
  123. package/dist/core/ProblemLog.js +58 -0
  124. package/dist/core/ProblemLog.js.map +1 -0
  125. package/dist/core/ProposalLifecycle.d.ts +15 -21
  126. package/dist/core/ProposalLifecycle.d.ts.map +1 -1
  127. package/dist/core/ProposalLifecycle.js +291 -78
  128. package/dist/core/ProposalLifecycle.js.map +1 -1
  129. package/dist/core/ProviderInstantiate.d.ts.map +1 -1
  130. package/dist/core/ProviderInstantiate.js +51 -48
  131. package/dist/core/ProviderInstantiate.js.map +1 -1
  132. package/dist/core/SchemeRegistry.d.ts +14 -8
  133. package/dist/core/SchemeRegistry.d.ts.map +1 -1
  134. package/dist/core/SchemeRegistry.js +189 -114
  135. package/dist/core/SchemeRegistry.js.map +1 -1
  136. package/dist/core/ServiceTeardown.d.ts +11 -0
  137. package/dist/core/ServiceTeardown.d.ts.map +1 -0
  138. package/dist/core/ServiceTeardown.js +70 -0
  139. package/dist/core/ServiceTeardown.js.map +1 -0
  140. package/dist/core/StoredPacket.d.ts +29 -0
  141. package/dist/core/StoredPacket.d.ts.map +1 -0
  142. package/dist/core/StoredPacket.js +147 -0
  143. package/dist/core/StoredPacket.js.map +1 -0
  144. package/dist/core/StrikeRail.d.ts +6 -3
  145. package/dist/core/StrikeRail.d.ts.map +1 -1
  146. package/dist/core/StrikeRail.js +27 -56
  147. package/dist/core/StrikeRail.js.map +1 -1
  148. package/dist/core/TerminalResult.d.ts +16 -0
  149. package/dist/core/TerminalResult.d.ts.map +1 -0
  150. package/dist/core/TerminalResult.js +49 -0
  151. package/dist/core/TerminalResult.js.map +1 -0
  152. package/dist/core/WorkerControlAddress.d.ts +17 -0
  153. package/dist/core/WorkerControlAddress.d.ts.map +1 -0
  154. package/dist/core/WorkerControlAddress.js +44 -0
  155. package/dist/core/WorkerControlAddress.js.map +1 -0
  156. package/dist/core/WorkerName.d.ts +31 -0
  157. package/dist/core/WorkerName.d.ts.map +1 -0
  158. package/dist/core/WorkerName.js +95 -0
  159. package/dist/core/WorkerName.js.map +1 -0
  160. package/dist/core/WorkerName.sql +36 -0
  161. package/dist/core/WorkspaceGate.d.ts +14 -0
  162. package/dist/core/WorkspaceGate.d.ts.map +1 -0
  163. package/dist/core/WorkspaceGate.js +155 -0
  164. package/dist/core/WorkspaceGate.js.map +1 -0
  165. package/dist/core/caps/CapsResolve.d.ts +5 -1
  166. package/dist/core/caps/CapsResolve.d.ts.map +1 -1
  167. package/dist/core/caps/CapsResolve.js +8 -4
  168. package/dist/core/caps/CapsResolve.js.map +1 -1
  169. package/dist/core/caps/DbChannelCaps.d.ts +5 -11
  170. package/dist/core/caps/DbChannelCaps.d.ts.map +1 -1
  171. package/dist/core/caps/DbChannelCaps.js +30 -12
  172. package/dist/core/caps/DbChannelCaps.js.map +1 -1
  173. package/dist/core/caps/DbEntryCaps.d.ts +5 -14
  174. package/dist/core/caps/DbEntryCaps.d.ts.map +1 -1
  175. package/dist/core/caps/DbEntryCaps.js +27 -8
  176. package/dist/core/caps/DbEntryCaps.js.map +1 -1
  177. package/dist/core/caps/DbNotifyCaps.d.ts +1 -1
  178. package/dist/core/caps/DbNotifyCaps.d.ts.map +1 -1
  179. package/dist/core/caps/DbNotifyCaps.js +18 -15
  180. package/dist/core/caps/DbNotifyCaps.js.map +1 -1
  181. package/dist/core/caps/DbProjectionCaps.d.ts +5 -5
  182. package/dist/core/caps/DbProjectionCaps.d.ts.map +1 -1
  183. package/dist/core/caps/DbProjectionCaps.js +21 -4
  184. package/dist/core/caps/DbProjectionCaps.js.map +1 -1
  185. package/dist/core/caps/DbSubscriptionCaps.d.ts +4 -6
  186. package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -1
  187. package/dist/core/caps/DbSubscriptionCaps.js +75 -66
  188. package/dist/core/caps/DbSubscriptionCaps.js.map +1 -1
  189. package/dist/core/caps/DbTagCaps.d.ts +5 -12
  190. package/dist/core/caps/DbTagCaps.d.ts.map +1 -1
  191. package/dist/core/caps/DbTagCaps.js +20 -11
  192. package/dist/core/caps/DbTagCaps.js.map +1 -1
  193. package/dist/core/caps/SchemeCtxImpl.d.ts +6 -1
  194. package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -1
  195. package/dist/core/caps/SchemeCtxImpl.js +6 -6
  196. package/dist/core/caps/SchemeCtxImpl.js.map +1 -1
  197. package/dist/core/content-hash.js +1 -1
  198. package/dist/core/content-hash.js.map +1 -1
  199. package/dist/core/env-defaults.d.ts.map +1 -1
  200. package/dist/core/env-defaults.js.map +1 -1
  201. package/dist/core/fork.d.ts.map +1 -1
  202. package/dist/core/fork.js +55 -30
  203. package/dist/core/fork.js.map +1 -1
  204. package/dist/core/fork.sql +43 -29
  205. package/dist/core/git-env.d.ts +2 -0
  206. package/dist/core/git-env.d.ts.map +1 -1
  207. package/dist/core/git-env.js +13 -18
  208. package/dist/core/git-env.js.map +1 -1
  209. package/dist/core/git-iso.d.ts +3 -2
  210. package/dist/core/git-iso.d.ts.map +1 -1
  211. package/dist/core/git-iso.js +36 -27
  212. package/dist/core/git-iso.js.map +1 -1
  213. package/dist/core/git-membership.d.ts +2 -1
  214. package/dist/core/git-membership.d.ts.map +1 -1
  215. package/dist/core/git-membership.js +276 -162
  216. package/dist/core/git-membership.js.map +1 -1
  217. package/dist/core/git-state.d.ts +8 -1
  218. package/dist/core/git-state.d.ts.map +1 -1
  219. package/dist/core/git-state.js +44 -26
  220. package/dist/core/git-state.js.map +1 -1
  221. package/dist/core/namespace.d.ts +1 -0
  222. package/dist/core/namespace.d.ts.map +1 -1
  223. package/dist/core/namespace.js +20 -0
  224. package/dist/core/namespace.js.map +1 -1
  225. package/dist/core/optimistic-settlement.d.ts +2 -0
  226. package/dist/core/optimistic-settlement.d.ts.map +1 -0
  227. package/dist/core/optimistic-settlement.js +14 -0
  228. package/dist/core/optimistic-settlement.js.map +1 -0
  229. package/dist/core/owner.sql +1 -1
  230. package/dist/core/packet-inject.d.ts.map +1 -1
  231. package/dist/core/packet-inject.js +7 -11
  232. package/dist/core/packet-inject.js.map +1 -1
  233. package/dist/core/packet-wire.d.ts +3 -21
  234. package/dist/core/packet-wire.d.ts.map +1 -1
  235. package/dist/core/packet-wire.js +305 -385
  236. package/dist/core/packet-wire.js.map +1 -1
  237. package/dist/core/plurnk-uri.d.ts +12 -1
  238. package/dist/core/plurnk-uri.d.ts.map +1 -1
  239. package/dist/core/plurnk-uri.js +49 -29
  240. package/dist/core/plurnk-uri.js.map +1 -1
  241. package/dist/core/results.d.ts +18 -5
  242. package/dist/core/results.d.ts.map +1 -1
  243. package/dist/core/results.js +33 -18
  244. package/dist/core/results.js.map +1 -1
  245. package/dist/core/ruler_count.d.ts +4 -0
  246. package/dist/core/ruler_count.d.ts.map +1 -0
  247. package/dist/core/ruler_count.js +7 -0
  248. package/dist/core/ruler_count.js.map +1 -0
  249. package/dist/core/scheme-types.d.ts +3 -17
  250. package/dist/core/scheme-types.d.ts.map +1 -1
  251. package/dist/core/scheme-types.js.map +1 -1
  252. package/dist/core/search-gate.d.ts.map +1 -1
  253. package/dist/core/search-gate.js +3 -11
  254. package/dist/core/search-gate.js.map +1 -1
  255. package/dist/core/teaching-corpus.d.ts +6 -0
  256. package/dist/core/teaching-corpus.d.ts.map +1 -0
  257. package/dist/core/teaching-corpus.js +23 -0
  258. package/dist/core/teaching-corpus.js.map +1 -0
  259. package/dist/core/teaching.d.ts +0 -1
  260. package/dist/core/teaching.d.ts.map +1 -1
  261. package/dist/core/teaching.js +2 -8
  262. package/dist/core/teaching.js.map +1 -1
  263. package/dist/core/token-ruler.d.ts.map +1 -1
  264. package/dist/core/token-ruler.js +3 -16
  265. package/dist/core/token-ruler.js.map +1 -1
  266. package/dist/core/turn-scheduler.d.ts +1 -1
  267. package/dist/core/turn-scheduler.d.ts.map +1 -1
  268. package/dist/core/turn-scheduler.js +1 -1
  269. package/dist/core/turn-scheduler.js.map +1 -1
  270. package/dist/core/worker-cap.d.ts +2 -4
  271. package/dist/core/worker-cap.d.ts.map +1 -1
  272. package/dist/core/worker-cap.js +13 -4
  273. package/dist/core/worker-cap.js.map +1 -1
  274. package/dist/core/{run-ops.sql → worker-ops.sql} +14 -14
  275. package/dist/core/workspace-settings.d.ts.map +1 -1
  276. package/dist/core/workspace-settings.js +17 -9
  277. package/dist/core/workspace-settings.js.map +1 -1
  278. package/dist/digest/Digest.d.ts +2 -1
  279. package/dist/digest/Digest.d.ts.map +1 -1
  280. package/dist/digest/Digest.js +510 -149
  281. package/dist/digest/Digest.js.map +1 -1
  282. package/dist/digest/digest.sql +23 -10
  283. package/dist/index.d.ts.map +1 -1
  284. package/dist/index.js +3 -5
  285. package/dist/index.js.map +1 -1
  286. package/dist/observe/api.d.ts +6 -0
  287. package/dist/observe/api.d.ts.map +1 -0
  288. package/dist/observe/api.js +11 -0
  289. package/dist/observe/api.js.map +1 -0
  290. package/dist/observe/init.d.ts +7 -0
  291. package/dist/observe/init.d.ts.map +1 -0
  292. package/dist/observe/init.js +159 -0
  293. package/dist/observe/init.js.map +1 -0
  294. package/dist/observe/metrics.d.ts +6 -0
  295. package/dist/observe/metrics.d.ts.map +1 -0
  296. package/dist/observe/metrics.js +15 -0
  297. package/dist/observe/metrics.js.map +1 -0
  298. package/dist/observe/spans.d.ts +4 -0
  299. package/dist/observe/spans.d.ts.map +1 -0
  300. package/dist/observe/spans.js +51 -0
  301. package/dist/observe/spans.js.map +1 -0
  302. package/dist/schemes/EffectPolicy.d.ts +1 -0
  303. package/dist/schemes/EffectPolicy.d.ts.map +1 -1
  304. package/dist/schemes/EffectPolicy.js +5 -2
  305. package/dist/schemes/EffectPolicy.js.map +1 -1
  306. package/dist/schemes/Exec.d.ts +9 -14
  307. package/dist/schemes/Exec.d.ts.map +1 -1
  308. package/dist/schemes/Exec.js +402 -262
  309. package/dist/schemes/Exec.js.map +1 -1
  310. package/dist/schemes/ExecOutputScheme.d.ts +9 -9
  311. package/dist/schemes/ExecOutputScheme.d.ts.map +1 -1
  312. package/dist/schemes/ExecOutputScheme.js +49 -18
  313. package/dist/schemes/ExecOutputScheme.js.map +1 -1
  314. package/dist/schemes/File.d.ts +7 -13
  315. package/dist/schemes/File.d.ts.map +1 -1
  316. package/dist/schemes/File.js +280 -151
  317. package/dist/schemes/File.js.map +1 -1
  318. package/dist/schemes/Log.d.ts +8 -12
  319. package/dist/schemes/Log.d.ts.map +1 -1
  320. package/dist/schemes/Log.js +402 -233
  321. package/dist/schemes/Log.js.map +1 -1
  322. package/dist/schemes/Log.sql +71 -32
  323. package/dist/schemes/Prompt.d.ts +3 -3
  324. package/dist/schemes/Prompt.d.ts.map +1 -1
  325. package/dist/schemes/Prompt.js +10 -10
  326. package/dist/schemes/Prompt.js.map +1 -1
  327. package/dist/schemes/Skill.d.ts +2 -3
  328. package/dist/schemes/Skill.d.ts.map +1 -1
  329. package/dist/schemes/Skill.js +2 -6
  330. package/dist/schemes/Skill.js.map +1 -1
  331. package/dist/schemes/Worker.d.ts +11 -19
  332. package/dist/schemes/Worker.d.ts.map +1 -1
  333. package/dist/schemes/Worker.js +210 -89
  334. package/dist/schemes/Worker.js.map +1 -1
  335. package/dist/schemes/_entry-chunk.d.ts.map +1 -1
  336. package/dist/schemes/_entry-chunk.js +12 -5
  337. package/dist/schemes/_entry-chunk.js.map +1 -1
  338. package/dist/schemes/_entry-crud.d.ts +11 -9
  339. package/dist/schemes/_entry-crud.d.ts.map +1 -1
  340. package/dist/schemes/_entry-crud.js +72 -13
  341. package/dist/schemes/_entry-crud.js.map +1 -1
  342. package/dist/schemes/_entry-crud.sql +28 -10
  343. package/dist/schemes/_entry-find.d.ts +49 -18
  344. package/dist/schemes/_entry-find.d.ts.map +1 -1
  345. package/dist/schemes/_entry-find.js +348 -195
  346. package/dist/schemes/_entry-find.js.map +1 -1
  347. package/dist/schemes/_entry-find.sql +20 -8
  348. package/dist/schemes/_entry-graph.d.ts +4 -2
  349. package/dist/schemes/_entry-graph.d.ts.map +1 -1
  350. package/dist/schemes/_entry-graph.js +55 -31
  351. package/dist/schemes/_entry-graph.js.map +1 -1
  352. package/dist/schemes/_entry-graph.sql +37 -22
  353. package/dist/schemes/_entry-manifest.d.ts +10 -15
  354. package/dist/schemes/_entry-manifest.d.ts.map +1 -1
  355. package/dist/schemes/_entry-manifest.js +50 -268
  356. package/dist/schemes/_entry-manifest.js.map +1 -1
  357. package/dist/schemes/_entry-ops.d.ts +14 -15
  358. package/dist/schemes/_entry-ops.d.ts.map +1 -1
  359. package/dist/schemes/_entry-ops.js +121 -110
  360. package/dist/schemes/_entry-ops.js.map +1 -1
  361. package/dist/schemes/_entry-ops.sql +2 -3
  362. package/dist/schemes/_entry-semantic.d.ts +22 -9
  363. package/dist/schemes/_entry-semantic.d.ts.map +1 -1
  364. package/dist/schemes/_entry-semantic.js +127 -67
  365. package/dist/schemes/_entry-semantic.js.map +1 -1
  366. package/dist/schemes/_entry-semantic.sql +63 -45
  367. package/dist/schemes/_entry-send.d.ts +3 -4
  368. package/dist/schemes/_entry-send.d.ts.map +1 -1
  369. package/dist/schemes/_entry-send.js +48 -23
  370. package/dist/schemes/_entry-send.js.map +1 -1
  371. package/dist/schemes/_path-scope.d.ts +23 -0
  372. package/dist/schemes/_path-scope.d.ts.map +1 -0
  373. package/dist/schemes/_path-scope.js +61 -0
  374. package/dist/schemes/_path-scope.js.map +1 -0
  375. package/dist/schemes/_search-candidate.d.ts +20 -0
  376. package/dist/schemes/_search-candidate.d.ts.map +1 -0
  377. package/dist/schemes/_search-candidate.js +19 -0
  378. package/dist/schemes/_search-candidate.js.map +1 -0
  379. package/dist/schemes/_search-exclusion.d.ts +7 -0
  380. package/dist/schemes/_search-exclusion.d.ts.map +1 -0
  381. package/dist/schemes/_search-exclusion.js +23 -0
  382. package/dist/schemes/_search-exclusion.js.map +1 -0
  383. package/dist/schemes/_search-index.d.ts +6 -0
  384. package/dist/schemes/_search-index.d.ts.map +1 -0
  385. package/dist/schemes/_search-index.js +328 -0
  386. package/dist/schemes/_search-index.js.map +1 -0
  387. package/dist/schemes/cosine.js +1 -1
  388. package/dist/schemes/cosine.js.map +1 -1
  389. package/dist/schemes/exec-abort.js +3 -3
  390. package/dist/schemes/exec-abort.js.map +1 -1
  391. package/dist/schemes/exec-env.js +3 -3
  392. package/dist/schemes/exec-env.js.map +1 -1
  393. package/dist/server/BranchBatches.d.ts +49 -0
  394. package/dist/server/BranchBatches.d.ts.map +1 -0
  395. package/dist/server/BranchBatches.js +592 -0
  396. package/dist/server/BranchBatches.js.map +1 -0
  397. package/dist/server/Daemon.d.ts +39 -71
  398. package/dist/server/Daemon.d.ts.map +1 -1
  399. package/dist/server/Daemon.js +1133 -491
  400. package/dist/server/Daemon.js.map +1 -1
  401. package/dist/server/DaemonModule.d.ts +31 -0
  402. package/dist/server/DaemonModule.d.ts.map +1 -0
  403. package/dist/server/DaemonModule.js +2 -0
  404. package/dist/server/DaemonModule.js.map +1 -0
  405. package/dist/server/branch-batch.sql +154 -0
  406. package/dist/server/client-input.d.ts +13 -0
  407. package/dist/server/client-input.d.ts.map +1 -1
  408. package/dist/server/client-input.js +268 -57
  409. package/dist/server/client-input.js.map +1 -1
  410. package/dist/server/dispatch-as-plurnk.d.ts +1 -1
  411. package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
  412. package/dist/server/dispatch-as-plurnk.js +15 -7
  413. package/dist/server/dispatch-as-plurnk.js.map +1 -1
  414. package/dist/server/drain.sql +96 -65
  415. package/dist/server/envelope.d.ts +4 -7
  416. package/dist/server/envelope.d.ts.map +1 -1
  417. package/dist/server/envelope.js +118 -95
  418. package/dist/server/envelope.js.map +1 -1
  419. package/dist/server/envelope.sql +18 -23
  420. package/dist/server/exec-poll-backoff.js +1 -1
  421. package/dist/server/exec-poll-backoff.js.map +1 -1
  422. package/dist/server/lifecycle-recovery.sql +112 -2
  423. package/dist/server/logEntry.d.ts +4 -2
  424. package/dist/server/logEntry.d.ts.map +1 -1
  425. package/dist/server/logEntry.js +6 -3
  426. package/dist/server/logEntry.js.map +1 -1
  427. package/dist/server/logEntry.sql +1 -1
  428. package/dist/server/loop-model.d.ts.map +1 -1
  429. package/dist/server/loop-model.js +22 -9
  430. package/dist/server/loop-model.js.map +1 -1
  431. package/dist/server/loopDocs.d.ts.map +1 -1
  432. package/dist/server/loopDocs.js +5 -4
  433. package/dist/server/loopDocs.js.map +1 -1
  434. package/dist/server/seam-entry-read.sql +15 -10
  435. package/dist/server/seam-log-read.sql +2 -2
  436. package/dist/server/seam-loop.sql +1 -1
  437. package/dist/server/seam-proposal-list.sql +17 -7
  438. package/dist/service.d.ts.map +1 -1
  439. package/dist/service.js +79 -61
  440. package/dist/service.js.map +1 -1
  441. package/migrations/001_schema.sql +1010 -0
  442. package/package.json +65 -32
  443. package/dist/core/PluginLoader.d.ts +0 -20
  444. package/dist/core/PluginLoader.d.ts.map +0 -1
  445. package/dist/core/PluginLoader.js +0 -142
  446. package/dist/core/PluginLoader.js.map +0 -1
  447. package/dist/core/TelemetryChannel.d.ts +0 -37
  448. package/dist/core/TelemetryChannel.d.ts.map +0 -1
  449. package/dist/core/TelemetryChannel.js +0 -80
  450. package/dist/core/TelemetryChannel.js.map +0 -1
  451. package/dist/core/path-decode.d.ts +0 -3
  452. package/dist/core/path-decode.d.ts.map +0 -1
  453. package/dist/core/path-decode.js +0 -9
  454. package/dist/core/path-decode.js.map +0 -1
  455. package/dist/core/plugin-attribution.d.ts +0 -5
  456. package/dist/core/plugin-attribution.d.ts.map +0 -1
  457. package/dist/core/plugin-attribution.js +0 -39
  458. package/dist/core/plugin-attribution.js.map +0 -1
  459. package/dist/core/world-state.d.ts +0 -10
  460. package/dist/core/world-state.d.ts.map +0 -1
  461. package/dist/core/world-state.js +0 -35
  462. package/dist/core/world-state.js.map +0 -1
  463. package/dist/core/world-state.sql +0 -35
  464. package/dist/core/zero-pin.d.ts +0 -3
  465. package/dist/core/zero-pin.d.ts.map +0 -1
  466. package/dist/core/zero-pin.js +0 -16
  467. package/dist/core/zero-pin.js.map +0 -1
  468. package/dist/server/auto.d.ts +0 -6
  469. package/dist/server/auto.d.ts.map +0 -1
  470. package/dist/server/auto.js +0 -63
  471. package/dist/server/auto.js.map +0 -1
  472. package/dist/server/clientTurn.d.ts +0 -6
  473. package/dist/server/clientTurn.d.ts.map +0 -1
  474. package/dist/server/clientTurn.js +0 -22
  475. package/dist/server/clientTurn.js.map +0 -1
  476. package/dist/server/clientTurn.sql +0 -10
  477. package/dist/server/noProposals.d.ts +0 -6
  478. package/dist/server/noProposals.d.ts.map +0 -1
  479. package/dist/server/noProposals.js +0 -37
  480. package/dist/server/noProposals.js.map +0 -1
  481. package/dist/server/version-info.d.ts +0 -14
  482. package/dist/server/version-info.d.ts.map +0 -1
  483. package/dist/server/version-info.js +0 -69
  484. package/dist/server/version-info.js.map +0 -1
  485. package/migrations/0000-00-00.01_schema.sql +0 -536
  486. package/migrations/0004_loop-provider.sql +0 -3
  487. package/migrations/0005_subscription-published-channel.sql +0 -3
  488. package/migrations/0006_loop-max-turns.sql +0 -3
@@ -1,4 +1,4 @@
1
- // SPEC §exec {§exec-env-scoped} — the environment an EXEC subprocess receives.
1
+ // SPEC {§exec} {§exec-env-scoped} — the environment an EXEC subprocess receives.
2
2
  //
3
3
  // It gets the *project's* environment (its `.env`, the standard shell vars like PATH
4
4
  // and HOME) so the model's commands run as the project expects — but never plurnk's
@@ -9,8 +9,8 @@
9
9
  //
10
10
  // A denylist, not an allowlist: a subprocess needs the long tail of inherited vars
11
11
  // (PATH, HOME, LANG, the project's own keys); only plurnk's two owned families are
12
- // stripped. The service owns this policy; the executor (plurnk-execs SubprocessExecutor,
13
- // plurnk-execs#8) spawns with the env it is handed.
12
+ // stripped. The service owns this policy; the subprocess executor spawns with
13
+ // the environment it is handed.
14
14
  import { providerCredentialEnvNames } from "@plurnk/plurnk-models";
15
15
  export default class ExecEnv {
16
16
  // Read at call time (not memoized) so a secret set into process.env after boot is
@@ -1 +1 @@
1
- {"version":3,"file":"exec-env.js","sourceRoot":"","sources":["../../src/schemes/exec-env.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,qFAAqF;AACrF,oFAAoF;AACpF,8EAA8E;AAC9E,yFAAyF;AACzF,2GAA2G;AAC3G,kEAAkE;AAClE,EAAE;AACF,mFAAmF;AACnF,mFAAmF;AACnF,yFAAyF;AACzF,oDAAoD;AAEpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,CAAC,OAAO,OAAO,OAAO;IACxB,kFAAkF;IAClF,sCAAsC;IACtC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;QAC9C,MAAM,YAAY,GAAG,IAAI,GAAG,CACxB,0BAA0B,EAAE,CAC/B,CAAC;QACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAAE,SAAS;YAC7F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;oBAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtD,CAAC;QACL,CAAC;QACD,MAAM,GAAG,GAAsB,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAE,uCAAuC;YAC1G,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;CACJ"}
1
+ {"version":3,"file":"exec-env.js","sourceRoot":"","sources":["../../src/schemes/exec-env.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,EAAE;AACF,qFAAqF;AACrF,oFAAoF;AACpF,8EAA8E;AAC9E,yFAAyF;AACzF,2GAA2G;AAC3G,kEAAkE;AAClE,EAAE;AACF,mFAAmF;AACnF,mFAAmF;AACnF,8EAA8E;AAC9E,gCAAgC;AAEhC,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,CAAC,OAAO,OAAO,OAAO;IACxB,kFAAkF;IAClF,sCAAsC;IACtC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG;QAC9C,MAAM,YAAY,GAAG,IAAI,GAAG,CACxB,0BAA0B,EAAE,CAC/B,CAAC;QACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAAE,SAAS;YAC7F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;oBAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtD,CAAC;QACL,CAAC;QACD,MAAM,GAAG,GAAsB,EAAE,CAAC;QAClC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAE,uCAAuC;YAC1G,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;CACJ"}
@@ -0,0 +1,49 @@
1
+ import type { Db } from "../core/Db.ts";
2
+ import { type SchemeResult } from "../core/results.ts";
3
+ import type { LoopFlags, WriterTier } from "../core/types.ts";
4
+ import type WorkspaceGate from "../core/WorkspaceGate.ts";
5
+ export interface EnqueueBranchWorker {
6
+ workspaceId: number;
7
+ parentWorkerId: number;
8
+ parentLoopId: number;
9
+ op: "WORK" | "FORK";
10
+ name: string;
11
+ prompt: string;
12
+ flags: LoopFlags;
13
+ origin: WriterTier;
14
+ }
15
+ export interface BranchBatchDependencies {
16
+ settleWorkspace(workspaceId: number): Promise<void>;
17
+ createChild(args: EnqueueBranchWorker): Promise<{
18
+ workerId: number;
19
+ loopId: number;
20
+ }>;
21
+ startChild(workspaceId: number, workerId: number, loopId: number): Promise<SchemeResult>;
22
+ wakeParent(workspaceId: number, workerId: number): Promise<void>;
23
+ notify(workspaceId: number, payload: Readonly<Record<string, unknown>>): void;
24
+ }
25
+ export default class BranchBatches {
26
+ #private;
27
+ constructor(db: Db, gate: WorkspaceGate, dependencies: BranchBatchDependencies);
28
+ enqueue(args: {
29
+ workspaceId: number;
30
+ parentWorkerId: number;
31
+ parentLoopId: number;
32
+ parentTurnId: number;
33
+ op: "WORK" | "FORK";
34
+ name: string;
35
+ branch: string;
36
+ prompt: string;
37
+ flags: LoopFlags;
38
+ origin: WriterTier;
39
+ }): Promise<{
40
+ workerId: number;
41
+ loopId: number;
42
+ }>;
43
+ sealTurn(parentTurnId: number): Promise<void>;
44
+ completionGate(workerId: number): Promise<SchemeResult | null>;
45
+ recover(): Promise<void>;
46
+ idle(): Promise<void>;
47
+ beginStop(): void;
48
+ }
49
+ //# sourceMappingURL=BranchBatches.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BranchBatches.d.ts","sourceRoot":"","sources":["../../src/server/BranchBatches.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAKxC,OAAgB,EAAyB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAC;AA8B1D,MAAM,WAAW,mBAAmB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACpC,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,WAAW,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtF,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACzF,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;CACjF;AAID,MAAM,CAAC,OAAO,OAAO,aAAa;;IAQ9B,YAAY,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,uBAAuB,EAK7E;IAEK,OAAO,CAAC,IAAI,EAAE;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,SAAS,CAAC;QACjB,MAAM,EAAE,UAAU,CAAC;KACtB,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CA8HhD;IAKK,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBlD;IAEK,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA8CnE;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CA0B7B;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1B;IAED,SAAS,IAAI,IAAI,CAEhB;CAqeJ"}
@@ -0,0 +1,592 @@
1
+ var _a;
2
+ import ErrorDetail from "../core/ErrorDetail.js";
3
+ import GitBranch from "../core/GitBranch.js";
4
+ import GitMembership from "../core/git-membership.js";
5
+ import LoopLifecycle from "../core/LoopLifecycle.js";
6
+ import Results, { OperationFailureError } from "../core/results.js";
7
+ // Durable coordinator for branch-tagged WORK/FORK. It owns the Git transaction;
8
+ // worker creation and drain execution remain daemon lifecycle responsibilities.
9
+ class BranchBatches {
10
+ #db;
11
+ #gate;
12
+ #lifecycle;
13
+ #deps;
14
+ #running = new Map();
15
+ #stopping = false;
16
+ constructor(db, gate, dependencies) {
17
+ this.#db = db;
18
+ this.#gate = gate;
19
+ this.#lifecycle = new LoopLifecycle(db);
20
+ this.#deps = dependencies;
21
+ }
22
+ async enqueue(args) {
23
+ try {
24
+ await GitBranch.validate(args.branch);
25
+ }
26
+ catch (cause) {
27
+ throw _a.#failure("branch-name-invalid", 400, `Git rejected branch name '${args.branch}'.`, {
28
+ branch: args.branch,
29
+ recovery: "Use a valid Git branch name.",
30
+ retryable: false,
31
+ }, cause);
32
+ }
33
+ let batch = await this.#db.branch_batch_by_turn.get({
34
+ parent_turn_id: args.parentTurnId,
35
+ });
36
+ if (batch === undefined) {
37
+ const repository = await GitMembership.projectRepository(this.#db, args.workspaceId);
38
+ if (repository === null) {
39
+ throw _a.#failure("branch-workspace-has-no-repository", 409, "A branch-tagged worker requires a Git repository containing the workspace project root.", {
40
+ recovery: "Create the worker without a branch tag.",
41
+ retryable: false,
42
+ });
43
+ }
44
+ const active = (await this.#db.branch_batch_active.all({}))
45
+ .find((row) => row.workspace_id === args.workspaceId);
46
+ if (active !== undefined) {
47
+ throw _a.#failure("branch-batch-already-active", 409, `Workspace ${args.workspaceId} already has branch batch ${active.id} in state '${active.state}'.`, {
48
+ batchId: active.id,
49
+ batchState: active.state,
50
+ recovery: "Finish or abort the active branch batch before starting another.",
51
+ retryable: false,
52
+ });
53
+ }
54
+ batch = await this.#db.branch_batch_insert.get({
55
+ workspace_id: args.workspaceId,
56
+ parent_worker_id: args.parentWorkerId,
57
+ parent_loop_id: args.parentLoopId,
58
+ parent_turn_id: args.parentTurnId,
59
+ });
60
+ if (batch === undefined)
61
+ throw new Error("Branch batch insert returned no row");
62
+ }
63
+ if (batch.state !== undefined && batch.state !== "collecting") {
64
+ throw _a.#failure("branch-batch-sealed", 409, `Branch batch ${batch.id} is already '${batch.state}' and cannot accept another child.`, {
65
+ batchId: batch.id,
66
+ batchState: batch.state,
67
+ recovery: "Create the branch child in a new turn.",
68
+ retryable: false,
69
+ });
70
+ }
71
+ const items = await this.#db.branch_batch_items.all({ batch_id: batch.id });
72
+ if (items.some((item) => item.branch === args.branch)) {
73
+ throw _a.#failure("branch-duplicate", 409, `Branch '${args.branch}' already belongs to another child in this turn.`, {
74
+ branch: args.branch,
75
+ recovery: "Use a distinct branch for each child in the turn.",
76
+ retryable: false,
77
+ });
78
+ }
79
+ const child = await this.#deps.createChild({
80
+ workspaceId: args.workspaceId,
81
+ parentWorkerId: args.parentWorkerId,
82
+ parentLoopId: args.parentLoopId,
83
+ op: args.op,
84
+ name: args.name,
85
+ prompt: args.prompt,
86
+ flags: args.flags,
87
+ origin: args.origin,
88
+ });
89
+ try {
90
+ const sequence = await this.#db.branch_batch_next_sequence.get({
91
+ batch_id: batch.id,
92
+ });
93
+ if (sequence === undefined)
94
+ throw new Error("Branch batch sequence query returned no row");
95
+ const item = await this.#db.branch_batch_insert_item.get({
96
+ batch_id: batch.id,
97
+ sequence: sequence.next,
98
+ worker_id: child.workerId,
99
+ loop_id: child.loopId,
100
+ branch: args.branch,
101
+ });
102
+ if (item === undefined)
103
+ throw new Error("Branch batch item insert returned no row");
104
+ }
105
+ catch (cause) {
106
+ await this.#lifecycle.finish(child.loopId, Results.failure("lifecycle:branch", "branch-batch-record-failed", 500, "The branch worker was created but could not be attached to its durable batch.", {}, {
107
+ branch: args.branch,
108
+ stage: "batch-registration",
109
+ retryable: false,
110
+ }));
111
+ throw cause;
112
+ }
113
+ return child;
114
+ }
115
+ // Called while the parent still holds its shared turn permit. requestExclusive
116
+ // queues synchronously; execution waits asynchronously until that permit and
117
+ // every earlier reader drains.
118
+ async sealTurn(parentTurnId) {
119
+ const row = await this.#db.branch_batch_seal.get({ parent_turn_id: parentTurnId });
120
+ if (row === undefined)
121
+ return;
122
+ const items = await this.#db.branch_batch_items.all({ batch_id: row.id });
123
+ this.#deps.notify(row.workspace_id, {
124
+ batchId: row.id,
125
+ state: "queued",
126
+ completed: 0,
127
+ total: items.length,
128
+ parentWorkerId: row.parent_worker_id,
129
+ });
130
+ const exclusive = this.#gate.requestExclusive(row.workspace_id);
131
+ const run = this.#execute(row.id, row.workspace_id, row.parent_worker_id, exclusive);
132
+ this.#track(row.id, run);
133
+ }
134
+ async completionGate(workerId) {
135
+ const active = await this.#db.branch_batch_active_for_worker.get({ worker_id: workerId });
136
+ if (active === undefined || active.state !== "running")
137
+ return null;
138
+ if (active.repository_path === null) {
139
+ throw new Error(`Running branch batch ${active.batch_id} has no project repository snapshot`);
140
+ }
141
+ const current = await GitBranch.currentBranch(active.repository_path);
142
+ if (current !== active.branch) {
143
+ return Results.failure("lifecycle:branch", "branch-checkout-changed", 409, `Branch '${active.branch}' cannot conclude while the project repository is checked out at '${current ?? "detached HEAD"}'.`, {}, {
144
+ branch: active.branch,
145
+ currentBranch: current,
146
+ stage: "branch-completion",
147
+ recovery: "Restore the assigned branch, commit the work, and conclude again.",
148
+ retryable: false,
149
+ });
150
+ }
151
+ try {
152
+ await GitBranch.assertClean(active.repository_path);
153
+ }
154
+ catch {
155
+ return Results.failure("lifecycle:branch", "branch-work-uncommitted", 409, `Branch '${active.branch}' cannot conclude with uncommitted project changes.`, {}, {
156
+ branch: active.branch,
157
+ stage: "branch-completion",
158
+ recovery: "Commit or deliberately discard the changes before concluding again.",
159
+ retryable: false,
160
+ });
161
+ }
162
+ return null;
163
+ }
164
+ async recover() {
165
+ for (const batch of await this.#db.branch_batch_active.all({})) {
166
+ if (batch.state === "collecting") {
167
+ await this.#failUnstarted(batch, Results.failure("lifecycle:branch", "branch-parent-interrupted", 500, "The daemon restarted before the parent turn sealed its branch batch.", {}, {
168
+ stage: "batch-sealing",
169
+ recovery: "Create a new branch batch for the unfinished work.",
170
+ retryable: false,
171
+ }));
172
+ continue;
173
+ }
174
+ const exclusive = this.#gate.requestExclusive(batch.workspace_id);
175
+ const run = batch.state === "queued"
176
+ ? this.#recoverQueued(batch, exclusive)
177
+ : this.#recoverRunning(batch, exclusive);
178
+ this.#track(batch.id, run);
179
+ }
180
+ }
181
+ async idle() {
182
+ await Promise.allSettled(this.#running.values());
183
+ }
184
+ beginStop() {
185
+ this.#stopping = true;
186
+ }
187
+ async #execute(batchId, workspaceId, parentWorkerId, exclusive) {
188
+ await exclusive.acquired;
189
+ const created = [];
190
+ let started = false;
191
+ let release = true;
192
+ try {
193
+ await this.#deps.settleWorkspace(workspaceId);
194
+ const open = await this.#db.branch_batch_workspace_open_subscriptions.get({
195
+ workspace_id: workspaceId,
196
+ });
197
+ if ((open?.n ?? 0) !== 0) {
198
+ throw _a.#failure("branch-streams-open", 409, `The workspace has ${open?.n ?? 0} open stream subscription(s).`, {
199
+ openSubscriptions: open?.n ?? 0,
200
+ stage: "stream-settlement",
201
+ recovery: "Close the active streams before creating a branch batch.",
202
+ retryable: false,
203
+ });
204
+ }
205
+ const items = await this.#db.branch_batch_items.all({ batch_id: batchId });
206
+ const repository = await GitMembership.projectRepository(this.#db, workspaceId);
207
+ if (repository === null) {
208
+ throw _a.#failure("branch-workspace-has-no-repository", 409, "The workspace project root is not inside an enabled Git repository.", {
209
+ stage: "git-preflight",
210
+ recovery: "Create workers without branch tags in a workspace that has no project repository.",
211
+ retryable: false,
212
+ });
213
+ }
214
+ try {
215
+ await GitBranch.assertClean(repository);
216
+ }
217
+ catch (cause) {
218
+ throw _a.#failure("branch-checkout-dirty", 409, "The project repository has staged, unstaged, or nonignored untracked changes.", {
219
+ stage: "git-preflight",
220
+ recovery: "Commit or deliberately discard the project repository changes before creating a branch batch.",
221
+ retryable: false,
222
+ }, cause);
223
+ }
224
+ const snapshot = await GitBranch.snapshot(repository);
225
+ for (const item of items) {
226
+ await GitBranch.validate(item.branch);
227
+ if (await GitBranch.branchExists(repository, item.branch)) {
228
+ throw _a.#failure("branch-already-exists", 409, `Git branch '${item.branch}' already exists in the project repository.`, {
229
+ branch: item.branch,
230
+ stage: "git-preflight",
231
+ recovery: "Use a branch name that does not already exist.",
232
+ retryable: false,
233
+ });
234
+ }
235
+ }
236
+ for (const item of items) {
237
+ await GitBranch.create(repository, item.branch, snapshot.commit);
238
+ created.push(item.branch);
239
+ }
240
+ await this.#db.branch_batch_start.run({
241
+ batch_id: batchId,
242
+ repository_path: repository,
243
+ original_ref: snapshot.ref,
244
+ original_commit: snapshot.commit,
245
+ });
246
+ started = true;
247
+ this.#deps.notify(workspaceId, {
248
+ batchId,
249
+ state: "running",
250
+ completed: 0,
251
+ total: items.length,
252
+ });
253
+ await this.#runItems(batchId, workspaceId, parentWorkerId, snapshot, items, exclusive);
254
+ }
255
+ catch (cause) {
256
+ if (cause instanceof RecoveryRequiredError) {
257
+ release = false;
258
+ }
259
+ else if (started) {
260
+ release = false;
261
+ await this.#requireRecovery({
262
+ id: batchId,
263
+ workspace_id: workspaceId,
264
+ }, cause);
265
+ }
266
+ else {
267
+ try {
268
+ const repository = await GitMembership.projectRepository(this.#db, workspaceId);
269
+ if (repository === null && created.length > 0) {
270
+ throw new Error("The project repository disappeared during branch preflight");
271
+ }
272
+ if (repository !== null)
273
+ await this.#rollbackPreflight(repository, created);
274
+ }
275
+ catch (rollbackCause) {
276
+ release = false;
277
+ await this.#requireRecovery({
278
+ id: batchId,
279
+ workspace_id: workspaceId,
280
+ }, new AggregateError([cause, rollbackCause], "Branch preflight and rollback both failed"));
281
+ return;
282
+ }
283
+ const failure = cause instanceof OperationFailureError
284
+ ? cause.result
285
+ : Results.failure("lifecycle:branch", "branch-batch-preflight-failed", 500, `Branch batch ${batchId} failed during preflight.`, {}, {
286
+ batchId,
287
+ stage: "git-preflight",
288
+ retryable: false,
289
+ });
290
+ await this.#failBatch(batchId, failure);
291
+ this.#deps.notify(workspaceId, {
292
+ batchId,
293
+ state: "failed",
294
+ problem: failure.problem,
295
+ });
296
+ }
297
+ }
298
+ finally {
299
+ if (release) {
300
+ exclusive.release();
301
+ await this.#deps.wakeParent(workspaceId, parentWorkerId);
302
+ }
303
+ }
304
+ }
305
+ async #runItems(batchId, workspaceId, parentWorkerId, snapshot, items, exclusive) {
306
+ for (const item of items.filter(({ state }) => state === "queued")) {
307
+ if (this.#stopping) {
308
+ const failure = Results.failure("lifecycle:branch", "branch-batch-stopped", 499, "The daemon stopped before the remaining branch children started.", {}, {
309
+ batchId,
310
+ stage: "branch-scheduling",
311
+ retryable: false,
312
+ });
313
+ await this.#failBatch(batchId, failure);
314
+ this.#deps.notify(workspaceId, {
315
+ batchId,
316
+ state: "failed",
317
+ problem: failure.problem,
318
+ });
319
+ return;
320
+ }
321
+ await GitBranch.switch(snapshot.root, item.branch);
322
+ await this.#db.branch_batch_start_item.run({ item_id: item.id });
323
+ await this.#db.branch_batch_set_active.run({
324
+ batch_id: batchId,
325
+ sequence: item.sequence,
326
+ });
327
+ exclusive.setRoot(item.worker_id);
328
+ this.#deps.notify(workspaceId, {
329
+ batchId,
330
+ state: "running",
331
+ activeSequence: item.sequence,
332
+ branch: item.branch,
333
+ workerId: item.worker_id,
334
+ completed: item.sequence - 1,
335
+ total: items.length,
336
+ });
337
+ let result;
338
+ try {
339
+ result = await this.#deps.startChild(workspaceId, item.worker_id, item.loop_id);
340
+ }
341
+ catch (cause) {
342
+ console.error(`Branch child '${item.branch}' failed outside its terminal result contract:`, cause);
343
+ result = await this.#lifecycle.result(item.loop_id)
344
+ ?? Results.failure("lifecycle:branch", "branch-child-threw", 500, `Branch child '${item.branch}' failed outside its terminal result contract.`, {}, {
345
+ branch: item.branch,
346
+ stage: "child-loop",
347
+ retryable: false,
348
+ });
349
+ }
350
+ exclusive.setRoot(null);
351
+ try {
352
+ await this.#assertAssignedAndClean(snapshot.root, item.branch);
353
+ await this.#recordTip(item, snapshot);
354
+ await this.#restore(snapshot);
355
+ }
356
+ catch (cause) {
357
+ const failure = Results.failure("lifecycle:branch", "branch-recovery-required", 500, `Branch '${item.branch}' returned with ambiguous Git state: ${ErrorDetail.preview(cause)}`, {}, {
358
+ branch: item.branch,
359
+ batchId,
360
+ stage: "git-restoration",
361
+ retryable: false,
362
+ });
363
+ await this.#db.branch_batch_finish_item.run({
364
+ item_id: item.id,
365
+ state: "recovery_required",
366
+ result: JSON.stringify(failure),
367
+ });
368
+ await this.#db.branch_batch_finish.run({
369
+ batch_id: batchId,
370
+ state: "recovery_required",
371
+ problem: JSON.stringify(failure.problem),
372
+ });
373
+ this.#deps.notify(workspaceId, {
374
+ batchId,
375
+ state: "recovery_required",
376
+ branch: item.branch,
377
+ problem: failure.problem,
378
+ });
379
+ throw new RecoveryRequiredError(failure.problem?.detail ?? "Branch recovery required");
380
+ }
381
+ await this.#db.branch_batch_finish_item.run({
382
+ item_id: item.id,
383
+ state: result.status >= 200 && result.status < 300 ? "succeeded" : "failed",
384
+ result: JSON.stringify(result),
385
+ });
386
+ }
387
+ await this.#db.branch_batch_finish.run({
388
+ batch_id: batchId,
389
+ state: "completed",
390
+ problem: null,
391
+ });
392
+ this.#deps.notify(workspaceId, {
393
+ batchId,
394
+ state: "completed",
395
+ completed: items.length,
396
+ total: items.length,
397
+ parentWorkerId,
398
+ });
399
+ }
400
+ async #recoverQueued(batch, exclusive) {
401
+ await exclusive.acquired;
402
+ let replacement = null;
403
+ try {
404
+ const snapshot = _a.#snapshot(batch);
405
+ if (snapshot !== null) {
406
+ const items = await this.#db.branch_batch_items.all({ batch_id: batch.id });
407
+ await GitBranch.assertClean(snapshot.root);
408
+ await GitBranch.restore(snapshot);
409
+ for (const item of items) {
410
+ if (await GitBranch.branchExists(snapshot.root, item.branch)) {
411
+ const tip = await GitBranch.tip(snapshot.root, item.branch);
412
+ if (tip !== snapshot.commit) {
413
+ throw new Error(`Partially-created branch '${item.branch}' moved from its frozen base`);
414
+ }
415
+ await GitBranch.delete(snapshot.root, item.branch);
416
+ }
417
+ }
418
+ await this.#db.branch_batch_reset_preflight.run({ batch_id: batch.id });
419
+ }
420
+ replacement = this.#gate.requestExclusive(batch.workspace_id);
421
+ }
422
+ catch (cause) {
423
+ await this.#requireRecovery(batch, cause);
424
+ return;
425
+ }
426
+ finally {
427
+ if (replacement !== null)
428
+ exclusive.release();
429
+ }
430
+ if (replacement === null)
431
+ return;
432
+ await this.#execute(batch.id, batch.workspace_id, batch.parent_worker_id, replacement);
433
+ }
434
+ async #recoverRunning(batch, exclusive) {
435
+ await exclusive.acquired;
436
+ let release = true;
437
+ try {
438
+ const snapshot = _a.#snapshot(batch);
439
+ const items = await this.#db.branch_batch_items.all({ batch_id: batch.id });
440
+ if (snapshot === null)
441
+ throw new Error("Running branch batch has no project repository snapshot");
442
+ await GitBranch.assertClean(snapshot.root);
443
+ if (batch.active_sequence !== null) {
444
+ const item = items.find(({ sequence }) => sequence === batch.active_sequence);
445
+ if (item === undefined)
446
+ throw new Error(`Active branch sequence ${batch.active_sequence} has no item`);
447
+ const branch = await GitBranch.currentBranch(snapshot.root);
448
+ const head = await GitBranch.head(snapshot.root);
449
+ const atOriginal = branch === snapshot.ref && head === snapshot.commit;
450
+ if (branch !== item.branch && !atOriginal) {
451
+ throw new Error(`The project repository is at '${branch ?? "detached HEAD"}', not '${item.branch}' or its original position`);
452
+ }
453
+ await this.#recordTip(item, snapshot);
454
+ await this.#restore(snapshot);
455
+ const failure = Results.failure("lifecycle:branch", "branch-child-interrupted", 500, `The daemon restarted while branch '${item.branch}' was active. Its committed tip was preserved.`, {}, {
456
+ branch: item.branch,
457
+ batchId: batch.id,
458
+ stage: "child-loop",
459
+ recovery: "Review the preserved branch tip before deciding how to continue.",
460
+ retryable: false,
461
+ });
462
+ await this.#db.branch_batch_finish_item.run({
463
+ item_id: item.id,
464
+ state: "failed",
465
+ result: JSON.stringify(failure),
466
+ });
467
+ }
468
+ else {
469
+ await this.#restore(snapshot);
470
+ }
471
+ await this.#runItems(batch.id, batch.workspace_id, batch.parent_worker_id, snapshot, items, exclusive);
472
+ }
473
+ catch (cause) {
474
+ release = false;
475
+ await this.#requireRecovery(batch, cause);
476
+ }
477
+ finally {
478
+ if (release) {
479
+ exclusive.release();
480
+ await this.#deps.wakeParent(batch.workspace_id, batch.parent_worker_id);
481
+ }
482
+ }
483
+ }
484
+ async #requireRecovery(batch, cause) {
485
+ console.error(`Branch batch ${batch.id} requires operator recovery:`, cause);
486
+ const failure = Results.failure("lifecycle:branch", "branch-recovery-required", 500, `Branch batch ${batch.id} requires operator recovery: ${ErrorDetail.preview(cause)}`, {}, {
487
+ batchId: batch.id,
488
+ stage: "git-restoration",
489
+ retryable: false,
490
+ });
491
+ await this.#db.branch_batch_finish.run({
492
+ batch_id: batch.id,
493
+ state: "recovery_required",
494
+ problem: JSON.stringify(failure.problem),
495
+ });
496
+ this.#deps.notify(batch.workspace_id, {
497
+ batchId: batch.id,
498
+ state: "recovery_required",
499
+ problem: failure.problem,
500
+ });
501
+ }
502
+ async #failUnstarted(batch, failure) {
503
+ await this.#failBatch(batch.id, failure);
504
+ this.#deps.notify(batch.workspace_id, {
505
+ batchId: batch.id,
506
+ state: "failed",
507
+ problem: failure.problem,
508
+ });
509
+ await this.#deps.wakeParent(batch.workspace_id, batch.parent_worker_id);
510
+ }
511
+ async #failBatch(batchId, failure) {
512
+ for (const item of await this.#db.branch_batch_items.all({ batch_id: batchId })) {
513
+ if (item.state === "queued" || item.state === "running") {
514
+ await this.#lifecycle.finish(item.loop_id, failure);
515
+ await this.#db.branch_batch_finish_item.run({
516
+ item_id: item.id,
517
+ state: "failed",
518
+ result: JSON.stringify(failure),
519
+ });
520
+ }
521
+ }
522
+ await this.#db.branch_batch_finish.run({
523
+ batch_id: batchId,
524
+ state: "failed",
525
+ problem: JSON.stringify(failure.problem),
526
+ });
527
+ }
528
+ async #recordTip(item, snapshot) {
529
+ if (item.result_commit !== null)
530
+ return;
531
+ const tip = await GitBranch.tip(snapshot.root, item.branch);
532
+ await this.#db.branch_batch_record_tip.run({
533
+ item_id: item.id,
534
+ result_commit: tip,
535
+ changed: tip === snapshot.commit ? 0 : 1,
536
+ });
537
+ }
538
+ async #restore(snapshot) {
539
+ await GitBranch.restore(snapshot);
540
+ await GitBranch.assertClean(snapshot.root);
541
+ }
542
+ async #assertAssignedAndClean(root, branch) {
543
+ const current = await GitBranch.currentBranch(root);
544
+ if (current !== branch) {
545
+ throw new Error(`The project repository is at '${current ?? "detached HEAD"}', expected '${branch}'`);
546
+ }
547
+ await GitBranch.assertClean(root);
548
+ }
549
+ async #rollbackPreflight(root, created) {
550
+ const failures = [];
551
+ for (const branch of created.toReversed()) {
552
+ try {
553
+ if (await GitBranch.branchExists(root, branch))
554
+ await GitBranch.delete(root, branch);
555
+ }
556
+ catch (error) {
557
+ failures.push(new Error(`Could not remove preflight branch '${branch}'`, { cause: error }));
558
+ }
559
+ }
560
+ if (failures.length > 0)
561
+ throw new AggregateError(failures, "Branch preflight rollback failed");
562
+ }
563
+ static #snapshot(batch) {
564
+ if (batch.repository_path === null && batch.original_commit === null)
565
+ return null;
566
+ if (batch.repository_path === null || batch.original_commit === null) {
567
+ throw new Error(`Branch batch ${batch.id} has an incomplete project repository snapshot`);
568
+ }
569
+ return {
570
+ root: batch.repository_path,
571
+ ref: batch.original_ref,
572
+ commit: batch.original_commit,
573
+ };
574
+ }
575
+ #track(batchId, run) {
576
+ this.#running.set(batchId, run);
577
+ void run.finally(() => {
578
+ if (this.#running.get(batchId) === run)
579
+ this.#running.delete(batchId);
580
+ }).catch((error) => {
581
+ console.error(`branch batch ${batchId} failed:`, error);
582
+ });
583
+ }
584
+ static #failure(code, status, detail, extensions = {}, cause) {
585
+ return new OperationFailureError(Results.failure("lifecycle:branch", code, status, detail, {}, extensions), cause === undefined ? {} : { cause });
586
+ }
587
+ }
588
+ _a = BranchBatches;
589
+ export default BranchBatches;
590
+ class RecoveryRequiredError extends Error {
591
+ }
592
+ //# sourceMappingURL=BranchBatches.js.map