@plurnk/plurnk-service 1.16.5 → 1.18.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 (661) hide show
  1. package/.env.defaults +140 -246
  2. package/INSTALL.md +84 -138
  3. package/README.md +10 -6
  4. package/SPEC.md +2468 -1694
  5. package/dist/Paths.d.ts +2 -0
  6. package/dist/Paths.d.ts.map +1 -1
  7. package/dist/Paths.js +2 -0
  8. package/dist/Paths.js.map +1 -1
  9. package/dist/build-info.d.ts.map +1 -1
  10. package/dist/build-info.js +7 -1
  11. package/dist/build-info.js.map +1 -1
  12. package/dist/build-info.json +1 -1
  13. package/dist/content/body-preview.d.ts +8 -0
  14. package/dist/content/body-preview.d.ts.map +1 -0
  15. package/dist/content/body-preview.js +39 -0
  16. package/dist/content/body-preview.js.map +1 -0
  17. package/dist/content/byte-view.d.ts +1 -4
  18. package/dist/content/byte-view.d.ts.map +1 -1
  19. package/dist/content/byte-view.js.map +1 -1
  20. package/dist/content/edit-collision.d.ts.map +1 -1
  21. package/dist/content/edit-collision.js +3 -4
  22. package/dist/content/edit-collision.js.map +1 -1
  23. package/dist/content/line-anchors.d.ts +2 -2
  24. package/dist/content/line-anchors.d.ts.map +1 -1
  25. package/dist/content/line-anchors.js +4 -3
  26. package/dist/content/line-anchors.js.map +1 -1
  27. package/dist/content/line-selection.d.ts +9 -0
  28. package/dist/content/line-selection.d.ts.map +1 -0
  29. package/dist/content/line-selection.js +29 -0
  30. package/dist/content/line-selection.js.map +1 -0
  31. package/dist/content/matcher.d.ts +0 -1
  32. package/dist/content/matcher.d.ts.map +1 -1
  33. package/dist/content/matcher.js +2 -3
  34. package/dist/content/matcher.js.map +1 -1
  35. package/dist/content/pattern-edits.d.ts +39 -0
  36. package/dist/content/pattern-edits.d.ts.map +1 -0
  37. package/dist/content/pattern-edits.js +121 -0
  38. package/dist/content/pattern-edits.js.map +1 -0
  39. package/dist/content/read-projector.d.ts +18 -9
  40. package/dist/content/read-projector.d.ts.map +1 -1
  41. package/dist/content/read-projector.js +132 -35
  42. package/dist/content/read-projector.js.map +1 -1
  43. package/dist/content/read-resolve.d.ts +4 -1
  44. package/dist/content/read-resolve.d.ts.map +1 -1
  45. package/dist/content/read-resolve.js +42 -7
  46. package/dist/content/read-resolve.js.map +1 -1
  47. package/dist/core/AdmittedTurnExecutor.d.ts +2 -5
  48. package/dist/core/AdmittedTurnExecutor.d.ts.map +1 -1
  49. package/dist/core/AdmittedTurnExecutor.js +96 -88
  50. package/dist/core/AdmittedTurnExecutor.js.map +1 -1
  51. package/dist/core/BareBatchRunner.d.ts +6 -1
  52. package/dist/core/BareBatchRunner.d.ts.map +1 -1
  53. package/dist/core/BareBatchRunner.js +20 -5
  54. package/dist/core/BareBatchRunner.js.map +1 -1
  55. package/dist/core/BudgetReadout.d.ts +2 -3
  56. package/dist/core/BudgetReadout.d.ts.map +1 -1
  57. package/dist/core/BudgetReadout.js +23 -32
  58. package/dist/core/BudgetReadout.js.map +1 -1
  59. package/dist/core/CapabilityPolicies.d.ts +3 -8
  60. package/dist/core/CapabilityPolicies.d.ts.map +1 -1
  61. package/dist/core/CapabilityPolicies.js +2 -28
  62. package/dist/core/CapabilityPolicies.js.map +1 -1
  63. package/dist/core/CapabilityResolver.d.ts +10 -10
  64. package/dist/core/CapabilityResolver.d.ts.map +1 -1
  65. package/dist/core/CapabilityResolver.js +122 -93
  66. package/dist/core/CapabilityResolver.js.map +1 -1
  67. package/dist/core/ChannelWrite.d.ts +15 -11
  68. package/dist/core/ChannelWrite.d.ts.map +1 -1
  69. package/dist/core/ChannelWrite.js +12 -13
  70. package/dist/core/ChannelWrite.js.map +1 -1
  71. package/dist/core/ChannelWrite.sql +99 -9
  72. package/dist/core/ClientInteractions.d.ts.map +1 -1
  73. package/dist/core/ClientInteractions.js +7 -0
  74. package/dist/core/ClientInteractions.js.map +1 -1
  75. package/dist/core/CoreSchemeServices.d.ts +13 -10
  76. package/dist/core/CoreSchemeServices.d.ts.map +1 -1
  77. package/dist/core/CoreSchemeServices.js +13 -5
  78. package/dist/core/CoreSchemeServices.js.map +1 -1
  79. package/dist/core/DataStatementRunner.d.ts +2 -2
  80. package/dist/core/DataStatementRunner.d.ts.map +1 -1
  81. package/dist/core/DataStatementRunner.js +208 -161
  82. package/dist/core/DataStatementRunner.js.map +1 -1
  83. package/dist/core/Dispatcher.d.ts +24 -26
  84. package/dist/core/Dispatcher.d.ts.map +1 -1
  85. package/dist/core/Dispatcher.js +381 -232
  86. package/dist/core/Dispatcher.js.map +1 -1
  87. package/dist/core/Dispatcher.sql +66 -0
  88. package/dist/core/DurableStatement.d.ts.map +1 -1
  89. package/dist/core/DurableStatement.js +2 -1
  90. package/dist/core/DurableStatement.js.map +1 -1
  91. package/dist/core/EditMutations.d.ts +14 -18
  92. package/dist/core/EditMutations.d.ts.map +1 -1
  93. package/dist/core/EditMutations.js +211 -280
  94. package/dist/core/EditMutations.js.map +1 -1
  95. package/dist/core/EditMutations.sql +15 -0
  96. package/dist/core/EditSequence.d.ts +13 -0
  97. package/dist/core/EditSequence.d.ts.map +1 -0
  98. package/dist/core/EditSequence.js +73 -0
  99. package/dist/core/EditSequence.js.map +1 -0
  100. package/dist/core/Engine.d.ts +17 -23
  101. package/dist/core/Engine.d.ts.map +1 -1
  102. package/dist/core/Engine.js +74 -164
  103. package/dist/core/Engine.js.map +1 -1
  104. package/dist/core/Engine.sql +0 -724
  105. package/dist/core/EntryAddressBinding.d.ts +7 -17
  106. package/dist/core/EntryAddressBinding.d.ts.map +1 -1
  107. package/dist/core/EntryAddressBinding.js +12 -72
  108. package/dist/core/EntryAddressBinding.js.map +1 -1
  109. package/dist/core/ExecutionOutputs.d.ts +9 -0
  110. package/dist/core/ExecutionOutputs.d.ts.map +1 -0
  111. package/dist/core/ExecutionOutputs.js +36 -0
  112. package/dist/core/ExecutionOutputs.js.map +1 -0
  113. package/dist/core/ExecutionOutputs.sql +21 -0
  114. package/dist/core/ExecutorRegistry.d.ts +11 -5
  115. package/dist/core/ExecutorRegistry.d.ts.map +1 -1
  116. package/dist/core/ExecutorRegistry.js +37 -32
  117. package/dist/core/ExecutorRegistry.js.map +1 -1
  118. package/dist/core/HostPaths.d.ts +1 -0
  119. package/dist/core/HostPaths.d.ts.map +1 -1
  120. package/dist/core/HostPaths.js +4 -0
  121. package/dist/core/HostPaths.js.map +1 -1
  122. package/dist/core/InferenceCall.d.ts.map +1 -1
  123. package/dist/core/InferenceCall.js +1 -2
  124. package/dist/core/InferenceCall.js.map +1 -1
  125. package/dist/core/InferenceCall.sql +29 -0
  126. package/dist/core/KillHandler.d.ts +1 -0
  127. package/dist/core/KillHandler.d.ts.map +1 -1
  128. package/dist/core/KillHandler.js +24 -21
  129. package/dist/core/KillHandler.js.map +1 -1
  130. package/dist/core/LogBody.d.ts +8 -1
  131. package/dist/core/LogBody.d.ts.map +1 -1
  132. package/dist/core/LogBody.js +44 -12
  133. package/dist/core/LogBody.js.map +1 -1
  134. package/dist/core/LogEntryProjection.d.ts +1 -0
  135. package/dist/core/LogEntryProjection.d.ts.map +1 -1
  136. package/dist/core/LogEntryProjection.js +12 -10
  137. package/dist/core/LogEntryProjection.js.map +1 -1
  138. package/dist/core/LogVisibility.d.ts +1 -0
  139. package/dist/core/LogVisibility.d.ts.map +1 -1
  140. package/dist/core/LogVisibility.js +3 -0
  141. package/dist/core/LogVisibility.js.map +1 -1
  142. package/dist/core/LogWriter.d.ts +2 -3
  143. package/dist/core/LogWriter.d.ts.map +1 -1
  144. package/dist/core/LogWriter.js +31 -36
  145. package/dist/core/LogWriter.js.map +1 -1
  146. package/dist/core/LogWriter.sql +23 -0
  147. package/dist/core/LoopDriver.d.ts +11 -8
  148. package/dist/core/LoopDriver.d.ts.map +1 -1
  149. package/dist/core/LoopDriver.js +161 -189
  150. package/dist/core/LoopDriver.js.map +1 -1
  151. package/dist/core/LoopDriver.sql +11 -0
  152. package/dist/core/LoopLifecycle.d.ts +32 -2
  153. package/dist/core/LoopLifecycle.d.ts.map +1 -1
  154. package/dist/core/LoopLifecycle.js +88 -4
  155. package/dist/core/LoopLifecycle.js.map +1 -1
  156. package/dist/core/LoopLifecycle.sql +145 -28
  157. package/dist/core/LoopPolicyReader.sql +6 -0
  158. package/dist/core/MembershipMaterialization.d.ts.map +1 -1
  159. package/dist/core/MembershipMaterialization.js +6 -28
  160. package/dist/core/MembershipMaterialization.js.map +1 -1
  161. package/dist/core/ModelCall.d.ts.map +1 -1
  162. package/dist/core/ModelCall.js +2 -6
  163. package/dist/core/ModelCall.js.map +1 -1
  164. package/dist/core/ModelCall.sql +41 -0
  165. package/dist/core/MutationEffects.d.ts +5 -3
  166. package/dist/core/MutationEffects.d.ts.map +1 -1
  167. package/dist/core/MutationEffects.js +10 -28
  168. package/dist/core/MutationEffects.js.map +1 -1
  169. package/dist/core/NativeContent.d.ts +6 -0
  170. package/dist/core/NativeContent.d.ts.map +1 -0
  171. package/dist/core/NativeContent.js +16 -0
  172. package/dist/core/NativeContent.js.map +1 -0
  173. package/dist/core/NativeContent.sql +6 -0
  174. package/dist/core/NoticeChannel.js +1 -1
  175. package/dist/core/NoticeChannel.js.map +1 -1
  176. package/dist/core/OperatorConfig.js +5 -5
  177. package/dist/core/OperatorConfig.js.map +1 -1
  178. package/dist/core/PacketBuilder.d.ts +8 -5
  179. package/dist/core/PacketBuilder.d.ts.map +1 -1
  180. package/dist/core/PacketBuilder.js +117 -81
  181. package/dist/core/PacketBuilder.js.map +1 -1
  182. package/dist/core/PacketBuilder.sql +146 -0
  183. package/dist/core/PatternSelection.d.ts +28 -0
  184. package/dist/core/PatternSelection.d.ts.map +1 -0
  185. package/dist/core/PatternSelection.js +42 -0
  186. package/dist/core/PatternSelection.js.map +1 -0
  187. package/dist/core/ProblemLog.d.ts.map +1 -1
  188. package/dist/core/ProblemLog.js +0 -1
  189. package/dist/core/ProblemLog.js.map +1 -1
  190. package/dist/core/PromptFrames.d.ts +12 -0
  191. package/dist/core/PromptFrames.d.ts.map +1 -0
  192. package/dist/core/PromptFrames.js +28 -0
  193. package/dist/core/PromptFrames.js.map +1 -0
  194. package/dist/core/ProposalLifecycle.d.ts +0 -1
  195. package/dist/core/ProposalLifecycle.d.ts.map +1 -1
  196. package/dist/core/ProposalLifecycle.js +26 -23
  197. package/dist/core/ProposalLifecycle.js.map +1 -1
  198. package/dist/core/ProposalLifecycle.sql +33 -0
  199. package/dist/core/ProviderInstantiate.d.ts +1 -1
  200. package/dist/core/ProviderInstantiate.d.ts.map +1 -1
  201. package/dist/core/ProviderInstantiate.js +7 -14
  202. package/dist/core/ProviderInstantiate.js.map +1 -1
  203. package/dist/core/ReasoningView.d.ts +9 -0
  204. package/dist/core/ReasoningView.d.ts.map +1 -0
  205. package/dist/core/ReasoningView.js +47 -0
  206. package/dist/core/ReasoningView.js.map +1 -0
  207. package/dist/core/ResourceBindings.d.ts +16 -0
  208. package/dist/core/ResourceBindings.d.ts.map +1 -0
  209. package/dist/core/ResourceBindings.js +45 -0
  210. package/dist/core/ResourceBindings.js.map +1 -0
  211. package/dist/core/ResourceMutations.d.ts +5 -8
  212. package/dist/core/ResourceMutations.d.ts.map +1 -1
  213. package/dist/core/ResourceMutations.js +6 -7
  214. package/dist/core/ResourceMutations.js.map +1 -1
  215. package/dist/core/ResourceSelector.d.ts +2 -2
  216. package/dist/core/ResourceSelector.d.ts.map +1 -1
  217. package/dist/core/ResourceSelector.js +122 -62
  218. package/dist/core/ResourceSelector.js.map +1 -1
  219. package/dist/core/ResourceTransfers.d.ts +4 -2
  220. package/dist/core/ResourceTransfers.d.ts.map +1 -1
  221. package/dist/core/ResourceTransfers.js +95 -26
  222. package/dist/core/ResourceTransfers.js.map +1 -1
  223. package/dist/core/RuntimeWorker.d.ts +5 -0
  224. package/dist/core/RuntimeWorker.d.ts.map +1 -0
  225. package/dist/core/RuntimeWorker.js +15 -0
  226. package/dist/core/RuntimeWorker.js.map +1 -0
  227. package/dist/core/RuntimeWorker.sql +11 -0
  228. package/dist/core/SchemeRegistry.d.ts +12 -16
  229. package/dist/core/SchemeRegistry.d.ts.map +1 -1
  230. package/dist/core/SchemeRegistry.js +59 -85
  231. package/dist/core/SchemeRegistry.js.map +1 -1
  232. package/dist/core/StoredPacket.d.ts +6 -1
  233. package/dist/core/StoredPacket.d.ts.map +1 -1
  234. package/dist/core/StoredPacket.js +30 -10
  235. package/dist/core/StoredPacket.js.map +1 -1
  236. package/dist/core/StrikeRail.d.ts +11 -8
  237. package/dist/core/StrikeRail.d.ts.map +1 -1
  238. package/dist/core/StrikeRail.js +63 -114
  239. package/dist/core/StrikeRail.js.map +1 -1
  240. package/dist/core/StrikeRail.sql +12 -0
  241. package/dist/core/TerminalResult.d.ts +1 -1
  242. package/dist/core/TerminalResult.d.ts.map +1 -1
  243. package/dist/core/TerminalResult.js +2 -2
  244. package/dist/core/TerminalResult.js.map +1 -1
  245. package/dist/core/TokenCalibration.d.ts +1 -6
  246. package/dist/core/TokenCalibration.d.ts.map +1 -1
  247. package/dist/core/TokenCalibration.js +13 -9
  248. package/dist/core/TokenCalibration.js.map +1 -1
  249. package/dist/core/TokenCalibration.sql +15 -0
  250. package/dist/core/ToolInputSchema.d.ts +6 -0
  251. package/dist/core/ToolInputSchema.d.ts.map +1 -0
  252. package/dist/core/ToolInputSchema.js +43 -0
  253. package/dist/core/ToolInputSchema.js.map +1 -0
  254. package/dist/core/ToolResources.d.ts.map +1 -1
  255. package/dist/core/ToolResources.js +77 -51
  256. package/dist/core/ToolResources.js.map +1 -1
  257. package/dist/core/Turn.d.ts +5 -2
  258. package/dist/core/Turn.d.ts.map +1 -1
  259. package/dist/core/Turn.js +13 -11
  260. package/dist/core/Turn.js.map +1 -1
  261. package/dist/core/Turn.sql +25 -39
  262. package/dist/core/{SendBroadcastHandler.d.ts → TurnDispositionHandler.d.ts} +24 -18
  263. package/dist/core/TurnDispositionHandler.d.ts.map +1 -0
  264. package/dist/core/TurnDispositionHandler.js +206 -0
  265. package/dist/core/TurnDispositionHandler.js.map +1 -0
  266. package/dist/core/TurnMaterialization.d.ts +2 -3
  267. package/dist/core/TurnMaterialization.d.ts.map +1 -1
  268. package/dist/core/TurnMaterialization.js +47 -24
  269. package/dist/core/TurnMaterialization.js.map +1 -1
  270. package/dist/core/TurnMaterialization.sql +44 -0
  271. package/dist/core/TurnOps.d.ts.map +1 -1
  272. package/dist/core/TurnOps.js +8 -64
  273. package/dist/core/TurnOps.js.map +1 -1
  274. package/dist/core/TurnRunner.d.ts +8 -15
  275. package/dist/core/TurnRunner.d.ts.map +1 -1
  276. package/dist/core/TurnRunner.js +1175 -1317
  277. package/dist/core/TurnRunner.js.map +1 -1
  278. package/dist/core/TurnRunner.sql +74 -0
  279. package/dist/core/TurnSources.sql +39 -0
  280. package/dist/core/WorkerControlAddress.d.ts +1 -0
  281. package/dist/core/WorkerControlAddress.d.ts.map +1 -1
  282. package/dist/core/WorkerControlAddress.js +5 -0
  283. package/dist/core/WorkerControlAddress.js.map +1 -1
  284. package/dist/core/WorkerControlHandler.d.ts +1 -3
  285. package/dist/core/WorkerControlHandler.d.ts.map +1 -1
  286. package/dist/core/WorkerControlHandler.js +64 -48
  287. package/dist/core/WorkerControlHandler.js.map +1 -1
  288. package/dist/core/WorkerName.d.ts +11 -12
  289. package/dist/core/WorkerName.d.ts.map +1 -1
  290. package/dist/core/WorkerName.js +40 -47
  291. package/dist/core/WorkerName.js.map +1 -1
  292. package/dist/core/WorkerName.sql +7 -10
  293. package/dist/core/WorkspaceGate.d.ts +1 -1
  294. package/dist/core/WorkspaceGate.d.ts.map +1 -1
  295. package/dist/core/WorkspaceGate.js +33 -10
  296. package/dist/core/WorkspaceGate.js.map +1 -1
  297. package/dist/core/ambient.sql +236 -0
  298. package/dist/core/attachments.d.ts +2 -1
  299. package/dist/core/attachments.d.ts.map +1 -1
  300. package/dist/core/attachments.js +5 -4
  301. package/dist/core/attachments.js.map +1 -1
  302. package/dist/core/caps/CapsResolve.d.ts +2 -3
  303. package/dist/core/caps/CapsResolve.d.ts.map +1 -1
  304. package/dist/core/caps/CapsResolve.js +5 -5
  305. package/dist/core/caps/CapsResolve.js.map +1 -1
  306. package/dist/core/caps/DbChannelCaps.d.ts +1 -1
  307. package/dist/core/caps/DbChannelCaps.d.ts.map +1 -1
  308. package/dist/core/caps/DbChannelCaps.js +4 -6
  309. package/dist/core/caps/DbChannelCaps.js.map +1 -1
  310. package/dist/core/caps/DbEntryCaps.d.ts +2 -1
  311. package/dist/core/caps/DbEntryCaps.d.ts.map +1 -1
  312. package/dist/core/caps/DbEntryCaps.js +11 -17
  313. package/dist/core/caps/DbEntryCaps.js.map +1 -1
  314. package/dist/core/caps/DbNotifyCaps.d.ts +1 -1
  315. package/dist/core/caps/DbNotifyCaps.d.ts.map +1 -1
  316. package/dist/core/caps/DbNotifyCaps.js +3 -5
  317. package/dist/core/caps/DbNotifyCaps.js.map +1 -1
  318. package/dist/core/caps/DbProjectionCaps.js +1 -1
  319. package/dist/core/caps/DbProjectionCaps.js.map +1 -1
  320. package/dist/core/caps/DbSubscriptionCaps.d.ts +1 -1
  321. package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -1
  322. package/dist/core/caps/DbSubscriptionCaps.js +5 -7
  323. package/dist/core/caps/DbSubscriptionCaps.js.map +1 -1
  324. package/dist/core/caps/SchemeCtxImpl.d.ts +0 -2
  325. package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -1
  326. package/dist/core/caps/SchemeCtxImpl.js +4 -20
  327. package/dist/core/caps/SchemeCtxImpl.js.map +1 -1
  328. package/dist/core/env-catalog.d.ts +28 -0
  329. package/dist/core/env-catalog.d.ts.map +1 -0
  330. package/dist/core/env-catalog.js +99 -0
  331. package/dist/core/env-catalog.js.map +1 -0
  332. package/dist/core/env-defaults.d.ts.map +1 -1
  333. package/dist/core/env-defaults.js +4 -2
  334. package/dist/core/env-defaults.js.map +1 -1
  335. package/dist/core/file-materialization.d.ts +4 -1
  336. package/dist/core/file-materialization.d.ts.map +1 -1
  337. package/dist/core/file-materialization.js +15 -1
  338. package/dist/core/file-materialization.js.map +1 -1
  339. package/dist/core/fork.d.ts +1 -6
  340. package/dist/core/fork.d.ts.map +1 -1
  341. package/dist/core/fork.js +9 -153
  342. package/dist/core/fork.js.map +1 -1
  343. package/dist/core/fork.sql +162 -185
  344. package/dist/core/git-env.d.ts +1 -0
  345. package/dist/core/git-env.d.ts.map +1 -1
  346. package/dist/core/git-env.js +39 -2
  347. package/dist/core/git-env.js.map +1 -1
  348. package/dist/core/git-membership.d.ts.map +1 -1
  349. package/dist/core/git-membership.js +64 -48
  350. package/dist/core/git-membership.js.map +1 -1
  351. package/dist/core/git-state.d.ts.map +1 -1
  352. package/dist/core/git-state.js +26 -20
  353. package/dist/core/git-state.js.map +1 -1
  354. package/dist/core/glob_match.d.ts +4 -0
  355. package/dist/core/glob_match.d.ts.map +1 -0
  356. package/dist/core/glob_match.js +7 -0
  357. package/dist/core/glob_match.js.map +1 -0
  358. package/dist/core/maintenance.sql +6 -0
  359. package/dist/core/mutation-types.d.ts +7 -28
  360. package/dist/core/mutation-types.d.ts.map +1 -1
  361. package/dist/core/operation-target-groups.d.ts.map +1 -1
  362. package/dist/core/operation-target-groups.js +2 -1
  363. package/dist/core/operation-target-groups.js.map +1 -1
  364. package/dist/core/packet-inject.d.ts.map +1 -1
  365. package/dist/core/packet-inject.js +2 -3
  366. package/dist/core/packet-inject.js.map +1 -1
  367. package/dist/core/packet-wire.d.ts +8 -6
  368. package/dist/core/packet-wire.d.ts.map +1 -1
  369. package/dist/core/packet-wire.js +381 -388
  370. package/dist/core/packet-wire.js.map +1 -1
  371. package/dist/core/plurnk-uri.d.ts +1 -1
  372. package/dist/core/plurnk-uri.d.ts.map +1 -1
  373. package/dist/core/plurnk-uri.js +5 -12
  374. package/dist/core/plurnk-uri.js.map +1 -1
  375. package/dist/core/scheme-types.d.ts +3 -3
  376. package/dist/core/scheme-types.d.ts.map +1 -1
  377. package/dist/core/scheme-types.js.map +1 -1
  378. package/dist/core/sha256.d.ts +4 -0
  379. package/dist/core/sha256.d.ts.map +1 -0
  380. package/dist/core/sha256.js +6 -0
  381. package/dist/core/sha256.js.map +1 -0
  382. package/dist/core/teaching.js +1 -1
  383. package/dist/core/teaching.js.map +1 -1
  384. package/dist/core/turn-scheduler.d.ts.map +1 -1
  385. package/dist/core/turn-scheduler.js +5 -18
  386. package/dist/core/turn-scheduler.js.map +1 -1
  387. package/dist/core/turn-signals.d.ts +0 -6
  388. package/dist/core/turn-signals.d.ts.map +1 -1
  389. package/dist/core/turn-signals.js +1 -7
  390. package/dist/core/turn-signals.js.map +1 -1
  391. package/dist/core/worker-ops.sql +15 -22
  392. package/dist/core/workspace-settings.d.ts.map +1 -1
  393. package/dist/core/workspace-settings.js +18 -2
  394. package/dist/core/workspace-settings.js.map +1 -1
  395. package/dist/core/workspace-settings.sql +6 -0
  396. package/dist/digest/Digest.d.ts.map +1 -1
  397. package/dist/digest/Digest.js +30 -91
  398. package/dist/digest/Digest.js.map +1 -1
  399. package/dist/digest/DigestRender.d.ts +1 -0
  400. package/dist/digest/DigestRender.d.ts.map +1 -1
  401. package/dist/digest/DigestRender.js +58 -62
  402. package/dist/digest/DigestRender.js.map +1 -1
  403. package/dist/digest/digest-rows.d.ts +16 -32
  404. package/dist/digest/digest-rows.d.ts.map +1 -1
  405. package/dist/digest/digest.sql +54 -20
  406. package/dist/schemes/Exec.d.ts +6 -12
  407. package/dist/schemes/Exec.d.ts.map +1 -1
  408. package/dist/schemes/Exec.js +318 -215
  409. package/dist/schemes/Exec.js.map +1 -1
  410. package/dist/schemes/ExecOutputScheme.d.ts +8 -6
  411. package/dist/schemes/ExecOutputScheme.d.ts.map +1 -1
  412. package/dist/schemes/ExecOutputScheme.js +33 -61
  413. package/dist/schemes/ExecOutputScheme.js.map +1 -1
  414. package/dist/schemes/ExecScheduler.js +2 -2
  415. package/dist/schemes/ExecScheduler.js.map +1 -1
  416. package/dist/schemes/ExecutionInput.d.ts +12 -0
  417. package/dist/schemes/ExecutionInput.d.ts.map +1 -0
  418. package/dist/schemes/ExecutionInput.js +94 -0
  419. package/dist/schemes/ExecutionInput.js.map +1 -0
  420. package/dist/schemes/File.d.ts +5 -2
  421. package/dist/schemes/File.d.ts.map +1 -1
  422. package/dist/schemes/File.js +62 -91
  423. package/dist/schemes/File.js.map +1 -1
  424. package/dist/schemes/Log.d.ts.map +1 -1
  425. package/dist/schemes/Log.js +84 -79
  426. package/dist/schemes/Log.js.map +1 -1
  427. package/dist/schemes/Log.sql +183 -15
  428. package/dist/schemes/Prompt.d.ts.map +1 -1
  429. package/dist/schemes/Prompt.js +3 -12
  430. package/dist/schemes/Prompt.js.map +1 -1
  431. package/dist/schemes/QuestionTool.d.ts +5 -0
  432. package/dist/schemes/QuestionTool.d.ts.map +1 -1
  433. package/dist/schemes/QuestionTool.js +7 -15
  434. package/dist/schemes/QuestionTool.js.map +1 -1
  435. package/dist/schemes/Skill.d.ts +12 -7
  436. package/dist/schemes/Skill.d.ts.map +1 -1
  437. package/dist/schemes/Skill.js +149 -21
  438. package/dist/schemes/Skill.js.map +1 -1
  439. package/dist/schemes/TurnSource.d.ts +12 -0
  440. package/dist/schemes/TurnSource.d.ts.map +1 -0
  441. package/dist/schemes/TurnSource.js +117 -0
  442. package/dist/schemes/TurnSource.js.map +1 -0
  443. package/dist/schemes/Worker.d.ts +3 -3
  444. package/dist/schemes/Worker.d.ts.map +1 -1
  445. package/dist/schemes/Worker.js +61 -208
  446. package/dist/schemes/Worker.js.map +1 -1
  447. package/dist/schemes/_entry-crud.d.ts +12 -15
  448. package/dist/schemes/_entry-crud.d.ts.map +1 -1
  449. package/dist/schemes/_entry-crud.js +63 -63
  450. package/dist/schemes/_entry-crud.js.map +1 -1
  451. package/dist/schemes/_entry-crud.sql +159 -45
  452. package/dist/schemes/_entry-find.d.ts +1 -3
  453. package/dist/schemes/_entry-find.d.ts.map +1 -1
  454. package/dist/schemes/_entry-find.js +111 -112
  455. package/dist/schemes/_entry-find.js.map +1 -1
  456. package/dist/schemes/_entry-find.sql +22 -14
  457. package/dist/schemes/_entry-fts.d.ts +14 -0
  458. package/dist/schemes/_entry-fts.d.ts.map +1 -0
  459. package/dist/schemes/_entry-fts.js +82 -0
  460. package/dist/schemes/_entry-fts.js.map +1 -0
  461. package/dist/schemes/_entry-fts.sql +31 -0
  462. package/dist/schemes/_entry-graph.d.ts.map +1 -1
  463. package/dist/schemes/_entry-graph.js +6 -14
  464. package/dist/schemes/_entry-graph.js.map +1 -1
  465. package/dist/schemes/_entry-graph.sql +29 -44
  466. package/dist/schemes/_entry-manifest.d.ts +2 -1
  467. package/dist/schemes/_entry-manifest.d.ts.map +1 -1
  468. package/dist/schemes/_entry-manifest.js +20 -26
  469. package/dist/schemes/_entry-manifest.js.map +1 -1
  470. package/dist/schemes/_entry-manifest.sql +26 -0
  471. package/dist/schemes/_entry-ops.d.ts +3 -5
  472. package/dist/schemes/_entry-ops.d.ts.map +1 -1
  473. package/dist/schemes/_entry-ops.js +30 -43
  474. package/dist/schemes/_entry-ops.js.map +1 -1
  475. package/dist/schemes/_entry-ops.sql +5 -6
  476. package/dist/schemes/_entry-readable.d.ts +8 -0
  477. package/dist/schemes/_entry-readable.d.ts.map +1 -0
  478. package/dist/schemes/_entry-readable.js +38 -0
  479. package/dist/schemes/_entry-readable.js.map +1 -0
  480. package/dist/schemes/_entry-send.d.ts +1 -1
  481. package/dist/schemes/_entry-send.d.ts.map +1 -1
  482. package/dist/schemes/_entry-send.js +3 -3
  483. package/dist/schemes/_entry-send.js.map +1 -1
  484. package/dist/schemes/_search-index.d.ts +5 -3
  485. package/dist/schemes/_search-index.d.ts.map +1 -1
  486. package/dist/schemes/_search-index.js +169 -160
  487. package/dist/schemes/_search-index.js.map +1 -1
  488. package/dist/schemes/_search-index.sql +47 -0
  489. package/dist/schemes/exec-abort.js +1 -1
  490. package/dist/schemes/exec-abort.js.map +1 -1
  491. package/dist/schemes/exec-env.d.ts +3 -0
  492. package/dist/schemes/exec-env.d.ts.map +1 -1
  493. package/dist/schemes/exec-env.js +66 -15
  494. package/dist/schemes/exec-env.js.map +1 -1
  495. package/dist/schemes/exec-runtime.d.ts +1 -1
  496. package/dist/schemes/exec-runtime.d.ts.map +1 -1
  497. package/dist/schemes/exec-runtime.js +1 -1
  498. package/dist/schemes/exec-runtime.js.map +1 -1
  499. package/dist/server/ClientReads.d.ts +2 -2
  500. package/dist/server/ClientReads.d.ts.map +1 -1
  501. package/dist/server/ClientReads.js +7 -9
  502. package/dist/server/ClientReads.js.map +1 -1
  503. package/dist/server/Daemon.d.ts +15 -21
  504. package/dist/server/Daemon.d.ts.map +1 -1
  505. package/dist/server/Daemon.js +165 -168
  506. package/dist/server/Daemon.js.map +1 -1
  507. package/dist/server/DaemonModule.d.ts +29 -22
  508. package/dist/server/DaemonModule.d.ts.map +1 -1
  509. package/dist/server/DrainSupervisor.d.ts +8 -21
  510. package/dist/server/DrainSupervisor.d.ts.map +1 -1
  511. package/dist/server/DrainSupervisor.js +278 -306
  512. package/dist/server/DrainSupervisor.js.map +1 -1
  513. package/dist/server/EnvFunctionality.d.ts +43 -0
  514. package/dist/server/EnvFunctionality.d.ts.map +1 -0
  515. package/dist/server/EnvFunctionality.js +194 -0
  516. package/dist/server/EnvFunctionality.js.map +1 -0
  517. package/dist/server/Functionality.d.ts +12 -11
  518. package/dist/server/Functionality.d.ts.map +1 -1
  519. package/dist/server/Functionality.js +279 -142
  520. package/dist/server/Functionality.js.map +1 -1
  521. package/dist/server/FunctionalityManager.d.ts +5 -5
  522. package/dist/server/FunctionalityManager.d.ts.map +1 -1
  523. package/dist/server/FunctionalityManager.js +29 -57
  524. package/dist/server/FunctionalityManager.js.map +1 -1
  525. package/dist/server/MembersFunctionality.d.ts +5 -4
  526. package/dist/server/MembersFunctionality.d.ts.map +1 -1
  527. package/dist/server/MembersFunctionality.js +24 -38
  528. package/dist/server/MembersFunctionality.js.map +1 -1
  529. package/dist/server/PlurnkSkill.d.ts +11 -0
  530. package/dist/server/PlurnkSkill.d.ts.map +1 -0
  531. package/dist/server/PlurnkSkill.js +41 -0
  532. package/dist/server/PlurnkSkill.js.map +1 -0
  533. package/dist/server/Retention.d.ts +25 -0
  534. package/dist/server/Retention.d.ts.map +1 -0
  535. package/dist/server/Retention.js +57 -0
  536. package/dist/server/Retention.js.map +1 -0
  537. package/dist/server/Retention.sql +59 -0
  538. package/dist/server/ServiceModules.d.ts +5 -0
  539. package/dist/server/ServiceModules.d.ts.map +1 -0
  540. package/dist/server/ServiceModules.js +10 -0
  541. package/dist/server/ServiceModules.js.map +1 -0
  542. package/dist/server/SkillsFunctionality.d.ts +14 -19
  543. package/dist/server/SkillsFunctionality.d.ts.map +1 -1
  544. package/dist/server/SkillsFunctionality.js +102 -106
  545. package/dist/server/SkillsFunctionality.js.map +1 -1
  546. package/dist/server/WorkerModelResolver.d.ts +4 -0
  547. package/dist/server/WorkerModelResolver.d.ts.map +1 -1
  548. package/dist/server/WorkerModelResolver.js +72 -39
  549. package/dist/server/WorkerModelResolver.js.map +1 -1
  550. package/dist/server/WorkspaceCapabilities.d.ts +21 -0
  551. package/dist/server/WorkspaceCapabilities.d.ts.map +1 -0
  552. package/dist/server/{WorkerCapabilities.js → WorkspaceCapabilities.js} +40 -40
  553. package/dist/server/WorkspaceCapabilities.js.map +1 -0
  554. package/dist/server/WorkspaceResidency.d.ts +38 -0
  555. package/dist/server/WorkspaceResidency.d.ts.map +1 -0
  556. package/dist/server/WorkspaceResidency.js +226 -0
  557. package/dist/server/WorkspaceResidency.js.map +1 -0
  558. package/dist/server/client-input.d.ts +1 -4
  559. package/dist/server/client-input.d.ts.map +1 -1
  560. package/dist/server/client-input.js +5 -46
  561. package/dist/server/client-input.js.map +1 -1
  562. package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
  563. package/dist/server/dispatch-as-plurnk.js +4 -22
  564. package/dist/server/dispatch-as-plurnk.js.map +1 -1
  565. package/dist/server/drain.sql +66 -43
  566. package/dist/server/envelope.d.ts +8 -1
  567. package/dist/server/envelope.d.ts.map +1 -1
  568. package/dist/server/envelope.js +9 -19
  569. package/dist/server/envelope.js.map +1 -1
  570. package/dist/server/envelope.sql +49 -13
  571. package/dist/server/lifecycle-recovery.sql +18 -20
  572. package/dist/server/logEntry.d.ts +1 -1
  573. package/dist/server/logEntry.d.ts.map +1 -1
  574. package/dist/server/logEntry.js +4 -1
  575. package/dist/server/logEntry.js.map +1 -1
  576. package/dist/server/logEntry.sql +25 -1
  577. package/dist/server/loopDocs.d.ts +2 -2
  578. package/dist/server/loopDocs.d.ts.map +1 -1
  579. package/dist/server/loopDocs.js +38 -31
  580. package/dist/server/loopDocs.js.map +1 -1
  581. package/dist/server/loopDocs.sql +1 -3
  582. package/dist/server/model-catalog.d.ts.map +1 -1
  583. package/dist/server/model-catalog.js +2 -1
  584. package/dist/server/model-catalog.js.map +1 -1
  585. package/dist/server/model-route.d.ts +1 -1
  586. package/dist/server/model-route.d.ts.map +1 -1
  587. package/dist/server/model-route.js +4 -2
  588. package/dist/server/model-route.js.map +1 -1
  589. package/dist/server/seam-entry-read.sql +3 -4
  590. package/dist/server/seam-loop.sql +2 -9
  591. package/dist/server/workspace-capabilities.sql +64 -0
  592. package/dist/service.d.ts.map +1 -1
  593. package/dist/service.js +21 -18
  594. package/dist/service.js.map +1 -1
  595. package/docs/env.md +55 -0
  596. package/docs/members.md +83 -0
  597. package/docs/skills.md +50 -0
  598. package/migrations/001_workspaces.sql +53 -0
  599. package/migrations/002_workers.sql +198 -0
  600. package/migrations/003_loops.sql +326 -0
  601. package/migrations/004_inference.sql +401 -0
  602. package/migrations/005_entries.sql +215 -0
  603. package/migrations/006_log.sql +581 -0
  604. package/migrations/007_subscriptions.sql +175 -0
  605. package/migrations/008_interactions.sql +29 -0
  606. package/package.json +44 -41
  607. package/digest-sql/channel-dispositions/dispositions.sql +0 -15
  608. package/digest-sql/channel-state/state.sql +0 -6
  609. package/digest-sql/curation/curation.sql +0 -6
  610. package/digest-sql/derivations/derivations.sql +0 -4
  611. package/digest-sql/embeddings/embeddings.sql +0 -4
  612. package/digest-sql/entry-dispositions/dispositions.sql +0 -15
  613. package/digest-sql/entry-state/state.sql +0 -6
  614. package/digest-sql/token-counts/token-counts.sql +0 -2
  615. package/dist/core/EmbeddingCall.d.ts +0 -23
  616. package/dist/core/EmbeddingCall.d.ts.map +0 -1
  617. package/dist/core/EmbeddingCall.js +0 -149
  618. package/dist/core/EmbeddingCall.js.map +0 -1
  619. package/dist/core/OverflowTurn.d.ts +0 -11
  620. package/dist/core/OverflowTurn.d.ts.map +0 -1
  621. package/dist/core/OverflowTurn.js +0 -80
  622. package/dist/core/OverflowTurn.js.map +0 -1
  623. package/dist/core/Owner.d.ts +0 -8
  624. package/dist/core/Owner.d.ts.map +0 -1
  625. package/dist/core/Owner.js +0 -46
  626. package/dist/core/Owner.js.map +0 -1
  627. package/dist/core/SendBroadcastHandler.d.ts.map +0 -1
  628. package/dist/core/SendBroadcastHandler.js +0 -159
  629. package/dist/core/SendBroadcastHandler.js.map +0 -1
  630. package/dist/core/VectorPump.d.ts +0 -28
  631. package/dist/core/VectorPump.d.ts.map +0 -1
  632. package/dist/core/VectorPump.js +0 -130
  633. package/dist/core/VectorPump.js.map +0 -1
  634. package/dist/core/owner.sql +0 -11
  635. package/dist/core/worker-settings.d.ts +0 -10
  636. package/dist/core/worker-settings.d.ts.map +0 -1
  637. package/dist/core/worker-settings.js +0 -53
  638. package/dist/core/worker-settings.js.map +0 -1
  639. package/dist/schemes/_entry-chunk.d.ts +0 -14
  640. package/dist/schemes/_entry-chunk.d.ts.map +0 -1
  641. package/dist/schemes/_entry-chunk.js +0 -165
  642. package/dist/schemes/_entry-chunk.js.map +0 -1
  643. package/dist/schemes/_entry-semantic.d.ts +0 -63
  644. package/dist/schemes/_entry-semantic.d.ts.map +0 -1
  645. package/dist/schemes/_entry-semantic.js +0 -299
  646. package/dist/schemes/_entry-semantic.js.map +0 -1
  647. package/dist/schemes/_entry-semantic.sql +0 -99
  648. package/dist/schemes/cosine.d.ts +0 -4
  649. package/dist/schemes/cosine.d.ts.map +0 -1
  650. package/dist/schemes/cosine.js +0 -9
  651. package/dist/schemes/cosine.js.map +0 -1
  652. package/dist/server/WorkerCapabilities.d.ts +0 -21
  653. package/dist/server/WorkerCapabilities.d.ts.map +0 -1
  654. package/dist/server/WorkerCapabilities.js.map +0 -1
  655. package/dist/server/WorkerResidency.d.ts +0 -40
  656. package/dist/server/WorkerResidency.d.ts.map +0 -1
  657. package/dist/server/WorkerResidency.js +0 -283
  658. package/dist/server/WorkerResidency.js.map +0 -1
  659. package/dist/server/seam-log-read.sql +0 -21
  660. package/dist/server/worker-capabilities.sql +0 -28
  661. package/migrations/001_schema.sql +0 -2207
