@plurnk/plurnk-service 1.7.0 → 1.9.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 (381) hide show
  1. package/.env.defaults +49 -42
  2. package/INSTALL.md +48 -11
  3. package/README.md +12 -2
  4. package/SPEC.md +1166 -475
  5. package/digest-sql/channel-dispositions/dispositions.sql +15 -0
  6. package/digest-sql/channel-state/state.sql +6 -0
  7. package/digest-sql/curation/curation.sql +5 -0
  8. package/digest-sql/derivations/derivations.sql +4 -0
  9. package/digest-sql/embeddings/embeddings.sql +4 -0
  10. package/digest-sql/entry-dispositions/dispositions.sql +15 -0
  11. package/digest-sql/entry-state/state.sql +6 -0
  12. package/digest-sql/token-counts/token-counts.sql +2 -0
  13. package/dist/Paths.d.ts +0 -4
  14. package/dist/Paths.d.ts.map +1 -1
  15. package/dist/Paths.js +1 -21
  16. package/dist/Paths.js.map +1 -1
  17. package/dist/build-info.json +1 -1
  18. package/dist/content/read-projector.d.ts.map +1 -1
  19. package/dist/content/read-projector.js +4 -3
  20. package/dist/content/read-projector.js.map +1 -1
  21. package/dist/core/BudgetReadout.d.ts.map +1 -1
  22. package/dist/core/BudgetReadout.js +12 -22
  23. package/dist/core/BudgetReadout.js.map +1 -1
  24. package/dist/core/ChannelWrite.d.ts +8 -3
  25. package/dist/core/ChannelWrite.d.ts.map +1 -1
  26. package/dist/core/ChannelWrite.js +40 -8
  27. package/dist/core/ChannelWrite.js.map +1 -1
  28. package/dist/core/ChannelWrite.sql +19 -5
  29. package/dist/core/CoreSchemeServices.d.ts +7 -3
  30. package/dist/core/CoreSchemeServices.d.ts.map +1 -1
  31. package/dist/core/CoreSchemeServices.js +8 -1
  32. package/dist/core/CoreSchemeServices.js.map +1 -1
  33. package/dist/core/Dispatcher.d.ts +15 -6
  34. package/dist/core/Dispatcher.d.ts.map +1 -1
  35. package/dist/core/Dispatcher.js +352 -306
  36. package/dist/core/Dispatcher.js.map +1 -1
  37. package/dist/core/Engine.d.ts +22 -10
  38. package/dist/core/Engine.d.ts.map +1 -1
  39. package/dist/core/Engine.js +86 -46
  40. package/dist/core/Engine.js.map +1 -1
  41. package/dist/core/Engine.sql +202 -177
  42. package/dist/core/EntryAddressBinding.d.ts +32 -0
  43. package/dist/core/EntryAddressBinding.d.ts.map +1 -0
  44. package/dist/core/EntryAddressBinding.js +93 -0
  45. package/dist/core/EntryAddressBinding.js.map +1 -0
  46. package/dist/core/ExecutorRegistry.d.ts +12 -6
  47. package/dist/core/ExecutorRegistry.d.ts.map +1 -1
  48. package/dist/core/ExecutorRegistry.js +34 -31
  49. package/dist/core/ExecutorRegistry.js.map +1 -1
  50. package/dist/core/HostPaths.d.ts +29 -0
  51. package/dist/core/HostPaths.d.ts.map +1 -0
  52. package/dist/core/HostPaths.js +74 -0
  53. package/dist/core/HostPaths.js.map +1 -0
  54. package/dist/core/LegacyHome.d.ts +10 -0
  55. package/dist/core/LegacyHome.d.ts.map +1 -0
  56. package/dist/core/LegacyHome.js +170 -0
  57. package/dist/core/LegacyHome.js.map +1 -0
  58. package/dist/core/LogBody.d.ts +1 -1
  59. package/dist/core/LogBody.d.ts.map +1 -1
  60. package/dist/core/LogBody.js +21 -3
  61. package/dist/core/LogBody.js.map +1 -1
  62. package/dist/core/LogEntryProjection.js +1 -1
  63. package/dist/core/LogEntryProjection.js.map +1 -1
  64. package/dist/core/LogVisibility.d.ts +28 -0
  65. package/dist/core/LogVisibility.d.ts.map +1 -0
  66. package/dist/core/LogVisibility.js +215 -0
  67. package/dist/core/LogVisibility.js.map +1 -0
  68. package/dist/core/LoopLifecycle.d.ts +1 -0
  69. package/dist/core/LoopLifecycle.d.ts.map +1 -1
  70. package/dist/core/LoopLifecycle.js +8 -0
  71. package/dist/core/LoopLifecycle.js.map +1 -1
  72. package/dist/core/LoopLifecycle.sql +10 -0
  73. package/dist/core/OperatorConfig.d.ts +6 -0
  74. package/dist/core/OperatorConfig.d.ts.map +1 -0
  75. package/dist/core/OperatorConfig.js +95 -0
  76. package/dist/core/OperatorConfig.js.map +1 -0
  77. package/dist/core/OverflowTurn.d.ts +11 -0
  78. package/dist/core/OverflowTurn.d.ts.map +1 -0
  79. package/dist/core/OverflowTurn.js +81 -0
  80. package/dist/core/OverflowTurn.js.map +1 -0
  81. package/dist/core/Owner.js +3 -3
  82. package/dist/core/Owner.js.map +1 -1
  83. package/dist/core/PacketBuilder.d.ts +7 -15
  84. package/dist/core/PacketBuilder.d.ts.map +1 -1
  85. package/dist/core/PacketBuilder.js +64 -127
  86. package/dist/core/PacketBuilder.js.map +1 -1
  87. package/dist/core/ProblemLog.js +1 -1
  88. package/dist/core/ProblemLog.js.map +1 -1
  89. package/dist/core/ProposalLifecycle.d.ts +4 -1
  90. package/dist/core/ProposalLifecycle.d.ts.map +1 -1
  91. package/dist/core/ProposalLifecycle.js +86 -47
  92. package/dist/core/ProposalLifecycle.js.map +1 -1
  93. package/dist/core/ProviderInstantiate.d.ts +9 -5
  94. package/dist/core/ProviderInstantiate.d.ts.map +1 -1
  95. package/dist/core/ProviderInstantiate.js +99 -104
  96. package/dist/core/ProviderInstantiate.js.map +1 -1
  97. package/dist/core/ReasoningEvent.d.ts +13 -0
  98. package/dist/core/ReasoningEvent.d.ts.map +1 -0
  99. package/dist/core/ReasoningEvent.js +6 -0
  100. package/dist/core/ReasoningEvent.js.map +1 -0
  101. package/dist/core/ResourceMutations.d.ts +15 -19
  102. package/dist/core/ResourceMutations.d.ts.map +1 -1
  103. package/dist/core/ResourceMutations.js +118 -41
  104. package/dist/core/ResourceMutations.js.map +1 -1
  105. package/dist/core/SchemeRegistry.d.ts +12 -12
  106. package/dist/core/SchemeRegistry.d.ts.map +1 -1
  107. package/dist/core/SchemeRegistry.js +58 -57
  108. package/dist/core/SchemeRegistry.js.map +1 -1
  109. package/dist/core/ToolResources.d.ts +19 -0
  110. package/dist/core/ToolResources.d.ts.map +1 -0
  111. package/dist/core/ToolResources.js +123 -0
  112. package/dist/core/ToolResources.js.map +1 -0
  113. package/dist/core/Turn.d.ts +27 -0
  114. package/dist/core/Turn.d.ts.map +1 -0
  115. package/dist/core/Turn.js +43 -0
  116. package/dist/core/Turn.js.map +1 -0
  117. package/dist/core/Turn.sql +72 -0
  118. package/dist/core/TurnOps.d.ts +7 -0
  119. package/dist/core/TurnOps.d.ts.map +1 -0
  120. package/dist/core/TurnOps.js +73 -0
  121. package/dist/core/TurnOps.js.map +1 -0
  122. package/dist/core/TurnRunner.d.ts +56 -5
  123. package/dist/core/TurnRunner.d.ts.map +1 -1
  124. package/dist/core/TurnRunner.js +1163 -929
  125. package/dist/core/TurnRunner.js.map +1 -1
  126. package/dist/core/WorkerName.d.ts +2 -1
  127. package/dist/core/WorkerName.d.ts.map +1 -1
  128. package/dist/core/WorkerName.js +2 -1
  129. package/dist/core/WorkerName.js.map +1 -1
  130. package/dist/core/WorkerName.sql +17 -2
  131. package/dist/core/WorkspaceGate.js +1 -1
  132. package/dist/core/WorkspaceGate.js.map +1 -1
  133. package/dist/core/caps/CapsResolve.d.ts +2 -2
  134. package/dist/core/caps/CapsResolve.d.ts.map +1 -1
  135. package/dist/core/caps/CapsResolve.js +5 -7
  136. package/dist/core/caps/CapsResolve.js.map +1 -1
  137. package/dist/core/caps/DbChannelCaps.d.ts +1 -1
  138. package/dist/core/caps/DbChannelCaps.d.ts.map +1 -1
  139. package/dist/core/caps/DbChannelCaps.js +13 -11
  140. package/dist/core/caps/DbChannelCaps.js.map +1 -1
  141. package/dist/core/caps/DbEntryCaps.d.ts +5 -5
  142. package/dist/core/caps/DbEntryCaps.d.ts.map +1 -1
  143. package/dist/core/caps/DbEntryCaps.js +27 -30
  144. package/dist/core/caps/DbEntryCaps.js.map +1 -1
  145. package/dist/core/caps/DbNotifyCaps.d.ts +1 -1
  146. package/dist/core/caps/DbNotifyCaps.d.ts.map +1 -1
  147. package/dist/core/caps/DbNotifyCaps.js +5 -3
  148. package/dist/core/caps/DbNotifyCaps.js.map +1 -1
  149. package/dist/core/caps/DbSubscriptionCaps.d.ts +3 -3
  150. package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -1
  151. package/dist/core/caps/DbSubscriptionCaps.js +16 -26
  152. package/dist/core/caps/DbSubscriptionCaps.js.map +1 -1
  153. package/dist/core/caps/SchemeCtxImpl.d.ts +6 -4
  154. package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -1
  155. package/dist/core/caps/SchemeCtxImpl.js +37 -5
  156. package/dist/core/caps/SchemeCtxImpl.js.map +1 -1
  157. package/dist/core/env-defaults.d.ts.map +1 -1
  158. package/dist/core/env-defaults.js +7 -5
  159. package/dist/core/env-defaults.js.map +1 -1
  160. package/dist/core/file-creation-policy.d.ts +9 -0
  161. package/dist/core/file-creation-policy.d.ts.map +1 -0
  162. package/dist/core/file-creation-policy.js +25 -0
  163. package/dist/core/file-creation-policy.js.map +1 -0
  164. package/dist/core/fork.d.ts +4 -1
  165. package/dist/core/fork.d.ts.map +1 -1
  166. package/dist/core/fork.js +39 -16
  167. package/dist/core/fork.js.map +1 -1
  168. package/dist/core/fork.sql +83 -40
  169. package/dist/core/git-env.d.ts +0 -1
  170. package/dist/core/git-env.d.ts.map +1 -1
  171. package/dist/core/git-env.js +0 -3
  172. package/dist/core/git-env.js.map +1 -1
  173. package/dist/core/git-membership.d.ts +19 -1
  174. package/dist/core/git-membership.d.ts.map +1 -1
  175. package/dist/core/git-membership.js +233 -74
  176. package/dist/core/git-membership.js.map +1 -1
  177. package/dist/core/git-state.d.ts.map +1 -1
  178. package/dist/core/git-state.js +13 -14
  179. package/dist/core/git-state.js.map +1 -1
  180. package/dist/core/operation-target-groups.d.ts +3 -0
  181. package/dist/core/operation-target-groups.d.ts.map +1 -0
  182. package/dist/core/operation-target-groups.js +53 -0
  183. package/dist/core/operation-target-groups.js.map +1 -0
  184. package/dist/core/packet-inject.d.ts +0 -1
  185. package/dist/core/packet-inject.d.ts.map +1 -1
  186. package/dist/core/packet-inject.js +6 -13
  187. package/dist/core/packet-inject.js.map +1 -1
  188. package/dist/core/packet-wire.d.ts +4 -0
  189. package/dist/core/packet-wire.d.ts.map +1 -1
  190. package/dist/core/packet-wire.js +226 -53
  191. package/dist/core/packet-wire.js.map +1 -1
  192. package/dist/core/plurnk-uri.d.ts +14 -3
  193. package/dist/core/plurnk-uri.d.ts.map +1 -1
  194. package/dist/core/plurnk-uri.js +62 -24
  195. package/dist/core/plurnk-uri.js.map +1 -1
  196. package/dist/core/scheme-types.d.ts +1 -0
  197. package/dist/core/scheme-types.d.ts.map +1 -1
  198. package/dist/core/teaching.d.ts.map +1 -1
  199. package/dist/core/teaching.js +4 -5
  200. package/dist/core/teaching.js.map +1 -1
  201. package/dist/core/worker-ops.sql +10 -6
  202. package/dist/core/worker-settings.d.ts +10 -0
  203. package/dist/core/worker-settings.d.ts.map +1 -0
  204. package/dist/core/worker-settings.js +32 -0
  205. package/dist/core/worker-settings.js.map +1 -0
  206. package/dist/core/workspace-settings.d.ts +2 -11
  207. package/dist/core/workspace-settings.d.ts.map +1 -1
  208. package/dist/core/workspace-settings.js +7 -47
  209. package/dist/core/workspace-settings.js.map +1 -1
  210. package/dist/digest/Digest.d.ts.map +1 -1
  211. package/dist/digest/Digest.js +164 -92
  212. package/dist/digest/Digest.js.map +1 -1
  213. package/dist/digest/digest.sql +9 -3
  214. package/dist/observe/genai.d.ts +9 -0
  215. package/dist/observe/genai.d.ts.map +1 -0
  216. package/dist/observe/genai.js +31 -0
  217. package/dist/observe/genai.js.map +1 -0
  218. package/dist/observe/spans.d.ts +3 -3
  219. package/dist/observe/spans.d.ts.map +1 -1
  220. package/dist/observe/spans.js +20 -5
  221. package/dist/observe/spans.js.map +1 -1
  222. package/dist/schemes/EffectPolicy.d.ts +3 -0
  223. package/dist/schemes/EffectPolicy.d.ts.map +1 -1
  224. package/dist/schemes/EffectPolicy.js +38 -6
  225. package/dist/schemes/EffectPolicy.js.map +1 -1
  226. package/dist/schemes/Exec.d.ts +3 -2
  227. package/dist/schemes/Exec.d.ts.map +1 -1
  228. package/dist/schemes/Exec.js +109 -34
  229. package/dist/schemes/Exec.js.map +1 -1
  230. package/dist/schemes/ExecOutputScheme.d.ts.map +1 -1
  231. package/dist/schemes/ExecOutputScheme.js +5 -4
  232. package/dist/schemes/ExecOutputScheme.js.map +1 -1
  233. package/dist/schemes/File.d.ts.map +1 -1
  234. package/dist/schemes/File.js +170 -80
  235. package/dist/schemes/File.js.map +1 -1
  236. package/dist/schemes/Log.d.ts +6 -2
  237. package/dist/schemes/Log.d.ts.map +1 -1
  238. package/dist/schemes/Log.js +73 -22
  239. package/dist/schemes/Log.js.map +1 -1
  240. package/dist/schemes/Log.sql +25 -7
  241. package/dist/schemes/Prompt.d.ts +2 -3
  242. package/dist/schemes/Prompt.d.ts.map +1 -1
  243. package/dist/schemes/Prompt.js +5 -9
  244. package/dist/schemes/Prompt.js.map +1 -1
  245. package/dist/schemes/QuestionTool.d.ts +10 -0
  246. package/dist/schemes/QuestionTool.d.ts.map +1 -0
  247. package/dist/schemes/QuestionTool.js +81 -0
  248. package/dist/schemes/QuestionTool.js.map +1 -0
  249. package/dist/schemes/Skill.d.ts.map +1 -1
  250. package/dist/schemes/Skill.js +6 -1
  251. package/dist/schemes/Skill.js.map +1 -1
  252. package/dist/schemes/Worker.d.ts.map +1 -1
  253. package/dist/schemes/Worker.js +97 -34
  254. package/dist/schemes/Worker.js.map +1 -1
  255. package/dist/schemes/_entry-crud.d.ts +5 -5
  256. package/dist/schemes/_entry-crud.d.ts.map +1 -1
  257. package/dist/schemes/_entry-crud.js +22 -17
  258. package/dist/schemes/_entry-crud.js.map +1 -1
  259. package/dist/schemes/_entry-crud.sql +77 -24
  260. package/dist/schemes/_entry-find.d.ts +8 -5
  261. package/dist/schemes/_entry-find.d.ts.map +1 -1
  262. package/dist/schemes/_entry-find.js +121 -40
  263. package/dist/schemes/_entry-find.js.map +1 -1
  264. package/dist/schemes/_entry-find.sql +16 -11
  265. package/dist/schemes/_entry-graph.sql +2 -6
  266. package/dist/schemes/_entry-manifest.d.ts +2 -2
  267. package/dist/schemes/_entry-manifest.d.ts.map +1 -1
  268. package/dist/schemes/_entry-manifest.js +18 -6
  269. package/dist/schemes/_entry-manifest.js.map +1 -1
  270. package/dist/schemes/_entry-ops.d.ts +6 -5
  271. package/dist/schemes/_entry-ops.d.ts.map +1 -1
  272. package/dist/schemes/_entry-ops.js +39 -46
  273. package/dist/schemes/_entry-ops.js.map +1 -1
  274. package/dist/schemes/_entry-ops.sql +9 -6
  275. package/dist/schemes/_entry-send.d.ts +2 -2
  276. package/dist/schemes/_entry-send.d.ts.map +1 -1
  277. package/dist/schemes/_entry-send.js +16 -14
  278. package/dist/schemes/_entry-send.js.map +1 -1
  279. package/dist/schemes/_search-index.d.ts.map +1 -1
  280. package/dist/schemes/_search-index.js +39 -25
  281. package/dist/schemes/_search-index.js.map +1 -1
  282. package/dist/server/Daemon.d.ts +98 -15
  283. package/dist/server/Daemon.d.ts.map +1 -1
  284. package/dist/server/Daemon.js +864 -348
  285. package/dist/server/Daemon.js.map +1 -1
  286. package/dist/server/DaemonModule.d.ts +84 -19
  287. package/dist/server/DaemonModule.d.ts.map +1 -1
  288. package/dist/server/DrainSupervisor.d.ts +15 -10
  289. package/dist/server/DrainSupervisor.d.ts.map +1 -1
  290. package/dist/server/DrainSupervisor.js +70 -19
  291. package/dist/server/DrainSupervisor.js.map +1 -1
  292. package/dist/server/Functionality.d.ts +44 -0
  293. package/dist/server/Functionality.d.ts.map +1 -0
  294. package/dist/server/Functionality.js +422 -0
  295. package/dist/server/Functionality.js.map +1 -0
  296. package/dist/server/FunctionalityManager.d.ts +22 -0
  297. package/dist/server/FunctionalityManager.d.ts.map +1 -0
  298. package/dist/server/FunctionalityManager.js +121 -0
  299. package/dist/server/FunctionalityManager.js.map +1 -0
  300. package/dist/server/SkillsFunctionality.d.ts +61 -0
  301. package/dist/server/SkillsFunctionality.d.ts.map +1 -0
  302. package/dist/server/SkillsFunctionality.js +449 -0
  303. package/dist/server/SkillsFunctionality.js.map +1 -0
  304. package/dist/server/WorkerCapabilities.d.ts +21 -0
  305. package/dist/server/WorkerCapabilities.d.ts.map +1 -0
  306. package/dist/server/WorkerCapabilities.js +214 -0
  307. package/dist/server/WorkerCapabilities.js.map +1 -0
  308. package/dist/server/WorkerResidency.d.ts +40 -0
  309. package/dist/server/WorkerResidency.d.ts.map +1 -0
  310. package/dist/server/WorkerResidency.js +283 -0
  311. package/dist/server/WorkerResidency.js.map +1 -0
  312. package/dist/server/client-input.d.ts +6 -2
  313. package/dist/server/client-input.d.ts.map +1 -1
  314. package/dist/server/client-input.js +72 -32
  315. package/dist/server/client-input.js.map +1 -1
  316. package/dist/server/dispatch-as-plurnk.d.ts +2 -2
  317. package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
  318. package/dist/server/dispatch-as-plurnk.js +109 -23
  319. package/dist/server/dispatch-as-plurnk.js.map +1 -1
  320. package/dist/server/drain.sql +33 -13
  321. package/dist/server/envelope.d.ts +7 -2
  322. package/dist/server/envelope.d.ts.map +1 -1
  323. package/dist/server/envelope.js +12 -6
  324. package/dist/server/envelope.js.map +1 -1
  325. package/dist/server/envelope.sql +36 -4
  326. package/dist/server/lifecycle-recovery.sql +24 -17
  327. package/dist/server/logEntry.d.ts +2 -1
  328. package/dist/server/logEntry.d.ts.map +1 -1
  329. package/dist/server/logEntry.js +3 -2
  330. package/dist/server/logEntry.js.map +1 -1
  331. package/dist/server/logEntry.sql +7 -0
  332. package/dist/server/loop-model.d.ts +2 -2
  333. package/dist/server/loop-model.d.ts.map +1 -1
  334. package/dist/server/loop-model.js +23 -33
  335. package/dist/server/loop-model.js.map +1 -1
  336. package/dist/server/loopDocs.d.ts +2 -1
  337. package/dist/server/loopDocs.d.ts.map +1 -1
  338. package/dist/server/loopDocs.js +88 -21
  339. package/dist/server/loopDocs.js.map +1 -1
  340. package/dist/server/loopDocs.sql +14 -8
  341. package/dist/server/model-catalog.d.ts +3 -0
  342. package/dist/server/model-catalog.d.ts.map +1 -0
  343. package/dist/server/model-catalog.js +83 -0
  344. package/dist/server/model-catalog.js.map +1 -0
  345. package/dist/server/model-route.d.ts +7 -0
  346. package/dist/server/model-route.d.ts.map +1 -0
  347. package/dist/server/model-route.js +47 -0
  348. package/dist/server/model-route.js.map +1 -0
  349. package/dist/server/module-discovery.d.ts +13 -0
  350. package/dist/server/module-discovery.d.ts.map +1 -0
  351. package/dist/server/module-discovery.js +103 -0
  352. package/dist/server/module-discovery.js.map +1 -0
  353. package/dist/server/seam-entry-read.sql +9 -7
  354. package/dist/server/seam-log-read.sql +1 -1
  355. package/dist/server/seam-loop.sql +10 -1
  356. package/dist/server/seam-proposal-list.sql +4 -2
  357. package/dist/server/worker-capabilities.sql +19 -0
  358. package/dist/service.d.ts.map +1 -1
  359. package/dist/service.js +193 -124
  360. package/dist/service.js.map +1 -1
  361. package/migrations/001_schema.sql +905 -196
  362. package/package.json +40 -38
  363. package/dist/core/ExecutableTools.d.ts +0 -11
  364. package/dist/core/ExecutableTools.d.ts.map +0 -1
  365. package/dist/core/ExecutableTools.js +0 -49
  366. package/dist/core/ExecutableTools.js.map +0 -1
  367. package/dist/core/JournalTurn.d.ts +0 -9
  368. package/dist/core/JournalTurn.d.ts.map +0 -1
  369. package/dist/core/JournalTurn.js +0 -14
  370. package/dist/core/JournalTurn.js.map +0 -1
  371. package/dist/core/JournalTurn.sql +0 -10
  372. package/dist/core/git-iso.d.ts +0 -13
  373. package/dist/core/git-iso.d.ts.map +0 -1
  374. package/dist/core/git-iso.js +0 -267
  375. package/dist/core/git-iso.js.map +0 -1
  376. package/dist/core/search-gate.d.ts +0 -17
  377. package/dist/core/search-gate.d.ts.map +0 -1
  378. package/dist/core/search-gate.js +0 -77
  379. package/dist/core/search-gate.js.map +0 -1
  380. package/dist/digest/Digest.sql +0 -1
  381. package/dist/server/workspace-capabilities.sql +0 -19