@@ -0,0 +1,581 @@
1
+ -- MIGRATE: 6 log
2
+ -- Chapter 6 of the schema baseline ({§db-schema-baseline}): The log: rows, their projections, curation effects, and the views the packet reads.
3
+ -- Version numbers order the chapters on a fresh database; they are not history. A shape
4
+ -- change edits the chapter in place; existing development databases are recreated.
5
+
6
+ -- log_entries
7
+ -- Chronological event store. sequence is 1-based, scoped to the turn —
8
+ -- resets at each new turn. URI-bit columns are unprefixed (scheme,
9
+ -- pathname, …). state/outcome/attrs carry the proposal lifecycle —
10
+ -- status⊥state: status is the HTTP outcome, state is where in the
11
+ -- lifecycle the entry sits. Most rows write 'resolved' directly;
12
+ -- proposing schemes transition 'proposed' → resolved/failed/cancelled.
13
+ -- initial_folded is the immutable visibility with which the event entered the
14
+ -- log. Current model-facing membership and folded intervals belong to
15
+ -- log_entry_projections below; curation never rewrites or removes this event.
16
+ CREATE TABLE IF NOT EXISTS log_entries (
17
+ id INTEGER NOT NULL PRIMARY KEY,
18
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
19
+
20
+ worker_id INTEGER NOT NULL,
21
+ loop_id INTEGER NOT NULL,
22
+ turn_id INTEGER NOT NULL,
23
+ sequence INTEGER NOT NULL CHECK (sequence >= 1),
24
+ at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
25
+ origin TEXT NOT NULL CHECK (origin IN ('model', 'client', '_plurnk', 'plugin')),
26
+ -- {§env-delta-attribution}: a causal worker:// identity, log:/// operation
27
+ -- address, or stable subsystem token ('file'); NULL = the owning worker
28
+ -- itself, rendered without causal attribution.
29
+ source TEXT,
30
+ -- Engine-owned occurrence identity. Source rows are stamped NULL→id by the
31
+ -- journal trigger; observer and fork copies carry it at insertion.
32
+ ambient_event_id INTEGER REFERENCES ambient_events(id),
33
+ -- Fork history is copied evidence, never new activity. Rows with no source
34
+ -- occurrence still need this structural guard against republication.
35
+ inherited_history INTEGER NOT NULL DEFAULT 0 CHECK (inherited_history IN (0, 1)),
36
+ -- Search derivation attached to this durable log result, when available.
37
+ deep_hash TEXT REFERENCES derivations(deep_hash),
38
+ -- Exact logical provider call represented by a BARE result or rejected
39
+ -- emissionAttempt. Other operation and ambient
40
+ -- rows carry no model-call identity.
41
+ model_call_id INTEGER REFERENCES model_calls(id),
42
+ -- Engine-owned stream publication that produced this observation. The
43
+ -- publication cursor survives log curation; this relation is evidence,
44
+ -- never the acknowledgement itself. {§exec-stream}
45
+ subscription_publication_id INTEGER REFERENCES subscription_publications(id) ON DELETE SET NULL,
46
+
47
+ -- 'error' is an ACTIONLESS row ({§operation-results} — errors are log items): a parse failure that
48
+ -- produced no op still records a log entry (op='error', status_rx≥400, no target) so the model
49
+ -- can fold/kill/recall its own mistakes like any other log row — one budget surface, the log.
50
+ -- Rejected-attempt artifacts carry NULL here ({§rejected-emission-entry}).
51
+ -- No op enum here: the grammar op set is grammar's contract (PlurnkOp), and this column is written
52
+ -- only by the PlurnkOp-typed engine (grammar ops), service row selectors, or NULL for no op.
53
+ -- A SQL enum would be a hand-copy of grammar's op list that silently goes stale on every new verb
54
+ -- (it did — FORK/WORK). Validity lives at the parse + type layer, not duplicated in DDL.
55
+ op TEXT,
56
+ signal TEXT CHECK (signal IS NULL OR json_valid(signal)),
57
+
58
+ scheme TEXT CHECK (scheme IS NULL OR length(scheme) > 0),
59
+ username TEXT,
60
+ password TEXT,
61
+ hostname TEXT,
62
+ port INTEGER CHECK (port IS NULL OR (port BETWEEN 0 AND 65535)),
63
+ pathname TEXT,
64
+ -- Serialized query without '?'; NULL = absent, '' = explicit empty. {§path-query}
65
+ query TEXT,
66
+ fragment TEXT,
67
+
68
+ lineMarker TEXT CHECK (lineMarker IS NULL OR json_valid(lineMarker)),
69
+
70
+ tx TEXT NOT NULL,
71
+ mimetype_tx TEXT NOT NULL CHECK (length(mimetype_tx) > 0),
72
+
73
+ rx TEXT NOT NULL,
74
+ mimetype_rx TEXT NOT NULL CHECK (length(mimetype_rx) > 0),
75
+ status_rx INTEGER NOT NULL CHECK (status_rx BETWEEN 100 AND 599),
76
+ native_content_hash TEXT GENERATED ALWAYS AS (
77
+ CASE WHEN mimetype_rx = 'application/json' AND json_valid(rx)
78
+ THEN json_extract(rx, '$.nativeContentHash') END
79
+ ) VIRTUAL REFERENCES native_contents(hash),
80
+
81
+ -- Complete canonical LogBody content before coordinate/presentation
82
+ -- projection; persistence envelopes do not contribute. {§tokenomics-weight-stored-at-write}
83
+ weight INTEGER NOT NULL DEFAULT 0 CHECK (weight >= 0),
84
+
85
+ state TEXT NOT NULL DEFAULT 'resolved'
86
+ CHECK (state IN ('proposed', 'resolved', 'failed', 'cancelled')),
87
+ outcome TEXT,
88
+ attrs TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(attrs)),
89
+
90
+ initial_folded TEXT NOT NULL DEFAULT '[]'
91
+ CHECK (json_valid(initial_folded) AND json_type(initial_folded) = 'array'),
92
+
93
+ CHECK (
94
+ (op IS NULL) = COALESCE(
95
+ json_extract(attrs, '$.kind') = 'emissionAttempt',
96
+ 0
97
+ )
98
+ ),
99
+ CHECK (json_extract(attrs, '$.kind') != 'emissionAttempt' OR origin = 'model'),
100
+
101
+ FOREIGN KEY (worker_id) REFERENCES workers(id) ON DELETE CASCADE,
102
+ FOREIGN KEY (loop_id) REFERENCES loops(id) ON DELETE CASCADE,
103
+ FOREIGN KEY (turn_id) REFERENCES turns(id) ON DELETE CASCADE
104
+ ) STRICT;
105
+
106
+ CREATE UNIQUE INDEX IF NOT EXISTS log_entries_turn_id_sequence ON log_entries (turn_id, sequence);
107
+
108
+ CREATE INDEX IF NOT EXISTS log_entries_worker_id ON log_entries (worker_id);
109
+
110
+ CREATE INDEX IF NOT EXISTS log_entries_loop_id ON log_entries (loop_id);
111
+
112
+ -- {§db-fk-indexes} Derivation replacement checks the rows that cite the hash.
113
+ CREATE INDEX IF NOT EXISTS log_entries_deep_hash ON log_entries (deep_hash) WHERE deep_hash IS NOT NULL;
114
+
115
+ -- {§loop-response-messages}: the response is the last delivered message, read from
116
+ -- executed evidence so curation cannot retract it. This projection is also used inside
117
+ -- atomic cancellation; no second response projection exists.
118
+ CREATE VIEW IF NOT EXISTS loop_responses AS
119
+ SELECT loop_id, content FROM (
120
+ SELECT le.loop_id,
121
+ json_extract(le.tx, '$.body.raw') AS content,
122
+ ROW_NUMBER() OVER (PARTITION BY le.loop_id ORDER BY t.sequence DESC, le.sequence DESC) AS recency
123
+ FROM log_entries le JOIN turns t ON t.id = le.turn_id
124
+ WHERE le.op = 'SEND' AND le.state = 'resolved' AND le.status_rx BETWEEN 200 AND 299
125
+ AND le.source IS NULL AND le.inherited_history = 0
126
+ AND json_valid(le.tx)
127
+ -- {§send-prompt-acceptance}: a SEND to one of this loop's own prompts is the response too;
128
+ -- the dispatcher admits only own-loop prompt addresses, so the scheme alone identifies them.
129
+ AND (json_type(le.tx, '$.target') = 'null' OR json_extract(le.tx, '$.target.scheme') = 'prompt')
130
+ AND json_type(le.tx, '$.body.raw') = 'text'
131
+ AND length(json_extract(le.tx, '$.body.raw')) > 0
132
+ )
133
+ WHERE recency = 1;
134
+
135
+ CREATE UNIQUE INDEX IF NOT EXISTS log_entries_model_call_id
136
+ ON log_entries (model_call_id)
137
+ WHERE model_call_id IS NOT NULL;
138
+
139
+ CREATE INDEX IF NOT EXISTS log_entries_subscription_publication_id
140
+ ON log_entries (subscription_publication_id)
141
+ WHERE subscription_publication_id IS NOT NULL;
142
+
143
+ CREATE UNIQUE INDEX IF NOT EXISTS log_entries_worker_ambient_event
144
+ ON log_entries (worker_id, ambient_event_id)
145
+ WHERE ambient_event_id IS NOT NULL;
146
+
147
+ -- {§log-history-projection} — log_entries is append-only execution evidence;
148
+ -- this one-to-one row is the current model-facing projection of that evidence.
149
+ -- KILL is a terminal active→inactive transition. Scoped KILL mutates only folded
150
+ -- intervals while active. The initial state is created in the same statement as
151
+ -- its event so no durable row can exist without one projection state.
152
+ CREATE TABLE IF NOT EXISTS log_entry_projections (
153
+ log_entry_id INTEGER NOT NULL PRIMARY KEY,
154
+ active INTEGER NOT NULL DEFAULT 1 CHECK (active IN (0, 1)),
155
+ folded TEXT NOT NULL DEFAULT '[]'
156
+ CHECK (json_valid(folded) AND json_type(folded) = 'array'),
157
+ output_admission_turn_id INTEGER,
158
+ output_withheld INTEGER NOT NULL DEFAULT 0 CHECK (output_withheld IN (0, 1)),
159
+ CHECK (output_withheld = 0 OR output_admission_turn_id IS NOT NULL),
160
+ FOREIGN KEY (output_admission_turn_id) REFERENCES turns(id),
161
+ FOREIGN KEY (log_entry_id) REFERENCES log_entries(id) ON DELETE CASCADE
162
+ ) STRICT, WITHOUT ROWID;
163
+
164
+ -- {§db-fk-indexes} Opening a turn checks admissions that cite a turn; without this every projection row is read.
165
+ CREATE INDEX IF NOT EXISTS log_entry_projections_output_admission_turn ON log_entry_projections (output_admission_turn_id) WHERE output_admission_turn_id IS NOT NULL;
166
+
167
+ -- {§context-output-selection} Admission is a durable projection decision, not
168
+ -- deletion or proof of provider delivery. It cannot be reset to replay output.
169
+ CREATE TRIGGER IF NOT EXISTS log_output_admission_immutable
170
+ BEFORE UPDATE OF output_admission_turn_id, output_withheld ON log_entry_projections
171
+ WHEN OLD.output_admission_turn_id IS NOT NULL AND (
172
+ NEW.output_admission_turn_id IS NOT OLD.output_admission_turn_id
173
+ OR NEW.output_withheld != OLD.output_withheld
174
+ )
175
+ BEGIN
176
+ SELECT RAISE(ABORT, 'log output admission is immutable');
177
+ END;
178
+
179
+ CREATE TRIGGER IF NOT EXISTS log_output_admission_owner
180
+ BEFORE UPDATE OF output_admission_turn_id ON log_entry_projections
181
+ WHEN NEW.output_admission_turn_id IS NOT NULL AND NOT EXISTS (
182
+ SELECT 1 FROM turns turn
183
+ JOIN loops loop ON loop.id = turn.loop_id
184
+ JOIN log_entries entry ON entry.worker_id = loop.worker_id
185
+ WHERE turn.id = NEW.output_admission_turn_id AND entry.id = NEW.log_entry_id
186
+ )
187
+ BEGIN
188
+ SELECT RAISE(ABORT, 'log output admission must belong to its worker');
189
+ END;
190
+
191
+ -- The ordinary operation surface reads this view. Forensic and lifecycle
192
+ -- machinery names log_entries directly and therefore retains complete history.
193
+ CREATE VIEW IF NOT EXISTS active_log_entries AS
194
+ SELECT le.id, le.version, le.worker_id, le.loop_id, le.turn_id, le.sequence,
195
+ le.at, le.origin, le.source, le.ambient_event_id, le.inherited_history,
196
+ le.deep_hash, le.model_call_id, le.subscription_publication_id,
197
+ le.op, le.signal, le.scheme, le.username, le.password,
198
+ le.hostname, le.port, le.pathname, le.query, le.fragment, le.lineMarker,
199
+ le.tx, le.mimetype_tx,
200
+ le.rx, le.mimetype_rx, le.status_rx, le.weight,
201
+ le.state, le.outcome, le.attrs, le.initial_folded, projection.folded,
202
+ projection.output_admission_turn_id, projection.output_withheld
203
+ FROM log_entries le
204
+ JOIN log_entry_projections projection ON projection.log_entry_id = le.id
205
+ WHERE projection.active = 1;
206
+
207
+ -- Individual execution events are append-only. Containing-history teardown is
208
+ -- the one removal owner: a cascading delete has already removed at least one
209
+ -- ancestor in the workspace→worker→loop→turn chain. A direct row delete while
210
+ -- that complete owner chain remains would fabricate chronology and is rejected.
211
+ CREATE TRIGGER IF NOT EXISTS log_entries_delete_with_owner_only
212
+ BEFORE DELETE ON log_entries
213
+ WHEN EXISTS (
214
+ SELECT 1
215
+ FROM turns
216
+ JOIN loops ON loops.id = turns.loop_id
217
+ JOIN workers ON workers.id = loops.worker_id
218
+ JOIN workspaces ON workspaces.id = workers.workspace_id
219
+ WHERE turns.id = OLD.turn_id
220
+ )
221
+ BEGIN
222
+ SELECT RAISE(ABORT, 'log entries can only be removed with their containing history');
223
+ END;
224
+
225
+ -- A log row belongs to one exact worker/loop/turn chain. Its writer is either
226
+ -- that turn's producer or `_plurnk` observing the turn. Primitive absence,
227
+ -- enum, and foreign-key failures remain owned by their column constraints.
228
+ CREATE TRIGGER IF NOT EXISTS log_entries_turn_ownership
229
+ BEFORE INSERT ON log_entries
230
+ WHEN NEW.worker_id IS NOT NULL
231
+ AND NEW.loop_id IS NOT NULL
232
+ AND NEW.turn_id IS NOT NULL
233
+ AND NEW.origin IN ('model', 'client', '_plurnk', 'plugin')
234
+ AND EXISTS (SELECT 1 FROM workers WHERE id = NEW.worker_id)
235
+ AND EXISTS (SELECT 1 FROM loops WHERE id = NEW.loop_id)
236
+ AND EXISTS (SELECT 1 FROM turns WHERE id = NEW.turn_id)
237
+ AND NOT EXISTS (
238
+ SELECT 1
239
+ FROM turns
240
+ JOIN loops ON loops.id = turns.loop_id
241
+ WHERE turns.id = NEW.turn_id
242
+ AND loops.id = NEW.loop_id
243
+ AND loops.worker_id = NEW.worker_id
244
+ AND (NEW.origin = turns.producer OR NEW.origin = '_plurnk')
245
+ )
246
+ BEGIN
247
+ SELECT RAISE(ABORT, 'log entry must match its turn ownership and producer');
248
+ END;
249
+
250
+ -- A folded interval is an inclusive [start,end] pair. Ranges are positive,
251
+ -- sorted, disjoint, and non-adjacent; -1 is the final open-ended endpoint.
252
+ -- Canonical intervals make visibility equality and curation effects exact.
253
+ CREATE TRIGGER IF NOT EXISTS log_entry_projections_folded_valid_insert
254
+ BEFORE INSERT ON log_entry_projections
255
+ WHEN EXISTS (
256
+ SELECT 1
257
+ FROM json_each(NEW.folded) range
258
+ WHERE range.type != 'array'
259
+ OR json_array_length(range.value) != 2
260
+ OR COALESCE(json_type(range.value, '$[0]'), '') != 'integer'
261
+ OR COALESCE(json_type(range.value, '$[1]'), '') != 'integer'
262
+ OR json_extract(range.value, '$[0]') < 1
263
+ OR (
264
+ json_extract(range.value, '$[1]') != -1
265
+ AND json_extract(range.value, '$[1]') < json_extract(range.value, '$[0]')
266
+ )
267
+ OR EXISTS (
268
+ SELECT 1
269
+ FROM json_each(NEW.folded) previous
270
+ WHERE previous.key = range.key - 1
271
+ AND (
272
+ json_extract(previous.value, '$[1]') = -1
273
+ OR json_extract(range.value, '$[0]') <= json_extract(previous.value, '$[1]') + 1
274
+ )
275
+ )
276
+ )
277
+ BEGIN
278
+ SELECT RAISE(ABORT, 'log entry projection folded ranges are invalid');
279
+ END;
280
+
281
+ CREATE TRIGGER IF NOT EXISTS log_entry_projections_folded_valid_update
282
+ BEFORE UPDATE OF folded ON log_entry_projections
283
+ WHEN EXISTS (
284
+ SELECT 1
285
+ FROM json_each(NEW.folded) range
286
+ WHERE range.type != 'array'
287
+ OR json_array_length(range.value) != 2
288
+ OR COALESCE(json_type(range.value, '$[0]'), '') != 'integer'
289
+ OR COALESCE(json_type(range.value, '$[1]'), '') != 'integer'
290
+ OR json_extract(range.value, '$[0]') < 1
291
+ OR (
292
+ json_extract(range.value, '$[1]') != -1
293
+ AND json_extract(range.value, '$[1]') < json_extract(range.value, '$[0]')
294
+ )
295
+ OR EXISTS (
296
+ SELECT 1
297
+ FROM json_each(NEW.folded) previous
298
+ WHERE previous.key = range.key - 1
299
+ AND (
300
+ json_extract(previous.value, '$[1]') = -1
301
+ OR json_extract(range.value, '$[0]') <= json_extract(previous.value, '$[1]') + 1
302
+ )
303
+ )
304
+ )
305
+ BEGIN
306
+ SELECT RAISE(ABORT, 'log entry projection folded ranges are invalid');
307
+ END;
308
+
309
+ CREATE TRIGGER IF NOT EXISTS log_entry_projections_kill_terminal
310
+ BEFORE UPDATE OF active ON log_entry_projections
311
+ WHEN OLD.active = 0 AND NEW.active != 0
312
+ BEGIN
313
+ SELECT RAISE(ABORT, 'a killed log entry cannot re-enter the active projection');
314
+ END;
315
+
316
+ CREATE TRIGGER IF NOT EXISTS log_entry_projections_delete_with_event_only
317
+ BEFORE DELETE ON log_entry_projections
318
+ WHEN EXISTS (SELECT 1 FROM log_entries WHERE id = OLD.log_entry_id)
319
+ BEGIN
320
+ SELECT RAISE(ABORT, 'a durable log event must retain its projection');
321
+ END;
322
+
323
+ CREATE TRIGGER IF NOT EXISTS log_entries_model_call_valid
324
+ BEFORE INSERT ON log_entries
325
+ WHEN NEW.model_call_id IS NOT NULL
326
+ AND NOT EXISTS (
327
+ SELECT 1
328
+ FROM model_calls call
329
+ JOIN inference_calls inference ON inference.id = call.id
330
+ WHERE call.id = NEW.model_call_id
331
+ AND inference.turn_id = NEW.turn_id
332
+ AND inference.state != 'pending'
333
+ AND (
334
+ (inference.kind = 'bare' AND NEW.op = 'BARE')
335
+ OR (
336
+ inference.kind = 'emission'
337
+ AND NEW.op IS NULL
338
+ AND json_extract(NEW.attrs, '$.kind') = 'emissionAttempt'
339
+ )
340
+ )
341
+ )
342
+ BEGIN
343
+ SELECT RAISE(ABORT, 'log entry model call does not match its represented result');
344
+ END;
345
+
346
+ -- Successful log-KILL rows are durable curation events even though
347
+ -- their ordinary packet projection is suppressed. Preserve the exact selected
348
+ -- set and each target's before/after projection so a broad selector never
349
+ -- collapses into the lossy fact `matched: N`.
350
+ CREATE TABLE IF NOT EXISTS log_curation_effects (
351
+ operation_log_entry_id INTEGER NOT NULL,
352
+ target_log_entry_id INTEGER NOT NULL,
353
+ active_before INTEGER NOT NULL CHECK (active_before IN (0, 1)),
354
+ active_after INTEGER NOT NULL CHECK (active_after IN (0, 1)),
355
+ folded_before TEXT NOT NULL
356
+ CHECK (json_valid(folded_before) AND json_type(folded_before) = 'array'),
357
+ folded_after TEXT NOT NULL
358
+ CHECK (json_valid(folded_after) AND json_type(folded_after) = 'array'),
359
+ PRIMARY KEY (operation_log_entry_id, target_log_entry_id),
360
+ CHECK (operation_log_entry_id != target_log_entry_id),
361
+ FOREIGN KEY (operation_log_entry_id) REFERENCES log_entries(id) ON DELETE CASCADE,
362
+ FOREIGN KEY (target_log_entry_id) REFERENCES log_entries(id) ON DELETE CASCADE
363
+ ) STRICT, WITHOUT ROWID;
364
+
365
+ CREATE INDEX IF NOT EXISTS log_curation_effects_target
366
+ ON log_curation_effects (target_log_entry_id);
367
+
368
+ -- Curation effects are append-only execution evidence. They may disappear
369
+ -- only when either referenced event is already being removed with its
370
+ -- containing history; direct mutation while both events survive is forbidden.
371
+ CREATE TRIGGER IF NOT EXISTS log_curation_effects_immutable
372
+ BEFORE UPDATE ON log_curation_effects
373
+ BEGIN
374
+ SELECT RAISE(ABORT, 'log curation effects are immutable execution evidence');
375
+ END;
376
+
377
+ CREATE TRIGGER IF NOT EXISTS log_curation_effects_delete_with_history_only
378
+ BEFORE DELETE ON log_curation_effects
379
+ WHEN EXISTS (
380
+ SELECT 1 FROM log_entries WHERE id = OLD.operation_log_entry_id
381
+ )
382
+ AND EXISTS (
383
+ SELECT 1 FROM log_entries WHERE id = OLD.target_log_entry_id
384
+ )
385
+ BEGIN
386
+ SELECT RAISE(ABORT, 'log curation effects can only be removed with their containing history');
387
+ END;
388
+
389
+ -- Make an invalid curation record structurally unavailable: the event must be
390
+ -- one successful log-KILL row, both rows must belong to the same
391
+ -- worker, and its state transition must match that op.
392
+ CREATE TRIGGER IF NOT EXISTS log_curation_effects_valid
393
+ BEFORE INSERT ON log_curation_effects
394
+ BEGIN
395
+ SELECT CASE WHEN
396
+ NOT EXISTS (
397
+ SELECT 1
398
+ FROM log_entries operation
399
+ JOIN log_entries target ON target.id = NEW.target_log_entry_id
400
+ WHERE operation.id = NEW.operation_log_entry_id
401
+ AND operation.op = 'KILL'
402
+ AND operation.status_rx < 400
403
+ AND operation.worker_id = target.worker_id
404
+ )
405
+ OR NOT EXISTS (
406
+ -- {§log-kill-scope} — a scoped KILL keeps the row active and changes its visibility;
407
+ -- a whole KILL retires it with its visibility untouched.
408
+ SELECT 1
409
+ FROM log_entries operation
410
+ WHERE operation.id = NEW.operation_log_entry_id
411
+ AND operation.op = 'KILL'
412
+ AND operation.scheme = 'log'
413
+ AND NEW.active_before = 1
414
+ AND (
415
+ NEW.active_after = 1
416
+ OR (
417
+ NEW.active_after = 0
418
+ AND json(NEW.folded_before) = json(NEW.folded_after)
419
+ )
420
+ )
421
+ )
422
+ OR EXISTS (
423
+ SELECT 1
424
+ FROM (
425
+ SELECT 'before' AS side, key, value, type FROM json_each(NEW.folded_before)
426
+ UNION ALL
427
+ SELECT 'after' AS side, key, value, type FROM json_each(NEW.folded_after)
428
+ ) range
429
+ WHERE range.type != 'array'
430
+ OR json_array_length(range.value) != 2
431
+ OR COALESCE(json_type(range.value, '$[0]'), '') != 'integer'
432
+ OR COALESCE(json_type(range.value, '$[1]'), '') != 'integer'
433
+ OR json_extract(range.value, '$[0]') < 1
434
+ OR (
435
+ json_extract(range.value, '$[1]') != -1
436
+ AND json_extract(range.value, '$[1]') < json_extract(range.value, '$[0]')
437
+ )
438
+ OR EXISTS (
439
+ SELECT 1
440
+ FROM (
441
+ SELECT key, value FROM json_each(
442
+ CASE range.side
443
+ WHEN 'before' THEN NEW.folded_before
444
+ ELSE NEW.folded_after
445
+ END
446
+ )
447
+ ) previous
448
+ WHERE previous.key = range.key - 1
449
+ AND (
450
+ json_extract(previous.value, '$[1]') = -1
451
+ OR json_extract(range.value, '$[0]') <= json_extract(previous.value, '$[1]') + 1
452
+ )
453
+ )
454
+ )
455
+ THEN RAISE(ABORT, 'invalid log curation effect') END;
456
+ END;
457
+
458
+ -- The dispatcher binds an exact, transient curation plan into attrs on the
459
+ -- successful log-KILL row. No other row may carry that payload.
460
+ CREATE TRIGGER IF NOT EXISTS log_entries_curation_payload_valid
461
+ BEFORE INSERT ON log_entries
462
+ WHEN json_type(NEW.attrs, '$.__plurnk_curation') IS NOT NULL
463
+ AND NOT (
464
+ NEW.op = 'KILL'
465
+ AND NEW.status_rx < 400
466
+ AND NEW.scheme = 'log'
467
+ AND json_type(NEW.attrs, '$.__plurnk_curation') = 'object'
468
+ )
469
+ BEGIN
470
+ SELECT RAISE(ABORT, 'private log curation payload requires a successful log curation row');
471
+ END;
472
+
473
+ -- Column-scoped immutability: the original action's identity, target, and
474
+ -- initial projection never change. Proposal lifecycle may mutate its outcome;
475
+ -- curation state lives outside the event row. Keep attrs separate so the
476
+ -- curation trigger's private-payload removal cannot exempt other columns.
477
+ CREATE TRIGGER IF NOT EXISTS log_entries_immutable_core
478
+ BEFORE UPDATE OF
479
+ worker_id, loop_id, turn_id, sequence, at, origin, source, inherited_history, model_call_id,
480
+ op, signal,
481
+ scheme, username, password, hostname,
482
+ port, pathname, query, fragment,
483
+ lineMarker, tx, mimetype_tx, mimetype_rx, initial_folded
484
+ ON log_entries
485
+ BEGIN
486
+ SELECT RAISE(ABORT, 'log_entries core fields are immutable; only lifecycle outcome and derived attachments may change');
487
+ END;
488
+
489
+ CREATE TRIGGER IF NOT EXISTS log_entries_immutable_attrs
490
+ BEFORE UPDATE OF attrs ON log_entries
491
+ WHEN COALESCE((
492
+ json_type(OLD.attrs, '$.__plurnk_curation') = 'object'
493
+ AND NEW.attrs = json_remove(OLD.attrs, '$.__plurnk_curation')
494
+ ), 0) = 0
495
+ BEGIN
496
+ SELECT RAISE(ABORT, 'log_entries attrs are immutable outside curation payload removal');
497
+ END;
498
+
499
+ -- The engine may stamp an originating row exactly once. No later reassignment
500
+ -- can sever or counterfeit the occurrence identity.
501
+ CREATE TRIGGER IF NOT EXISTS log_entries_ambient_event_once
502
+ BEFORE UPDATE OF ambient_event_id ON log_entries
503
+ WHEN NOT (OLD.ambient_event_id IS NULL AND NEW.ambient_event_id IS NOT NULL)
504
+ BEGIN
505
+ SELECT RAISE(ABORT, 'log_entries ambient event identity may only be assigned once');
506
+ END;
507
+
508
+ -- One relational projection owns activity eligibility, audience, and snapshot
509
+ -- shape for both immediately-final and proposal-settlement paths.
510
+ CREATE VIEW IF NOT EXISTS ambient_activity_candidates AS
511
+ SELECT *
512
+ FROM (
513
+ SELECT w.workspace_id,
514
+ le.worker_id AS producer_worker_id,
515
+ -- {§env-delta-child-activity} — the runtime's own materialization (turn-0
516
+ -- initialization, doc-reconciliation maintenance, operation batches) is
517
+ -- private to the worker it serves and never crosses to the parent.
518
+ CASE
519
+ WHEN t.producer = '_plurnk' AND t.kind IN ('operation', 'initialization', 'maintenance') THEN NULL
520
+ ELSE w.parent_worker_id
521
+ END AS target_parent_worker_id,
522
+ CASE
523
+ WHEN le.state = 'resolved'
524
+ AND NOT (t.producer = '_plurnk' AND t.kind = 'maintenance')
525
+ AND le.status_rx BETWEEN 200 AND 399
526
+ AND le.status_rx != 304
527
+ AND (
528
+ (
529
+ le.op IN ('EDIT', 'KILL')
530
+ AND le.scheme = 'worker'
531
+ AND le.hostname IS NULL
532
+ AND le.pathname IS NOT NULL
533
+ )
534
+ OR (
535
+ le.op IN ('COPY', 'MOVE')
536
+ AND json_valid(le.rx)
537
+ AND EXISTS (
538
+ SELECT 1 FROM json_each(le.rx, '$.effects') effect
539
+ WHERE json_type(effect.value) = 'object'
540
+ AND substr(CAST(json_extract(effect.value, '$.target') AS TEXT), 1, 10) = 'worker:///'
541
+ )
542
+ )
543
+ )
544
+ THEN 1 ELSE 0
545
+ END AS workspace_broadcast,
546
+ le.id AS source_record_id,
547
+ le.at,
548
+ le.source,
549
+ le.op,
550
+ le.signal,
551
+ le.scheme,
552
+ le.username,
553
+ le.password,
554
+ le.hostname,
555
+ le.port,
556
+ le.pathname,
557
+ le.query,
558
+ le.fragment,
559
+ le.lineMarker AS line_marker,
560
+ le.tx,
561
+ le.mimetype_tx,
562
+ le.rx,
563
+ le.mimetype_rx,
564
+ le.status_rx,
565
+ le.state,
566
+ le.outcome,
567
+ json_remove(le.attrs, '$.__plurnk_curation') AS attrs
568
+ FROM log_entries le
569
+ JOIN workers w ON w.id = le.worker_id
570
+ JOIN loops l ON l.id = le.loop_id
571
+ JOIN turns t ON t.id = le.turn_id
572
+ WHERE le.ambient_event_id IS NULL
573
+ AND le.inherited_history = 0
574
+ AND le.op IS NOT NULL
575
+ AND le.state != 'proposed'
576
+ AND NOT (
577
+ le.op IN ('NEXT', 'WAIT', 'DONE', 'FAIL')
578
+ AND l.status IN (200, 413, 429, 499, 500, 504, 508)
579
+ )
580
+ ) candidate
581
+ WHERE target_parent_worker_id IS NOT NULL OR workspace_broadcast = 1;