@@ -6,13 +6,13 @@ SELECT status FROM loops WHERE id = $loop_id;
6
6
  -- PREP: engine_worker_has_live_child
7
7
  -- A non-terminal child worker (worker:// spawn/fork set parent_worker_id) — a "live thing the worker holds",
8
8
  -- like an open stream. A SEND signal 200 while one exists is a premature-terminate ({§send-premature-terminate}).
9
- -- Live = a child whose LATEST loop is still pending/running/parked (100/102/202) — the SAME definition
9
+ -- Live = a child with ANY unresolved loop (100/102/202) — the SAME definition
10
10
  -- engine_child_workers_live uses for the Active Child Workers orientation, so the 409 gate and the section the model
11
11
  -- reads NEVER disagree: a refused termination is always backed by a child the model can SEE and KILL
12
- -- ({§child-orientation}). An inherited/historical loop (a fork copies the parent's loops) is not the
13
- -- latest, so it never makes a concluded child look forever-live.
12
+ -- ({§child-orientation}). Administrative loops may interleave with model loops, so newest-loop
13
+ -- inference is not a valid worker-liveness test.
14
14
  SELECT 1 AS live FROM workers r
15
- JOIN loops l ON l.id = (SELECT id FROM loops WHERE worker_id = r.id ORDER BY sequence DESC, id DESC LIMIT 1)
15
+ JOIN loops l ON l.worker_id = r.id
16
16
  WHERE r.parent_worker_id = $worker_id AND l.status IN (100, 102, 202) LIMIT 1;
17
17
 
18
18
  -- PREP: engine_count_active_loops_for_worker
@@ -36,9 +36,18 @@ UPDATE loops SET flags = $flags WHERE id = $loop_id;
36
36
  UPDATE loops SET open_paths = $open_paths WHERE id = $loop_id;
37
37
 
38
38
  -- PREP: engine_get_loop_prompt
39
- -- Initial prompt frame. On turn 1, runTurn stores the owner-keyed
40
- -- prompt:///<loop>/1 entry with its selected paths and publishes it.
41
- SELECT prompt, sequence, open_paths FROM loops WHERE id = $loop_id;
39
+ -- Initial prompt frame. Its durable log occurrence, not a process-local/model
40
+ -- ordinal, decides whether runTurn still needs to publish it.
41
+ SELECT l.prompt, l.prompt_source, l.sequence, l.open_paths,
42
+ EXISTS (
43
+ SELECT 1
44
+ FROM log_entries le
45
+ WHERE le.loop_id = l.id
46
+ AND le.op = 'prompt'
47
+ AND le.pathname = '/' || l.sequence || '/1'
48
+ ) AS prompt_published
49
+ FROM loops l
50
+ WHERE l.id = $loop_id;
42
51
 
43
52
  -- PREP: engine_reclaim_queued_loop
44
53
  -- {§worker-lifecycle-wake-requeue-not-terminal} — atomic 100→102 re-claim by loop id. A wake
@@ -52,22 +61,11 @@ UPDATE loops SET status = 102 WHERE id = $loop_id AND status = 100;
52
61
  -- each owning use site with its declared composition semantics.
53
62
  SELECT settings FROM workspaces WHERE id = $workspace_id;
54
63
 
55
- -- PREP: engine_target_diverged_this_turn
56
- -- #note10 — did this entry diverge on disk THIS turn? A source=file env-delta for the
57
- -- target, materialized into this worker's log at the current turn, means the model's view
58
- -- predates the ambient change — a auto resolution of a same-turn EDIT would clobber it.
59
- SELECT 1 AS hit
60
- FROM log_entries
61
- WHERE worker_id = $worker_id AND turn_id = $turn_id
62
- AND origin = 'plurnk' AND source = 'file' AND op = 'EDIT'
63
- AND scheme IS $scheme AND pathname = $pathname
64
- LIMIT 1;
65
-
66
64
  -- PREP: engine_list_owner_entries
67
65
  -- {§entry-owner} — one principal's entries (catalogRowsFor source for an owner-scoped FIND/foist):
68
66
  -- the commons, a worker's own space, or a named space — exactly one owner's rows, its perspective.
69
- SELECT e.id AS entry_id, e.scheme, e.pathname, ec.name AS channel, ec.content, ec.mimetype, ec.weight AS weight, e.deep_hash,
70
- d.parse_issues,
67
+ SELECT e.id AS entry_id, e.scheme, e.authority, e.pathname, ec.name AS channel, ec.content, ec.mimetype, ec.weight AS weight, ec.deep_hash,
68
+ d.parse_issues, d.summary,
71
69
  s.id AS subscription_id,
72
70
  CASE WHEN s.closed_at IS NULL
73
71
  THEN CAST(unixepoch('now') - unixepoch(s.opened_at) AS INTEGER)
@@ -76,7 +74,8 @@ SELECT e.id AS entry_id, e.scheme, e.pathname, ec.name AS channel, ec.content, e
76
74
  s.close_status
77
75
  FROM entries e
78
76
  JOIN entry_channels ec ON ec.entry_id = e.id
79
- LEFT JOIN derivations d ON d.deep_hash = e.deep_hash
77
+ JOIN workers owner ON owner.id = e.owner_id
78
+ LEFT JOIN derivations d ON d.deep_hash = ec.deep_hash
80
79
  LEFT JOIN subscriptions s ON s.id = (
81
80
  SELECT latest.id
82
81
  FROM subscriptions latest
@@ -84,22 +83,23 @@ LEFT JOIN subscriptions s ON s.id = (
84
83
  ORDER BY latest.id DESC
85
84
  LIMIT 1
86
85
  )
87
- WHERE e.workspace_id = $workspace_id AND e.owner_id = $owner_id
86
+ WHERE owner.workspace_id = $workspace_id AND e.owner_id = $owner_id
88
87
  ORDER BY e.updated_at ASC, e.id ASC, ec.name;
89
88
 
90
89
  -- PREP: engine_next_turn_sequence
91
90
  SELECT COALESCE(MAX(sequence), 0) + 1 AS next FROM turns WHERE loop_id = $loop_id;
92
91
 
93
92
  -- PREP: engine_loop_usage
94
- -- Latest-turn gauge ({§tokenomics-client-gauge}), surfaced beside the derived
93
+ -- Latest packet-bearing model-turn gauge ({§tokenomics-client-gauge}), surfaced beside the derived
95
94
  -- accounting projection on {§notifications-loop-terminated}. Physical usage
96
95
  -- and capacity bind to the same latest completed emission call. A preflight
97
96
  -- rejection has capacity evidence but no physical input usage; neither fact
98
- -- falls back to an earlier call or turn.
97
+ -- falls back to an earlier call. Packetless chronology cannot erase the latest
98
+ -- assembled model request.
99
99
  WITH latest_turn AS (
100
100
  SELECT id, packet, usage_curation_budget, meta
101
101
  FROM turns
102
- WHERE loop_id = $loop_id
102
+ WHERE loop_id = $loop_id AND packet IS NOT NULL
103
103
  ORDER BY sequence DESC
104
104
  LIMIT 1
105
105
  ), latest_emission AS (
@@ -167,29 +167,6 @@ SELECT l.sequence AS loop_seq, t.sequence AS turn_seq
167
167
  FROM loops l, turns t
168
168
  WHERE l.id = $loop_id AND t.id = $turn_id;
169
169
 
170
- -- PREP: engine_open_turn
171
- -- Turn-as-container model: insert a turn row at runTurn open with no assembled
172
- -- model request and status=102 (in-progress). Pre-model writes
173
- -- (the user prompt; later, system signals/notices) land into
174
- -- this row before the provider is called. The turn is then "closed"
175
- -- via engine_close_turn with the final packet + status + usage stats
176
- -- after dispatch completes.
177
- INSERT INTO turns (loop_id, sequence, status)
178
- VALUES ($loop_id, $sequence, 102)
179
- RETURNING id;
180
-
181
- -- PREP: engine_close_turn
182
- -- Updates the turn with the response packet and terminal metadata once dispatch
183
- -- is complete. Provider attempts own and materialize usage/cost above this path.
184
- UPDATE turns SET
185
- status = $status,
186
- packet = $packet,
187
- usage_curation_budget = $usage_curation_budget,
188
- finish_reason = $finish_reason,
189
- model = $model,
190
- meta = $meta
191
- WHERE id = $id;
192
-
193
170
  -- PREP: engine_open_model_call
194
171
  -- Logical identity and request attribution become durable before provider I/O.
195
172
  INSERT INTO model_calls (turn_id, sequence, kind, attributions, model)
@@ -263,7 +240,7 @@ WHERE id = $id AND state = 'pending';
263
240
  -- The latest subscription carries stream lifecycle into the catalog. `seconds`
264
241
  -- is the live age of an open stream; close_status is the exact terminal status
265
242
  -- of a closed one. Entries with no subscription remain ordinary static entries.
266
- SELECT e.id AS entry_id, e.scheme, e.pathname, ec.name AS channel, ec.content, ec.mimetype, ec.weight AS weight, e.deep_hash,
243
+ SELECT e.id AS entry_id, e.scheme, e.authority, e.pathname, ec.name AS channel, ec.content, ec.mimetype, ec.weight AS weight, ec.deep_hash,
267
244
  s.id AS subscription_id,
268
245
  CASE WHEN s.closed_at IS NULL
269
246
  THEN CAST(unixepoch('now') - unixepoch(s.opened_at) AS INTEGER)
@@ -272,6 +249,7 @@ SELECT e.id AS entry_id, e.scheme, e.pathname, ec.name AS channel, ec.content, e
272
249
  s.close_status
273
250
  FROM entries e
274
251
  JOIN entry_channels ec ON ec.entry_id = e.id
252
+ JOIN workers owner ON owner.id = e.owner_id
275
253
  LEFT JOIN subscriptions s ON s.id = (
276
254
  SELECT latest.id
277
255
  FROM subscriptions latest
@@ -279,7 +257,7 @@ LEFT JOIN subscriptions s ON s.id = (
279
257
  ORDER BY latest.id DESC
280
258
  LIMIT 1
281
259
  )
282
- WHERE e.workspace_id = $workspace_id
260
+ WHERE owner.workspace_id = $workspace_id
283
261
  -- User Note 5 — mtime-ascending: dormant entries hold the stable prompt-cache prefix; churn clusters at the tail.
284
262
  ORDER BY e.updated_at ASC, e.id ASC, ec.name;
285
263
 
@@ -292,33 +270,31 @@ SELECT e.scheme AS scheme,
292
270
  COUNT(DISTINCT e.id) AS entries,
293
271
  COUNT(DISTINCT CASE
294
272
  WHEN instr(ltrim(e.pathname, '/'), '/') = 0
295
- THEN 'entry:' || ltrim(e.pathname, '/')
296
- ELSE 'scope:' || substr(ltrim(e.pathname, '/'), 1, instr(ltrim(e.pathname, '/'), '/'))
273
+ THEN json_array('entry', e.authority, ltrim(e.pathname, '/'))
274
+ ELSE json_array('scope', e.authority, substr(ltrim(e.pathname, '/'), 1, instr(ltrim(e.pathname, '/'), '/')))
297
275
  END) AS shallow_items
298
276
  FROM entries e
299
277
  JOIN entry_channels ec ON ec.entry_id = e.id
300
- WHERE e.workspace_id = $workspace_id
278
+ JOIN workers owner ON owner.id = e.owner_id
279
+ WHERE owner.workspace_id = $workspace_id
301
280
  GROUP BY e.scheme
302
281
  ORDER BY e.scheme;
303
282
 
304
283
  -- PREP: engine_initialize_ambient_cursor
305
- -- A worker's first packet reads current shared state directly, so pre-existing
306
- -- occurrences are its baseline rather than historical deltas. The NULL guard
307
- -- makes this safe on every turn and preserves a fork's inherited progress.
308
- UPDATE workers
309
- SET ambient_event_cursor = COALESCE((
310
- SELECT MAX(ae.id) FROM ambient_events ae WHERE ae.workspace_id = $workspace_id
311
- ), 0)
284
+ -- Worker creation owns the baseline, and fork creation owns its inherited
285
+ -- cursor/boundary. Packet assembly merely verifies that durable invariant.
286
+ SELECT ambient_event_cursor
287
+ FROM workers
312
288
  WHERE id = $worker_id
313
- AND workspace_id = $workspace_id
314
- AND ambient_event_cursor IS NULL
315
- RETURNING ambient_event_cursor;
289
+ AND workspace_id = $workspace_id;
316
290
 
317
291
  -- PREP: engine_pull_ambient_events
318
292
  -- One SQLite snapshot captures both ends of the closed observation window.
319
293
  -- The LEFT JOIN returns the boundary even when the window contains no event.
320
294
  WITH observation AS (
321
295
  SELECT w.ambient_event_cursor AS cursor,
296
+ w.parent_worker_id,
297
+ w.fork_event_boundary,
322
298
  COALESCE(
323
299
  (SELECT MAX(ae.id) FROM ambient_events ae WHERE ae.workspace_id = $workspace_id),
324
300
  w.ambient_event_cursor,
@@ -329,8 +305,12 @@ WITH observation AS (
329
305
  )
330
306
  SELECT o.cursor, o.boundary,
331
307
  ae.id AS event_id, ae.producer_worker_id, producer.name AS producer_worker_name,
332
- ae.kind, ae.source,
333
- ae.op, ae.scheme, ae.hostname, ae.pathname, ae.rx, ae.attrs, ae.tags,
308
+ ae.kind, ae.source, ae.at,
309
+ ae.op, ae.delimiter, ae.signal,
310
+ ae.scheme, ae.username, ae.password, ae.hostname, ae.port,
311
+ ae.pathname, ae.query, ae.fragment, ae.line_marker,
312
+ ae.tx, ae.mimetype_tx, ae.rx, ae.mimetype_rx,
313
+ ae.state, ae.outcome, ae.attrs, ae.tags,
334
314
  ae.status_rx, ae.terminated_by
335
315
  FROM observation o
336
316
  LEFT JOIN ambient_events ae
@@ -338,6 +318,15 @@ LEFT JOIN ambient_events ae
338
318
  AND ae.id > o.cursor
339
319
  AND ae.id <= o.boundary
340
320
  AND ae.producer_worker_id != $worker_id
321
+ AND (
322
+ ae.target_parent_worker_id = $worker_id
323
+ OR ae.workspace_broadcast = 1
324
+ OR (
325
+ o.fork_event_boundary IS NOT NULL
326
+ AND ae.target_parent_worker_id = o.parent_worker_id
327
+ AND ae.id <= o.fork_event_boundary
328
+ )
329
+ )
341
330
  LEFT JOIN workers producer ON producer.id = ae.producer_worker_id
342
331
  ORDER BY ae.id;
343
332
 
@@ -346,13 +335,17 @@ ORDER BY ae.id;
346
335
  -- targeted conflict rule makes crash replay idempotent without swallowing any
347
336
  -- unrelated sequence, FK, or shape violation.
348
337
  INSERT INTO log_entries (
349
- worker_id, loop_id, turn_id, sequence, origin, source, ambient_event_id,
350
- op, scheme, hostname, pathname, tx, mimetype_tx,
351
- rx, mimetype_rx, status_rx, weight, expanded, attrs
338
+ worker_id, loop_id, turn_id, sequence, at, origin, source, ambient_event_id,
339
+ op, delimiter, signal,
340
+ scheme, username, password, hostname, port, pathname, query, fragment,
341
+ lineMarker, tx, mimetype_tx,
342
+ rx, mimetype_rx, status_rx, weight, state, outcome, folded, attrs
352
343
  ) VALUES (
353
- $worker_id, $loop_id, $turn_id, $sequence, 'plurnk', $source, $event_id,
354
- $op, $scheme, $hostname, $pathname, '', 'text/plain',
355
- $rx, $mimetype_rx, $status, $weight, $expanded, $attrs
344
+ $worker_id, $loop_id, $turn_id, $sequence, $at, '_plurnk', $source, $event_id,
345
+ $op, $delimiter, $signal,
346
+ $scheme, $username, $password, $hostname, $port, $pathname, $query, $fragment,
347
+ $line_marker, $tx, $mimetype_tx,
348
+ $rx, $mimetype_rx, $status, $weight, $state, $outcome, $folded, $attrs
356
349
  )
357
350
  ON CONFLICT(worker_id, ambient_event_id) WHERE ambient_event_id IS NOT NULL DO NOTHING
358
351
  RETURNING id;
@@ -374,58 +367,59 @@ WHERE id = $worker_id
374
367
  RETURNING ambient_event_cursor;
375
368
 
376
369
  -- PREP: engine_worker_stream_channels
377
- -- {§exec-stream} — every stream channel the worker owns (an EXEC's stdout/stderr live on the
378
- -- runtime-tag entry), with content + mimetype + state + coordinate, so the per-turn injector can
379
- -- publish the channel's next complete unit. Stays listed until its terminal observation is shown.
380
- SELECT s.id AS subscription_id, e.scheme AS runtime, e.pathname AS coord,
370
+ -- {§exec-stream} — every not-yet-terminally-published stream channel the worker
371
+ -- owns, with its durable per-subscription cursor. Log curation never rewinds it.
372
+ SELECT s.id AS subscription_id, sp.id AS publication_id,
373
+ sp.published_end, sp.terminal_published,
374
+ e.scheme AS runtime, e.authority, e.pathname AS coord,
381
375
  ec.name AS channel, ec.content AS content, ec.mimetype AS mimetype,
382
- ec.state AS state, s.close_status AS close_status,
383
- s.close_result AS close_result, s.published_channel AS published_channel
376
+ ec.state AS state, ec.producer_result AS producer_result,
377
+ s.published_channel AS published_channel
384
378
  FROM subscriptions s
385
379
  JOIN entries e ON e.id = s.entry_id
386
- JOIN entry_channels ec ON ec.entry_id = s.entry_id
380
+ JOIN subscription_publications sp ON sp.subscription_id = s.id
381
+ JOIN entry_channels ec ON ec.entry_id = s.entry_id AND ec.name = sp.channel
387
382
  WHERE s.worker_id = $worker_id
388
- AND (s.published_channel IS NULL OR ec.name = s.published_channel)
383
+ AND sp.terminal_published = 0
389
384
  ORDER BY s.id, ec.name;
390
385
 
391
- -- PREP: engine_stream_cursor
392
- -- {§exec-stream} — content offset already shown to the worker: the streamEnd recorded on its latest
393
- -- foisted observation (the caller defaults to 0 when none exists yet).
394
- SELECT attrs
395
- FROM log_entries
396
- WHERE worker_id = $worker_id AND origin = 'plurnk' AND op = 'READ'
397
- AND scheme = $scheme AND pathname = $pathname AND fragment IS $fragment
398
- ORDER BY id DESC LIMIT 1;
399
-
400
386
  -- PREP: engine_insert_stream_delta
401
387
  -- {§exec-stream} / {§env-delta} — materialize a channel's next publishable content as a
402
- -- foisted READ row (the model READs the stream it never typed). origin=plurnk; fragment is
403
- -- the channel; attrs.streamEnd is the next turn's cursor; expanded=1 for a terminal
404
- -- observation, 0 for an ongoing observation. {§exec-stream}
388
+ -- foisted READ row (the model READs the stream it never typed). origin=_plurnk; fragment is
389
+ -- the channel; attrs.streamEnd is the next turn's cursor; terminal observations
390
+ -- are born open and ongoing observations wholly folded. {§exec-stream}
405
391
  INSERT INTO log_entries (
406
392
  worker_id, loop_id, turn_id, sequence, origin, source, model_call_id,
407
- op, scheme, pathname, fragment, tx, mimetype_tx, rx, mimetype_rx, status_rx, weight, attrs, expanded
393
+ subscription_publication_id,
394
+ op, scheme, hostname, port, pathname, fragment, tx, mimetype_tx, rx, mimetype_rx, status_rx, weight, attrs, folded
408
395
  ) VALUES (
409
- $worker_id, $loop_id, $turn_id, $sequence, 'plurnk', NULL, NULL,
410
- 'READ', $scheme, $pathname, $fragment, '', 'text/plain', $rx, 'application/json', $status, $weight, $attrs, $expanded
396
+ $worker_id, $loop_id, $turn_id, $sequence, '_plurnk', NULL, NULL,
397
+ $subscription_publication_id,
398
+ 'READ', $scheme, $hostname, $port, $pathname, $fragment, '', 'text/plain', $rx, 'application/json', $status, $weight, $attrs, $folded
411
399
  );
412
400
 
413
401
  -- PREP: engine_child_workers_live
414
- -- The worker's LIVE child workers — latest loop non-terminal (100 pending / 102 processing / 202 parked).
402
+ -- The worker's LIVE child workers — any loop non-terminal (100 pending / 102 processing / 202 parked).
415
403
  -- Powers the Active Child Workers orienting section ({§child-orientation}): terse `* <status> worker://<name>`
416
404
  -- pointers so the model SEES what it holds live and reasons for itself (READ/KILL), never told to.
417
405
  -- Empty → section omitted.
418
- SELECT r.name, l.status
406
+ SELECT r.name,
407
+ CASE
408
+ WHEN SUM(CASE WHEN l.status = 102 THEN 1 ELSE 0 END) > 0 THEN 102
409
+ WHEN SUM(CASE WHEN l.status = 202 THEN 1 ELSE 0 END) > 0 THEN 202
410
+ ELSE 100
411
+ END AS status
419
412
  FROM workers r
420
- JOIN loops l ON l.id = (SELECT id FROM loops WHERE worker_id = r.id ORDER BY sequence DESC, id DESC LIMIT 1)
413
+ JOIN loops l ON l.worker_id = r.id AND l.status IN (100, 102, 202)
421
414
  WHERE r.parent_worker_id = $worker_id AND l.status IN (100, 102, 202)
415
+ GROUP BY r.id, r.name
422
416
  ORDER BY r.name;
423
417
 
424
418
  -- PREP: engine_child_streams_open
425
419
  -- The worker's OPEN streams (subscriptions not yet closed) — their addressable coord. Powers the Child
426
420
  -- Streams orienting section ({§child-orientation}): terse `* active <runtime>:///<coord>` pointers the
427
421
  -- model OPENs/READs/KILLs. Empty → section omitted.
428
- SELECT s.scheme, e.pathname
422
+ SELECT s.scheme, e.authority, e.pathname
429
423
  FROM subscriptions s
430
424
  JOIN entries e ON e.id = s.entry_id
431
425
  WHERE s.worker_id = $worker_id AND s.closed_at IS NULL
@@ -434,10 +428,22 @@ ORDER BY e.pathname;
434
428
  -- PREP: engine_render_errors
435
429
  -- SPEC {§operation-results}: 4xx/5xx log rows are indexed in the packet's errors as
436
430
  -- LogCoordinate pointers, forcing the model to confront failures instead of letting
437
- -- them rot in log:///. Window = the current turn AND the immediately-prior one
438
- -- (>= current_turn_seq - 1): prior-turn for action failures the model just caused,
439
- -- current-turn so a pre-generate engine error surfaces THIS turn rather than a turn late.
431
+ -- them rot in log:///. Window = the current would-be model turn AND the immediately
432
+ -- preceding completed model turn: prior-model-turn for action failures the
433
+ -- model just caused, current-turn so a pre-generate engine error surfaces THIS turn
434
+ -- rather than a turn late. Packetless chronology never hides a model failure.
440
435
  -- {§operation-result-uniform-error-channel}
436
+ WITH previous_model_turn AS (
437
+ SELECT id
438
+ FROM turns
439
+ WHERE loop_id = $loop_id
440
+ AND sequence < $current_turn_seq
441
+ AND producer = 'model'
442
+ AND kind = 'inference'
443
+ AND completed_at IS NOT NULL
444
+ ORDER BY sequence DESC
445
+ LIMIT 1
446
+ )
441
447
  SELECT
442
448
  le.origin, le.op, le.attrs, le.sequence, le.status_rx, le.rx, le.mimetype_rx,
443
449
  le.scheme, le.pathname,
@@ -449,57 +455,68 @@ WHERE le.loop_id = $loop_id
449
455
  AND le.status_rx >= 400
450
456
  -- {§log-row-self-explains}: every >=400 row points at ITSELF — the op row carries its failure
451
457
  -- message on its meta line (packet-wire), so the pointer leads to a record that states its why.
452
- AND t.sequence >= $current_turn_seq - 1
458
+ AND (
459
+ t.sequence = $current_turn_seq
460
+ OR t.id = (SELECT id FROM previous_model_turn)
461
+ )
453
462
  ORDER BY t.sequence, le.sequence;
454
463
 
455
- -- TX: engine_grinder_fold_newest_turn
456
- -- {§grinder-layer1-rollback} — THE DOCTRINE: the log is the model's memory and the model ALONE
457
- -- curates it (FOLD/KILL). The grinder rolls back only context introduced by the newest turn
458
- -- boundary: rows born in the immediately-prior/current turn plus exact older rows that a successful
459
- -- OPEN in the immediately-prior turn transitioned from folded to open. The durable effect relation
460
- -- owns that landed set; never re-run an authored glob/tag/matcher against later state. An OPEN no-op
461
- -- contributes no older row. Turn 1 is the same rule (no prior turn; its foists are the newest).
462
- -- Folded, never deleted; THREE exemptions ({§grinder-errors-exempt}): op='error',
463
- -- the user prompt, and PLAN. The temporary set captures the
464
- -- selection once so folding and additive `overflow` tagging cannot diverge.
465
- CREATE TEMP TABLE IF NOT EXISTS engine_grinder_fold_set (id INTEGER PRIMARY KEY);
466
- DELETE FROM engine_grinder_fold_set;
467
- WITH previous_turn AS (
468
- SELECT MAX(id) AS id FROM turns WHERE loop_id = $loop_id AND id < $turn_id
464
+ -- PREP: overflow_turn_causal_rows
465
+ -- {§overflow-turn-curation} — one deterministic causal set: rows already in
466
+ -- the packetless candidate, rows from the worker's immediately preceding turn,
467
+ -- and older bodies that preceding turn actually made more visible.
468
+ WITH current_turn AS (
469
+ SELECT turn.id, turn.sequence AS turn_seq,
470
+ loop.id AS loop_id, loop.sequence AS loop_seq, loop.worker_id
471
+ FROM turns turn
472
+ JOIN loops loop ON loop.id = turn.loop_id
473
+ WHERE turn.id = $turn_id AND loop.id = $loop_id
474
+ ),
475
+ previous_turn AS (
476
+ SELECT prior.id
477
+ FROM turns prior
478
+ JOIN loops prior_loop ON prior_loop.id = prior.loop_id
479
+ JOIN current_turn current ON current.worker_id = prior_loop.worker_id
480
+ WHERE prior.completed_at IS NOT NULL
481
+ AND (
482
+ prior_loop.sequence < current.loop_seq
483
+ OR (
484
+ prior_loop.sequence = current.loop_seq
485
+ AND prior.sequence < current.turn_seq
486
+ )
487
+ )
488
+ ORDER BY prior_loop.sequence DESC, prior.sequence DESC
489
+ LIMIT 1
490
+ ),
491
+ causal_rows(id) AS (
492
+ SELECT row.id
493
+ FROM log_entries row
494
+ WHERE row.turn_id = $turn_id
495
+ OR row.turn_id = (SELECT id FROM previous_turn)
496
+ UNION
497
+ SELECT effect.target_log_entry_id
498
+ FROM log_curation_effects effect
499
+ JOIN log_entries operation ON operation.id = effect.operation_log_entry_id
500
+ WHERE operation.turn_id = (SELECT id FROM previous_turn)
501
+ AND operation.op = 'OPEN'
502
+ AND operation.status_rx < 400
503
+ AND effect.folded_before != effect.folded_after
469
504
  )
470
- INSERT INTO engine_grinder_fold_set (id)
471
- SELECT boundary.id
472
- FROM log_entries boundary
473
- WHERE boundary.loop_id = $loop_id
474
- AND boundary.expanded = 1
475
- AND COALESCE(boundary.op, '') NOT IN ('error', 'PLAN')
476
- AND COALESCE(boundary.scheme, '') != 'prompt' -- the task frame ({§prompt-self-only}); NULL-safe: a model-emission row's scheme is NULL
477
- AND (boundary.turn_id = $turn_id OR boundary.turn_id = (SELECT id FROM previous_turn))
478
- UNION
479
- SELECT target.id
480
- FROM log_curation_effects effect
481
- JOIN log_entries operation ON operation.id = effect.operation_log_entry_id
482
- JOIN log_entries target ON target.id = effect.target_log_entry_id
483
- WHERE operation.turn_id = (SELECT id FROM previous_turn)
484
- AND operation.op = 'OPEN'
485
- AND operation.status_rx < 400
486
- AND effect.expanded_before = 0
487
- AND target.expanded = 1
488
- AND COALESCE(target.op, '') NOT IN ('error', 'PLAN')
489
- AND COALESCE(target.scheme, '') != 'prompt';
490
-
491
- UPDATE log_entries SET expanded = 0
492
- WHERE id IN (SELECT id FROM engine_grinder_fold_set);
493
-
494
- INSERT OR IGNORE INTO log_tags (log_entry_id, tag)
495
- SELECT id, 'overflow' FROM engine_grinder_fold_set;
496
-
497
- DELETE FROM engine_grinder_fold_set;
505
+ SELECT row.id,
506
+ (loop.sequence || '/' || turn.sequence || '/' || row.sequence) AS coordinate,
507
+ row.origin, row.op, row.attrs,
508
+ row.tx, row.mimetype_tx, row.rx, row.mimetype_rx,
509
+ row.folded
510
+ FROM causal_rows causal
511
+ JOIN log_entries row ON row.id = causal.id
512
+ JOIN turns turn ON turn.id = row.turn_id
513
+ JOIN loops loop ON loop.id = row.loop_id
514
+ ORDER BY loop.sequence, turn.sequence, row.sequence;
498
515
 
499
516
  -- PREP: engine_fold_log_entry
500
517
  -- Fold one known log row by id. Model-emission rows use this after insertion so
501
518
  -- the complete admitted emission remains available without opening by default.
502
- UPDATE log_entries SET expanded = 0 WHERE id = $id;
519
+ UPDATE log_entries SET folded = '[[1,-1]]' WHERE id = $id;
503
520
 
504
521
  -- PREP: engine_render_log
505
522
  -- Render-time log-section assembly ({§body-projection}).
@@ -507,8 +524,8 @@ UPDATE log_entries SET expanded = 0 WHERE id = $id;
507
524
  -- memory carries across loops within a worker, not just the
508
525
  -- current loop. Coordinates append /<op> only for rows that represent an operation.
509
526
  -- Status 202 entries in state='proposed' are model-invisible until resolved.
510
- -- `expanded = 0` rows are FOLDED — listed but collapsed to their coordinate
511
- -- (FOLD); the renderer elides the body. {§open-fold}: folded rows stay listed, re-OPENable.
527
+ -- Folded intervals are projected against the canonical body by packet-wire;
528
+ -- wholly folded rows remain listed and re-OPENable. {§open-fold}
512
529
  SELECT
513
530
  le.id,
514
531
  l.sequence AS loop_seq,
@@ -516,13 +533,13 @@ SELECT
516
533
  le.sequence,
517
534
  -- le.origin is attribution, never a render filter; the worker's actor — {§actor-boundary-origin-not-filter} {§machine-processes-worker-origin}
518
535
  le.origin,
519
- le.op, le.suffix, le.signal,
536
+ le.op, le.delimiter, le.signal,
520
537
  le.scheme, le.username, le.password,
521
538
  le.hostname, le.port, le.pathname,
522
539
  le.query, le.fragment,
523
540
  le.status_rx, le.rx, le.mimetype_rx,
524
541
  le.tx, le.mimetype_tx,
525
- le.state, le.outcome, le.expanded, le.source, le.weight, le.attrs,
542
+ le.state, le.outcome, le.folded, le.source, le.weight, le.attrs,
526
543
  COALESCE((
527
544
  SELECT json_group_array(ordered.tag)
528
545
  FROM (
@@ -540,8 +557,21 @@ JOIN loops l ON l.id = le.loop_id
540
557
  -- {§operation-result-uniform-error-channel}.
541
558
  WHERE le.worker_id = $worker_id
542
559
  AND NOT (le.status_rx = 202 AND le.state = 'proposed')
543
- AND NOT (COALESCE(le.op, '') IN ('OPEN', 'FOLD') AND le.status_rx < 400)
544
- AND NOT (COALESCE(le.op, '') = 'KILL' AND le.scheme = 'log' AND le.status_rx < 400)
560
+ AND NOT (
561
+ COALESCE(le.op, '') IN ('OPEN', 'FOLD')
562
+ AND le.status_rx < 400
563
+ AND le.source IS NULL
564
+ )
565
+ AND NOT (COALESCE(le.op, '') = 'KILL' AND le.scheme = 'log' AND le.status_rx < 400 AND le.source IS NULL)
566
+ -- Successful maintenance-turn rows (doc reconciliation) never render: a
567
+ -- receipt answers an asker and these turns have none. Rows stay durable and
568
+ -- READ-able; failures remain visible ({§operation-result-uniform-error-channel}).
569
+ AND NOT (
570
+ t.producer = '_plurnk'
571
+ AND t.kind = 'maintenance'
572
+ AND COALESCE(le.status_rx, 200) < 400
573
+ AND le.source IS NULL
574
+ )
545
575
  ORDER BY l.sequence, t.sequence, le.sequence;
546
576
 
547
577
  -- PREP: engine_insert_log_entry
@@ -551,14 +581,14 @@ ORDER BY l.sequence, t.sequence, le.sequence;
551
581
  -- via proposal resolution; entry transitions through engine_resolve_log_entry).
552
582
  INSERT INTO log_entries (
553
583
  worker_id, loop_id, turn_id, sequence, origin, source, model_call_id,
554
- op, suffix, signal,
584
+ op, delimiter, signal,
555
585
  scheme, username, password, hostname, port,
556
586
  pathname, query, fragment, lineMarker,
557
587
  tx, mimetype_tx, rx, mimetype_rx, status_rx, weight,
558
588
  state, outcome, attrs
559
589
  ) VALUES (
560
590
  $worker_id, $loop_id, $turn_id, $sequence, $origin, $source, $model_call_id,
561
- $op, $suffix, $signal,
591
+ $op, $delimiter, $signal,
562
592
  $scheme, $username, $password, $hostname, $port,
563
593
  $pathname, $query, $fragment, $lineMarker,
564
594
  $tx, $mimetype_tx, $rx, $mimetype_rx, $status_rx, $weight,
@@ -610,25 +640,18 @@ WHERE turn_id = $turn_id
610
640
  -- PREP: engine_worker_has_undelivered_stream_term
611
641
  -- A stream may finish between its EXEC and a same-turn SEND. It is then no longer
612
642
  -- live, but its terminal outcome has not crossed the pre-turn observation boundary:
613
- -- no foisted terminal READ exists yet. Treat that closed result like a same-turn
614
- -- retrieval or child termination so an empty join cannot conclude over unseen work.
643
+ -- one or more selected channel publication rows remain nonterminal. Treat that
644
+ -- closed result like a same-turn retrieval or child termination so an empty
645
+ -- join cannot conclude over unseen work.
615
646
  -- Completion is information independently of payload: an empty success and especially
616
647
  -- an empty failure must receive the same terminal observation as a non-empty stream.
617
- SELECT 1 AS pending
648
+ SELECT DISTINCT s.handle AS handle
618
649
  FROM subscriptions s
619
- JOIN entries e ON e.id = s.entry_id
650
+ JOIN subscription_publications sp ON sp.subscription_id = s.id
620
651
  WHERE s.worker_id = $worker_id
621
652
  AND s.closed_at IS NOT NULL
622
- AND NOT EXISTS (
623
- SELECT 1 FROM log_entries le
624
- WHERE le.worker_id = $worker_id
625
- AND le.origin = 'plurnk'
626
- AND le.op = 'READ'
627
- AND le.scheme = e.scheme
628
- AND le.pathname = e.pathname
629
- AND json_extract(le.attrs, '$.terminal') = 1
630
- )
631
- LIMIT 1;
653
+ AND sp.terminal_published = 0
654
+ LIMIT 8;
632
655
 
633
656
  -- PREP: engine_turn_failures
634
657
  -- {§send-premature-terminate} — THIS turn's failed op results (the model's own ops, status >= 400), whose
@@ -646,20 +669,23 @@ WHERE turn_id = $turn_id
646
669
  AND status_rx >= 400
647
670
  AND (op != 'error' OR source = 'grammar');
648
671
 
649
- -- PREP: engine_reconcile_turn_status
650
- -- A SEND's signal is only provisional until dispatch adjudicates live obligations and failures.
651
- -- The close writes packet+usage before ops dispatch, so reconcile the persisted turn whenever
652
- -- dispatch changes that disposition (for example refused 200 -> 102 or drained 202 -> 200).
653
- UPDATE turns SET status = $status WHERE id = $id;
654
-
655
-
656
-
657
672
  -- PREP: engine_loop_sequence
658
673
  -- The loop's per-worker sequence — the model-facing coordinate (prompt/<worker>/<loop-seq>/<turn-seq>,
659
674
  -- matching the log's loop-relative numbering). The raw db id leaked into prompt paths and the
660
675
  -- model's first loop read as prompt/2/1 (the docs loop holds id 1). Owner: minor but annoying.
661
676
  SELECT sequence FROM loops WHERE id = $loop_id;
662
677
 
678
+ -- PREP: engine_worker_has_inference_history
679
+ -- Administrative turns may legitimately precede the first provider exchange.
680
+ -- Initialization is therefore keyed to inference history, never loop ordinals.
681
+ SELECT EXISTS (
682
+ SELECT 1
683
+ FROM turns t
684
+ JOIN loops l ON l.id = t.loop_id
685
+ WHERE l.worker_id = $worker_id
686
+ AND (t.producer = 'model' OR t.kind = 'initialization')
687
+ ) AS present;
688
+
663
689
  -- PREP: engine_worker_lineage_root
664
690
  -- The no-parent root of a worker lineage; a root worker returns itself.
665
691
  -- {§worker-primary}
@@ -692,10 +718,9 @@ WHERE current.id = $worker_id;
692
718
  -- not a second timestamp race. {§send-undelivered-child-term}
693
719
  SELECT 1 AS pending
694
720
  FROM ambient_events ae
695
- JOIN workers child ON child.id = ae.producer_worker_id
696
721
  JOIN workers parent ON parent.id = $worker_id
697
722
  WHERE ae.workspace_id = parent.workspace_id
698
723
  AND ae.kind = 'loop_termination'
699
- AND child.parent_worker_id = parent.id
724
+ AND ae.target_parent_worker_id = parent.id
700
725
  AND ae.id > COALESCE(parent.ambient_event_cursor, 0)
701
726
  LIMIT 1;
@@ -0,0 +1,32 @@
1
+ import { type ParsedPath } from "@plurnk/plurnk-contracts";
2
+ import { type SchemeAddressCtx, type SchemeHandler, type SchemeResult } from "@plurnk/plurnk-schemes";
3
+ import type { Db } from "./Db.ts";
4
+ import type { PlurnkSchemeContext, SchemeManifest } from "./scheme-types.ts";
5
+ export interface BoundEntryAddress {
6
+ readonly ownerId: number;
7
+ readonly scheme: string;
8
+ readonly authority: string;
9
+ readonly pathname: string;
10
+ }
11
+ export interface EntryAddressResolution {
12
+ readonly address: BoundEntryAddress | null;
13
+ readonly result: SchemeResult | null;
14
+ }
15
+ type AddressResolver = Pick<SchemeHandler, "resolveEntryAddress">;
16
+ export default class EntryAddressBinding {
17
+ #private;
18
+ constructor(db: Db);
19
+ static addressContext(ctx: PlurnkSchemeContext): SchemeAddressCtx;
20
+ fixedOwnerId(manifest: SchemeManifest, ctx: PlurnkSchemeContext): Promise<number | null>;
21
+ resolve({ target, routedScheme, handler, manifest, ctx, }: {
22
+ target: ParsedPath;
23
+ routedScheme: string;
24
+ handler: AddressResolver;
25
+ manifest: SchemeManifest & {
26
+ readonly category: "data";
27
+ };
28
+ ctx: PlurnkSchemeContext;
29
+ }): Promise<EntryAddressResolution>;
30
+ }
31
+ export {};
32
+ //# sourceMappingURL=EntryAddressBinding.d.ts.map