@plurnk/plurnk-service 1.16.4 → 1.17.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 (636) hide show
  1. package/.env.defaults +122 -246
  2. package/INSTALL.md +84 -138
  3. package/README.md +9 -5
  4. package/SPEC.md +1710 -1015
  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 +3 -1
  44. package/dist/content/read-resolve.d.ts.map +1 -1
  45. package/dist/content/read-resolve.js +39 -7
  46. package/dist/content/read-resolve.js.map +1 -1
  47. package/dist/core/AdmittedTurnExecutor.d.ts +3 -5
  48. package/dist/core/AdmittedTurnExecutor.d.ts.map +1 -1
  49. package/dist/core/AdmittedTurnExecutor.js +91 -83
  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 +87 -65
  66. package/dist/core/CapabilityResolver.js.map +1 -1
  67. package/dist/core/ChannelWrite.d.ts +14 -11
  68. package/dist/core/ChannelWrite.d.ts.map +1 -1
  69. package/dist/core/ChannelWrite.js +11 -12
  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 +36 -39
  82. package/dist/core/DataStatementRunner.js.map +1 -1
  83. package/dist/core/Dispatcher.d.ts +19 -26
  84. package/dist/core/Dispatcher.d.ts.map +1 -1
  85. package/dist/core/Dispatcher.js +369 -219
  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 +73 -163
  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 +13 -0
  114. package/dist/core/ExecutorRegistry.d.ts +7 -5
  115. package/dist/core/ExecutorRegistry.d.ts.map +1 -1
  116. package/dist/core/ExecutorRegistry.js +36 -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 +42 -11
  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 +18 -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 +25 -32
  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 +163 -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.sql +70 -0
  162. package/dist/core/MutationEffects.d.ts +5 -3
  163. package/dist/core/MutationEffects.d.ts.map +1 -1
  164. package/dist/core/MutationEffects.js +10 -28
  165. package/dist/core/MutationEffects.js.map +1 -1
  166. package/dist/core/NativeContent.d.ts +6 -0
  167. package/dist/core/NativeContent.d.ts.map +1 -0
  168. package/dist/core/NativeContent.js +16 -0
  169. package/dist/core/NativeContent.js.map +1 -0
  170. package/dist/core/NativeContent.sql +6 -0
  171. package/dist/core/NoticeChannel.js +1 -1
  172. package/dist/core/NoticeChannel.js.map +1 -1
  173. package/dist/core/OperatorConfig.js +5 -5
  174. package/dist/core/OperatorConfig.js.map +1 -1
  175. package/dist/core/PacketBuilder.d.ts +8 -5
  176. package/dist/core/PacketBuilder.d.ts.map +1 -1
  177. package/dist/core/PacketBuilder.js +117 -81
  178. package/dist/core/PacketBuilder.js.map +1 -1
  179. package/dist/core/PacketBuilder.sql +146 -0
  180. package/dist/core/PatternSelection.d.ts +28 -0
  181. package/dist/core/PatternSelection.d.ts.map +1 -0
  182. package/dist/core/PatternSelection.js +42 -0
  183. package/dist/core/PatternSelection.js.map +1 -0
  184. package/dist/core/ProblemLog.d.ts.map +1 -1
  185. package/dist/core/ProblemLog.js +0 -1
  186. package/dist/core/ProblemLog.js.map +1 -1
  187. package/dist/core/PromptFrames.d.ts +12 -0
  188. package/dist/core/PromptFrames.d.ts.map +1 -0
  189. package/dist/core/PromptFrames.js +28 -0
  190. package/dist/core/PromptFrames.js.map +1 -0
  191. package/dist/core/ProposalLifecycle.d.ts +0 -1
  192. package/dist/core/ProposalLifecycle.d.ts.map +1 -1
  193. package/dist/core/ProposalLifecycle.js +20 -19
  194. package/dist/core/ProposalLifecycle.js.map +1 -1
  195. package/dist/core/ProposalLifecycle.sql +33 -0
  196. package/dist/core/ProviderInstantiate.d.ts +1 -1
  197. package/dist/core/ProviderInstantiate.d.ts.map +1 -1
  198. package/dist/core/ProviderInstantiate.js +7 -14
  199. package/dist/core/ProviderInstantiate.js.map +1 -1
  200. package/dist/core/ReasoningView.d.ts +9 -0
  201. package/dist/core/ReasoningView.d.ts.map +1 -0
  202. package/dist/core/ReasoningView.js +47 -0
  203. package/dist/core/ReasoningView.js.map +1 -0
  204. package/dist/core/ResourceBindings.d.ts +16 -0
  205. package/dist/core/ResourceBindings.d.ts.map +1 -0
  206. package/dist/core/ResourceBindings.js +45 -0
  207. package/dist/core/ResourceBindings.js.map +1 -0
  208. package/dist/core/ResourceMutations.d.ts +5 -8
  209. package/dist/core/ResourceMutations.d.ts.map +1 -1
  210. package/dist/core/ResourceMutations.js +6 -7
  211. package/dist/core/ResourceMutations.js.map +1 -1
  212. package/dist/core/ResourceSelector.d.ts +2 -2
  213. package/dist/core/ResourceSelector.d.ts.map +1 -1
  214. package/dist/core/ResourceSelector.js +122 -62
  215. package/dist/core/ResourceSelector.js.map +1 -1
  216. package/dist/core/ResourceTransfers.d.ts +4 -2
  217. package/dist/core/ResourceTransfers.d.ts.map +1 -1
  218. package/dist/core/ResourceTransfers.js +95 -26
  219. package/dist/core/ResourceTransfers.js.map +1 -1
  220. package/dist/core/RuntimeWorker.d.ts +5 -0
  221. package/dist/core/RuntimeWorker.d.ts.map +1 -0
  222. package/dist/core/RuntimeWorker.js +10 -0
  223. package/dist/core/RuntimeWorker.js.map +1 -0
  224. package/dist/core/RuntimeWorker.sql +5 -0
  225. package/dist/core/SchemeRegistry.d.ts +12 -16
  226. package/dist/core/SchemeRegistry.d.ts.map +1 -1
  227. package/dist/core/SchemeRegistry.js +58 -84
  228. package/dist/core/SchemeRegistry.js.map +1 -1
  229. package/dist/core/StoredPacket.d.ts +6 -1
  230. package/dist/core/StoredPacket.d.ts.map +1 -1
  231. package/dist/core/StoredPacket.js +30 -10
  232. package/dist/core/StoredPacket.js.map +1 -1
  233. package/dist/core/StrikeRail.d.ts +9 -6
  234. package/dist/core/StrikeRail.d.ts.map +1 -1
  235. package/dist/core/StrikeRail.js +60 -113
  236. package/dist/core/StrikeRail.js.map +1 -1
  237. package/dist/core/StrikeRail.sql +12 -0
  238. package/dist/core/TerminalResult.d.ts +1 -1
  239. package/dist/core/TerminalResult.d.ts.map +1 -1
  240. package/dist/core/TerminalResult.js +2 -2
  241. package/dist/core/TerminalResult.js.map +1 -1
  242. package/dist/core/TokenCalibration.d.ts +1 -6
  243. package/dist/core/TokenCalibration.d.ts.map +1 -1
  244. package/dist/core/TokenCalibration.js +13 -9
  245. package/dist/core/TokenCalibration.js.map +1 -1
  246. package/dist/core/TokenCalibration.sql +15 -0
  247. package/dist/core/ToolInputSchema.d.ts +6 -0
  248. package/dist/core/ToolInputSchema.d.ts.map +1 -0
  249. package/dist/core/ToolInputSchema.js +43 -0
  250. package/dist/core/ToolInputSchema.js.map +1 -0
  251. package/dist/core/ToolResources.d.ts.map +1 -1
  252. package/dist/core/ToolResources.js +76 -52
  253. package/dist/core/ToolResources.js.map +1 -1
  254. package/dist/core/Turn.d.ts +5 -2
  255. package/dist/core/Turn.d.ts.map +1 -1
  256. package/dist/core/Turn.js +13 -11
  257. package/dist/core/Turn.js.map +1 -1
  258. package/dist/core/Turn.sql +25 -39
  259. package/dist/core/{SendBroadcastHandler.d.ts → TurnDispositionHandler.d.ts} +25 -17
  260. package/dist/core/TurnDispositionHandler.d.ts.map +1 -0
  261. package/dist/core/TurnDispositionHandler.js +198 -0
  262. package/dist/core/TurnDispositionHandler.js.map +1 -0
  263. package/dist/core/TurnMaterialization.d.ts +2 -3
  264. package/dist/core/TurnMaterialization.d.ts.map +1 -1
  265. package/dist/core/TurnMaterialization.js +40 -15
  266. package/dist/core/TurnMaterialization.js.map +1 -1
  267. package/dist/core/TurnMaterialization.sql +44 -0
  268. package/dist/core/TurnOps.d.ts.map +1 -1
  269. package/dist/core/TurnOps.js +8 -64
  270. package/dist/core/TurnOps.js.map +1 -1
  271. package/dist/core/TurnRunner.d.ts +9 -12
  272. package/dist/core/TurnRunner.d.ts.map +1 -1
  273. package/dist/core/TurnRunner.js +232 -408
  274. package/dist/core/TurnRunner.js.map +1 -1
  275. package/dist/core/TurnRunner.sql +74 -0
  276. package/dist/core/TurnSources.sql +39 -0
  277. package/dist/core/WorkerControlAddress.d.ts +1 -0
  278. package/dist/core/WorkerControlAddress.d.ts.map +1 -1
  279. package/dist/core/WorkerControlAddress.js +5 -0
  280. package/dist/core/WorkerControlAddress.js.map +1 -1
  281. package/dist/core/WorkerControlHandler.d.ts +1 -3
  282. package/dist/core/WorkerControlHandler.d.ts.map +1 -1
  283. package/dist/core/WorkerControlHandler.js +41 -48
  284. package/dist/core/WorkerControlHandler.js.map +1 -1
  285. package/dist/core/WorkerName.d.ts +8 -6
  286. package/dist/core/WorkerName.d.ts.map +1 -1
  287. package/dist/core/WorkerName.js +33 -24
  288. package/dist/core/WorkerName.js.map +1 -1
  289. package/dist/core/WorkerName.sql +7 -10
  290. package/dist/core/WorkspaceGate.d.ts +1 -1
  291. package/dist/core/WorkspaceGate.d.ts.map +1 -1
  292. package/dist/core/WorkspaceGate.js +29 -6
  293. package/dist/core/WorkspaceGate.js.map +1 -1
  294. package/dist/core/ambient.sql +236 -0
  295. package/dist/core/attachments.d.ts +2 -1
  296. package/dist/core/attachments.d.ts.map +1 -1
  297. package/dist/core/attachments.js +5 -4
  298. package/dist/core/attachments.js.map +1 -1
  299. package/dist/core/caps/CapsResolve.d.ts +2 -3
  300. package/dist/core/caps/CapsResolve.d.ts.map +1 -1
  301. package/dist/core/caps/CapsResolve.js +5 -5
  302. package/dist/core/caps/CapsResolve.js.map +1 -1
  303. package/dist/core/caps/DbChannelCaps.d.ts +1 -1
  304. package/dist/core/caps/DbChannelCaps.d.ts.map +1 -1
  305. package/dist/core/caps/DbChannelCaps.js +4 -6
  306. package/dist/core/caps/DbChannelCaps.js.map +1 -1
  307. package/dist/core/caps/DbEntryCaps.d.ts +2 -1
  308. package/dist/core/caps/DbEntryCaps.d.ts.map +1 -1
  309. package/dist/core/caps/DbEntryCaps.js +11 -17
  310. package/dist/core/caps/DbEntryCaps.js.map +1 -1
  311. package/dist/core/caps/DbNotifyCaps.d.ts +1 -1
  312. package/dist/core/caps/DbNotifyCaps.d.ts.map +1 -1
  313. package/dist/core/caps/DbNotifyCaps.js +3 -5
  314. package/dist/core/caps/DbNotifyCaps.js.map +1 -1
  315. package/dist/core/caps/DbProjectionCaps.js +1 -1
  316. package/dist/core/caps/DbProjectionCaps.js.map +1 -1
  317. package/dist/core/caps/DbSubscriptionCaps.d.ts +1 -1
  318. package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -1
  319. package/dist/core/caps/DbSubscriptionCaps.js +5 -7
  320. package/dist/core/caps/DbSubscriptionCaps.js.map +1 -1
  321. package/dist/core/caps/SchemeCtxImpl.d.ts +0 -2
  322. package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -1
  323. package/dist/core/caps/SchemeCtxImpl.js +4 -20
  324. package/dist/core/caps/SchemeCtxImpl.js.map +1 -1
  325. package/dist/core/env-defaults.d.ts.map +1 -1
  326. package/dist/core/env-defaults.js +4 -2
  327. package/dist/core/env-defaults.js.map +1 -1
  328. package/dist/core/file-materialization.d.ts +4 -1
  329. package/dist/core/file-materialization.d.ts.map +1 -1
  330. package/dist/core/file-materialization.js +14 -0
  331. package/dist/core/file-materialization.js.map +1 -1
  332. package/dist/core/fork.d.ts +1 -6
  333. package/dist/core/fork.d.ts.map +1 -1
  334. package/dist/core/fork.js +9 -153
  335. package/dist/core/fork.js.map +1 -1
  336. package/dist/core/fork.sql +162 -185
  337. package/dist/core/git-env.d.ts +1 -0
  338. package/dist/core/git-env.d.ts.map +1 -1
  339. package/dist/core/git-env.js +39 -2
  340. package/dist/core/git-env.js.map +1 -1
  341. package/dist/core/git-membership.d.ts.map +1 -1
  342. package/dist/core/git-membership.js +64 -48
  343. package/dist/core/git-membership.js.map +1 -1
  344. package/dist/core/git-state.d.ts.map +1 -1
  345. package/dist/core/git-state.js +25 -19
  346. package/dist/core/git-state.js.map +1 -1
  347. package/dist/core/glob_match.d.ts +4 -0
  348. package/dist/core/glob_match.d.ts.map +1 -0
  349. package/dist/core/glob_match.js +7 -0
  350. package/dist/core/glob_match.js.map +1 -0
  351. package/dist/core/maintenance.sql +6 -0
  352. package/dist/core/mutation-types.d.ts +7 -28
  353. package/dist/core/mutation-types.d.ts.map +1 -1
  354. package/dist/core/packet-inject.d.ts.map +1 -1
  355. package/dist/core/packet-inject.js +2 -3
  356. package/dist/core/packet-inject.js.map +1 -1
  357. package/dist/core/packet-wire.d.ts +8 -6
  358. package/dist/core/packet-wire.d.ts.map +1 -1
  359. package/dist/core/packet-wire.js +131 -163
  360. package/dist/core/packet-wire.js.map +1 -1
  361. package/dist/core/plurnk-uri.d.ts +1 -1
  362. package/dist/core/plurnk-uri.d.ts.map +1 -1
  363. package/dist/core/plurnk-uri.js +5 -12
  364. package/dist/core/plurnk-uri.js.map +1 -1
  365. package/dist/core/scheme-types.d.ts +3 -3
  366. package/dist/core/scheme-types.d.ts.map +1 -1
  367. package/dist/core/scheme-types.js.map +1 -1
  368. package/dist/core/sha256.d.ts +4 -0
  369. package/dist/core/sha256.d.ts.map +1 -0
  370. package/dist/core/sha256.js +6 -0
  371. package/dist/core/sha256.js.map +1 -0
  372. package/dist/core/teaching.js +1 -1
  373. package/dist/core/teaching.js.map +1 -1
  374. package/dist/core/turn-scheduler.d.ts.map +1 -1
  375. package/dist/core/turn-scheduler.js +5 -18
  376. package/dist/core/turn-scheduler.js.map +1 -1
  377. package/dist/core/turn-signals.d.ts +0 -6
  378. package/dist/core/turn-signals.d.ts.map +1 -1
  379. package/dist/core/turn-signals.js +1 -7
  380. package/dist/core/turn-signals.js.map +1 -1
  381. package/dist/core/worker-ops.sql +15 -22
  382. package/dist/core/workspace-settings.d.ts.map +1 -1
  383. package/dist/core/workspace-settings.js +18 -2
  384. package/dist/core/workspace-settings.js.map +1 -1
  385. package/dist/core/workspace-settings.sql +6 -0
  386. package/dist/digest/Digest.d.ts.map +1 -1
  387. package/dist/digest/Digest.js +27 -90
  388. package/dist/digest/Digest.js.map +1 -1
  389. package/dist/digest/DigestRender.d.ts.map +1 -1
  390. package/dist/digest/DigestRender.js +14 -54
  391. package/dist/digest/DigestRender.js.map +1 -1
  392. package/dist/digest/digest-rows.d.ts +10 -32
  393. package/dist/digest/digest-rows.d.ts.map +1 -1
  394. package/dist/digest/digest.sql +43 -18
  395. package/dist/schemes/Exec.d.ts +6 -12
  396. package/dist/schemes/Exec.d.ts.map +1 -1
  397. package/dist/schemes/Exec.js +256 -188
  398. package/dist/schemes/Exec.js.map +1 -1
  399. package/dist/schemes/ExecOutputScheme.d.ts +8 -6
  400. package/dist/schemes/ExecOutputScheme.d.ts.map +1 -1
  401. package/dist/schemes/ExecOutputScheme.js +33 -61
  402. package/dist/schemes/ExecOutputScheme.js.map +1 -1
  403. package/dist/schemes/ExecutionInput.d.ts +12 -0
  404. package/dist/schemes/ExecutionInput.d.ts.map +1 -0
  405. package/dist/schemes/ExecutionInput.js +94 -0
  406. package/dist/schemes/ExecutionInput.js.map +1 -0
  407. package/dist/schemes/File.d.ts +5 -2
  408. package/dist/schemes/File.d.ts.map +1 -1
  409. package/dist/schemes/File.js +62 -92
  410. package/dist/schemes/File.js.map +1 -1
  411. package/dist/schemes/Log.d.ts.map +1 -1
  412. package/dist/schemes/Log.js +84 -79
  413. package/dist/schemes/Log.js.map +1 -1
  414. package/dist/schemes/Log.sql +183 -15
  415. package/dist/schemes/Prompt.d.ts.map +1 -1
  416. package/dist/schemes/Prompt.js +3 -12
  417. package/dist/schemes/Prompt.js.map +1 -1
  418. package/dist/schemes/QuestionTool.d.ts +5 -0
  419. package/dist/schemes/QuestionTool.d.ts.map +1 -1
  420. package/dist/schemes/QuestionTool.js +6 -14
  421. package/dist/schemes/QuestionTool.js.map +1 -1
  422. package/dist/schemes/Skill.d.ts +12 -7
  423. package/dist/schemes/Skill.d.ts.map +1 -1
  424. package/dist/schemes/Skill.js +149 -21
  425. package/dist/schemes/Skill.js.map +1 -1
  426. package/dist/schemes/TurnSource.d.ts +12 -0
  427. package/dist/schemes/TurnSource.d.ts.map +1 -0
  428. package/dist/schemes/TurnSource.js +116 -0
  429. package/dist/schemes/TurnSource.js.map +1 -0
  430. package/dist/schemes/Worker.d.ts +3 -3
  431. package/dist/schemes/Worker.d.ts.map +1 -1
  432. package/dist/schemes/Worker.js +61 -208
  433. package/dist/schemes/Worker.js.map +1 -1
  434. package/dist/schemes/_entry-crud.d.ts +12 -15
  435. package/dist/schemes/_entry-crud.d.ts.map +1 -1
  436. package/dist/schemes/_entry-crud.js +63 -63
  437. package/dist/schemes/_entry-crud.js.map +1 -1
  438. package/dist/schemes/_entry-crud.sql +142 -46
  439. package/dist/schemes/_entry-find.d.ts +1 -3
  440. package/dist/schemes/_entry-find.d.ts.map +1 -1
  441. package/dist/schemes/_entry-find.js +111 -112
  442. package/dist/schemes/_entry-find.js.map +1 -1
  443. package/dist/schemes/_entry-find.sql +22 -14
  444. package/dist/schemes/_entry-fts.d.ts +14 -0
  445. package/dist/schemes/_entry-fts.d.ts.map +1 -0
  446. package/dist/schemes/_entry-fts.js +82 -0
  447. package/dist/schemes/_entry-fts.js.map +1 -0
  448. package/dist/schemes/_entry-fts.sql +31 -0
  449. package/dist/schemes/_entry-graph.d.ts.map +1 -1
  450. package/dist/schemes/_entry-graph.js +6 -14
  451. package/dist/schemes/_entry-graph.js.map +1 -1
  452. package/dist/schemes/_entry-graph.sql +29 -44
  453. package/dist/schemes/_entry-manifest.d.ts +2 -1
  454. package/dist/schemes/_entry-manifest.d.ts.map +1 -1
  455. package/dist/schemes/_entry-manifest.js +15 -12
  456. package/dist/schemes/_entry-manifest.js.map +1 -1
  457. package/dist/schemes/_entry-manifest.sql +26 -0
  458. package/dist/schemes/_entry-ops.d.ts +3 -5
  459. package/dist/schemes/_entry-ops.d.ts.map +1 -1
  460. package/dist/schemes/_entry-ops.js +30 -43
  461. package/dist/schemes/_entry-ops.js.map +1 -1
  462. package/dist/schemes/_entry-ops.sql +5 -6
  463. package/dist/schemes/_entry-readable.d.ts +8 -0
  464. package/dist/schemes/_entry-readable.d.ts.map +1 -0
  465. package/dist/schemes/_entry-readable.js +38 -0
  466. package/dist/schemes/_entry-readable.js.map +1 -0
  467. package/dist/schemes/_entry-send.d.ts +1 -1
  468. package/dist/schemes/_entry-send.d.ts.map +1 -1
  469. package/dist/schemes/_entry-send.js +3 -3
  470. package/dist/schemes/_entry-send.js.map +1 -1
  471. package/dist/schemes/_search-index.d.ts +1 -3
  472. package/dist/schemes/_search-index.d.ts.map +1 -1
  473. package/dist/schemes/_search-index.js +79 -110
  474. package/dist/schemes/_search-index.js.map +1 -1
  475. package/dist/schemes/_search-index.sql +30 -0
  476. package/dist/schemes/exec-runtime.d.ts +1 -1
  477. package/dist/schemes/exec-runtime.d.ts.map +1 -1
  478. package/dist/schemes/exec-runtime.js.map +1 -1
  479. package/dist/server/ClientReads.d.ts +2 -2
  480. package/dist/server/ClientReads.d.ts.map +1 -1
  481. package/dist/server/ClientReads.js +5 -8
  482. package/dist/server/ClientReads.js.map +1 -1
  483. package/dist/server/Daemon.d.ts +14 -21
  484. package/dist/server/Daemon.d.ts.map +1 -1
  485. package/dist/server/Daemon.js +135 -156
  486. package/dist/server/Daemon.js.map +1 -1
  487. package/dist/server/DaemonModule.d.ts +23 -21
  488. package/dist/server/DaemonModule.d.ts.map +1 -1
  489. package/dist/server/DrainSupervisor.d.ts +8 -21
  490. package/dist/server/DrainSupervisor.d.ts.map +1 -1
  491. package/dist/server/DrainSupervisor.js +278 -306
  492. package/dist/server/DrainSupervisor.js.map +1 -1
  493. package/dist/server/Functionality.d.ts +11 -12
  494. package/dist/server/Functionality.d.ts.map +1 -1
  495. package/dist/server/Functionality.js +129 -101
  496. package/dist/server/Functionality.js.map +1 -1
  497. package/dist/server/FunctionalityManager.d.ts +3 -5
  498. package/dist/server/FunctionalityManager.d.ts.map +1 -1
  499. package/dist/server/FunctionalityManager.js +20 -58
  500. package/dist/server/FunctionalityManager.js.map +1 -1
  501. package/dist/server/MembersFunctionality.d.ts +5 -4
  502. package/dist/server/MembersFunctionality.d.ts.map +1 -1
  503. package/dist/server/MembersFunctionality.js +24 -37
  504. package/dist/server/MembersFunctionality.js.map +1 -1
  505. package/dist/server/PlurnkSkill.d.ts +11 -0
  506. package/dist/server/PlurnkSkill.d.ts.map +1 -0
  507. package/dist/server/PlurnkSkill.js +41 -0
  508. package/dist/server/PlurnkSkill.js.map +1 -0
  509. package/dist/server/Retention.d.ts +22 -0
  510. package/dist/server/Retention.d.ts.map +1 -0
  511. package/dist/server/Retention.js +54 -0
  512. package/dist/server/Retention.js.map +1 -0
  513. package/dist/server/Retention.sql +36 -0
  514. package/dist/server/ServiceModules.d.ts +5 -0
  515. package/dist/server/ServiceModules.d.ts.map +1 -0
  516. package/dist/server/ServiceModules.js +10 -0
  517. package/dist/server/ServiceModules.js.map +1 -0
  518. package/dist/server/SkillsFunctionality.d.ts +14 -19
  519. package/dist/server/SkillsFunctionality.d.ts.map +1 -1
  520. package/dist/server/SkillsFunctionality.js +97 -104
  521. package/dist/server/SkillsFunctionality.js.map +1 -1
  522. package/dist/server/WorkerModelResolver.d.ts +4 -0
  523. package/dist/server/WorkerModelResolver.d.ts.map +1 -1
  524. package/dist/server/WorkerModelResolver.js +72 -39
  525. package/dist/server/WorkerModelResolver.js.map +1 -1
  526. package/dist/server/WorkspaceCapabilities.d.ts +21 -0
  527. package/dist/server/WorkspaceCapabilities.d.ts.map +1 -0
  528. package/dist/server/{WorkerCapabilities.js → WorkspaceCapabilities.js} +40 -40
  529. package/dist/server/WorkspaceCapabilities.js.map +1 -0
  530. package/dist/server/WorkspaceResidency.d.ts +36 -0
  531. package/dist/server/WorkspaceResidency.d.ts.map +1 -0
  532. package/dist/server/WorkspaceResidency.js +199 -0
  533. package/dist/server/WorkspaceResidency.js.map +1 -0
  534. package/dist/server/client-input.d.ts +1 -4
  535. package/dist/server/client-input.d.ts.map +1 -1
  536. package/dist/server/client-input.js +4 -45
  537. package/dist/server/client-input.js.map +1 -1
  538. package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
  539. package/dist/server/dispatch-as-plurnk.js +4 -22
  540. package/dist/server/dispatch-as-plurnk.js.map +1 -1
  541. package/dist/server/drain.sql +65 -42
  542. package/dist/server/envelope.d.ts +8 -0
  543. package/dist/server/envelope.d.ts.map +1 -1
  544. package/dist/server/envelope.js +9 -7
  545. package/dist/server/envelope.js.map +1 -1
  546. package/dist/server/envelope.sql +49 -13
  547. package/dist/server/lifecycle-recovery.sql +14 -17
  548. package/dist/server/logEntry.d.ts +1 -1
  549. package/dist/server/logEntry.d.ts.map +1 -1
  550. package/dist/server/logEntry.js +4 -1
  551. package/dist/server/logEntry.js.map +1 -1
  552. package/dist/server/logEntry.sql +25 -1
  553. package/dist/server/loopDocs.d.ts +2 -2
  554. package/dist/server/loopDocs.d.ts.map +1 -1
  555. package/dist/server/loopDocs.js +38 -31
  556. package/dist/server/loopDocs.js.map +1 -1
  557. package/dist/server/loopDocs.sql +1 -3
  558. package/dist/server/model-catalog.d.ts.map +1 -1
  559. package/dist/server/model-catalog.js +2 -1
  560. package/dist/server/model-catalog.js.map +1 -1
  561. package/dist/server/model-route.d.ts +1 -1
  562. package/dist/server/model-route.d.ts.map +1 -1
  563. package/dist/server/model-route.js +4 -2
  564. package/dist/server/model-route.js.map +1 -1
  565. package/dist/server/seam-entry-read.sql +3 -4
  566. package/dist/server/seam-loop.sql +2 -9
  567. package/dist/server/workspace-capabilities.sql +19 -0
  568. package/dist/service.d.ts.map +1 -1
  569. package/dist/service.js +5 -17
  570. package/dist/service.js.map +1 -1
  571. package/docs/members.md +83 -0
  572. package/docs/skills.md +50 -0
  573. package/migrations/001_workspaces.sql +53 -0
  574. package/migrations/002_workers.sql +183 -0
  575. package/migrations/003_loops.sql +326 -0
  576. package/migrations/004_inference.sql +360 -0
  577. package/migrations/005_entries.sql +207 -0
  578. package/migrations/006_log.sql +578 -0
  579. package/migrations/007_subscriptions.sql +175 -0
  580. package/migrations/008_interactions.sql +29 -0
  581. package/package.json +33 -40
  582. package/digest-sql/channel-dispositions/dispositions.sql +0 -15
  583. package/digest-sql/channel-state/state.sql +0 -6
  584. package/digest-sql/curation/curation.sql +0 -6
  585. package/digest-sql/derivations/derivations.sql +0 -4
  586. package/digest-sql/embeddings/embeddings.sql +0 -4
  587. package/digest-sql/entry-dispositions/dispositions.sql +0 -15
  588. package/digest-sql/entry-state/state.sql +0 -6
  589. package/digest-sql/token-counts/token-counts.sql +0 -2
  590. package/dist/core/EmbeddingCall.d.ts +0 -23
  591. package/dist/core/EmbeddingCall.d.ts.map +0 -1
  592. package/dist/core/EmbeddingCall.js +0 -149
  593. package/dist/core/EmbeddingCall.js.map +0 -1
  594. package/dist/core/OverflowTurn.d.ts +0 -11
  595. package/dist/core/OverflowTurn.d.ts.map +0 -1
  596. package/dist/core/OverflowTurn.js +0 -80
  597. package/dist/core/OverflowTurn.js.map +0 -1
  598. package/dist/core/Owner.d.ts +0 -8
  599. package/dist/core/Owner.d.ts.map +0 -1
  600. package/dist/core/Owner.js +0 -46
  601. package/dist/core/Owner.js.map +0 -1
  602. package/dist/core/SendBroadcastHandler.d.ts.map +0 -1
  603. package/dist/core/SendBroadcastHandler.js +0 -159
  604. package/dist/core/SendBroadcastHandler.js.map +0 -1
  605. package/dist/core/VectorPump.d.ts +0 -28
  606. package/dist/core/VectorPump.d.ts.map +0 -1
  607. package/dist/core/VectorPump.js +0 -130
  608. package/dist/core/VectorPump.js.map +0 -1
  609. package/dist/core/owner.sql +0 -11
  610. package/dist/core/worker-settings.d.ts +0 -10
  611. package/dist/core/worker-settings.d.ts.map +0 -1
  612. package/dist/core/worker-settings.js +0 -53
  613. package/dist/core/worker-settings.js.map +0 -1
  614. package/dist/schemes/_entry-chunk.d.ts +0 -14
  615. package/dist/schemes/_entry-chunk.d.ts.map +0 -1
  616. package/dist/schemes/_entry-chunk.js +0 -165
  617. package/dist/schemes/_entry-chunk.js.map +0 -1
  618. package/dist/schemes/_entry-semantic.d.ts +0 -63
  619. package/dist/schemes/_entry-semantic.d.ts.map +0 -1
  620. package/dist/schemes/_entry-semantic.js +0 -299
  621. package/dist/schemes/_entry-semantic.js.map +0 -1
  622. package/dist/schemes/_entry-semantic.sql +0 -99
  623. package/dist/schemes/cosine.d.ts +0 -4
  624. package/dist/schemes/cosine.d.ts.map +0 -1
  625. package/dist/schemes/cosine.js +0 -9
  626. package/dist/schemes/cosine.js.map +0 -1
  627. package/dist/server/WorkerCapabilities.d.ts +0 -21
  628. package/dist/server/WorkerCapabilities.d.ts.map +0 -1
  629. package/dist/server/WorkerCapabilities.js.map +0 -1
  630. package/dist/server/WorkerResidency.d.ts +0 -40
  631. package/dist/server/WorkerResidency.d.ts.map +0 -1
  632. package/dist/server/WorkerResidency.js +0 -283
  633. package/dist/server/WorkerResidency.js.map +0 -1
  634. package/dist/server/seam-log-read.sql +0 -21
  635. package/dist/server/worker-capabilities.sql +0 -28
  636. package/migrations/001_schema.sql +0 -2207
@@ -0,0 +1,53 @@
1
+ -- MIGRATE: 1 workspaces
2
+ -- Chapter 1 of the schema baseline ({§db-schema-baseline}): The workspace: identity, module state, membership constraints.
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
+ -- workspaces
7
+ -- project_root: workspace pointer. NULL = headless (no disk side-effects);
8
+ -- non-null = absolute path to the client's source tree, supplied at
9
+ -- workspace.create or workspace.set_root.
10
+ CREATE TABLE IF NOT EXISTS workspaces (
11
+ id INTEGER NOT NULL PRIMARY KEY,
12
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
13
+ name TEXT NOT NULL UNIQUE CHECK (length(name) > 0),
14
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
15
+ project_root TEXT,
16
+ -- {§operator-config} validated client workspace settings; each field composes
17
+ -- with operator configuration at its owning use site.
18
+ settings TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(settings))
19
+ ) STRICT;
20
+
21
+ CREATE INDEX IF NOT EXISTS workspaces_created_at ON workspaces (created_at);
22
+
23
+ -- {§module-workspace-state}: one provider-validated snapshot per workspace.
24
+ CREATE TABLE IF NOT EXISTS workspace_module_state (
25
+ workspace_id INTEGER NOT NULL,
26
+ namespace_owner TEXT NOT NULL CHECK (length(namespace_owner) > 0),
27
+ state TEXT NOT NULL CHECK (json_valid(state)),
28
+ updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
29
+ PRIMARY KEY (workspace_id, namespace_owner),
30
+ FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE
31
+ ) STRICT;
32
+
33
+ -- workspace_constraints
34
+ -- SPEC {§membership} constraint overlay — explicit policy and the inspectable
35
+ -- exact pick produced by accepted file creation share one representation.
36
+ -- Per (workspace, effect, glob/target): `pick` (members git misses, resolved by a
37
+ -- targeted client-dictated scan), `hide` (drop git-tracked matches), `view` (member
38
+ -- for read; File.edit rejects the write). git-absent, `pick` rows are the sole substrate
39
+ -- source. Composed at membership resolution; node:path.matchesGlob.
40
+ CREATE TABLE IF NOT EXISTS workspace_constraints (
41
+ workspace_id INTEGER NOT NULL,
42
+ -- include admits files git misses; exclude removes members — the members family's lexicon
43
+ -- ({§members-projection}). An inclusion is a pattern scan; a creation record is one exact path.
44
+ effect TEXT NOT NULL CHECK (effect IN ('include', 'exclude')),
45
+ glob TEXT NOT NULL,
46
+ -- create: the exact record of a file Plurnk wrote ({§fs-create-record}); members: a
47
+ -- human-authored definition projected by the members family; model: a definition the model
48
+ -- proposed under the members scope — never admitted past the repository's ignore rules.
49
+ source TEXT NOT NULL CHECK (source IN ('create', 'members', 'model')),
50
+ CHECK (source IN ('members', 'model') OR effect = 'include'),
51
+ PRIMARY KEY (workspace_id, effect, glob),
52
+ FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE
53
+ ) STRICT, WITHOUT ROWID;
@@ -0,0 +1,183 @@
1
+ -- MIGRATE: 2 workers
2
+ -- Chapter 2 of the schema baseline ({§db-schema-baseline}): Workers over a workspace, their model routes, and the ambient event feed their siblings observe.
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
+ -- model_routes — the immutable resolved model route ({§worker-model-selection}). One row per
7
+ -- complete resolved tuple; append-only. Alias is provenance plus a tuning scope,
8
+ -- not route identity, and is absent on a direct provider/model selection.
9
+ CREATE TABLE IF NOT EXISTS model_routes (
10
+ id INTEGER NOT NULL PRIMARY KEY,
11
+ alias TEXT CHECK (alias IS NULL OR length(alias) > 0),
12
+ provider TEXT NOT NULL CHECK (length(provider) > 0),
13
+ model TEXT NOT NULL CHECK (length(model) > 0),
14
+ base_url TEXT CHECK (base_url IS NULL OR length(base_url) > 0),
15
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
16
+ ) STRICT;
17
+
18
+ CREATE UNIQUE INDEX IF NOT EXISTS model_routes_identity
19
+ ON model_routes (coalesce(alias, ''), provider, model, coalesce(base_url, ''));
20
+
21
+ -- workers
22
+ CREATE TABLE IF NOT EXISTS workers (
23
+ id INTEGER NOT NULL PRIMARY KEY,
24
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
25
+ workspace_id INTEGER NOT NULL,
26
+ -- {§loop-wake-identity}: completion events, not packet/log curation state.
27
+ wake_revision INTEGER NOT NULL DEFAULT 0 CHECK (wake_revision >= 0),
28
+ name TEXT NOT NULL CHECK (length(name) > 0),
29
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
30
+ -- {§worker-provider-identity}: provider affinity must not collide when
31
+ -- independent databases reuse local integer ids.
32
+ provider_identity TEXT NOT NULL DEFAULT (lower(hex(randomblob(16))))
33
+ CHECK (length(provider_identity) = 32 AND provider_identity NOT GLOB '*[^0-9a-f]*'),
34
+ -- {§worker-model-selection}: the worker's durable resolved model, NULL for non-model
35
+ -- workers or a deliberately modelless unresolved worker. spawn_model_route_id is the
36
+ -- persistent spawn override; NULL means "use my model."
37
+ model_route_id INTEGER REFERENCES model_routes(id),
38
+ spawn_model_route_id INTEGER REFERENCES model_routes(id),
39
+ -- {§worker-reasoning-policy}: nullable only while the worker has no model;
40
+ -- once selected, model and reasoning policy form one durable generation policy.
41
+ reasoning_policy TEXT CHECK (reasoning_policy IS NULL OR length(reasoning_policy) > 0),
42
+ -- {§worker-reasoning-source}: whether reasoning_policy was chosen (worker.reasoning.set)
43
+ -- or seeded from the alias configuration; a default never masquerades as a choice.
44
+ reasoning_source TEXT NOT NULL DEFAULT 'default' CHECK (reasoning_source IN ('default', 'explicit')),
45
+ -- workers fork via parent_worker_id; workspaces carry no parent — {§machine-processes-no-fork-workspace}
46
+ parent_worker_id INTEGER CHECK (parent_worker_id IS NULL OR parent_worker_id != id),
47
+ origin TEXT NOT NULL DEFAULT 'client' CHECK (origin IN ('model', 'client', '_plurnk')),
48
+ -- {§methods-model-worker}: durable identity for the workspace's stable
49
+ -- default conversation; separate from its literal name.
50
+ default_conversation INTEGER NOT NULL DEFAULT 0 CHECK (default_conversation IN (0, 1)),
51
+ -- {§worker-causal-admission}: cancellation retires unread arrivals without rewriting history.
52
+ cancelled_through_sequence INTEGER NOT NULL DEFAULT 0 CHECK (cancelled_through_sequence >= 0),
53
+ -- The Problem the latest cancellation delivered to this worker's live loops; writing it is
54
+ -- the cancellation ({§worker-cancel-trigger}). NULL until the worker's scope is first cancelled.
55
+ cancellation TEXT CHECK (cancellation IS NULL OR (json_valid(cancellation) AND json_extract(cancellation, '$.status') = 499)),
56
+ -- {§env-delta-log-pull}: monotonic observation progress, not a private world snapshot.
57
+ -- Creation captures the workspace high-water; a fork instead copies its
58
+ -- parent's cursor and records the closed event boundary of its snapshot.
59
+ ambient_event_cursor INTEGER CHECK (ambient_event_cursor IS NULL OR ambient_event_cursor >= 0),
60
+ fork_event_boundary INTEGER CHECK (fork_event_boundary IS NULL OR fork_event_boundary >= 0),
61
+ CHECK (fork_event_boundary IS NULL OR parent_worker_id IS NOT NULL),
62
+ CHECK (default_conversation = 0 OR (origin = 'model' AND parent_worker_id IS NULL)),
63
+ CHECK ((model_route_id IS NULL) = (reasoning_policy IS NULL)),
64
+ FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE,
65
+ FOREIGN KEY (parent_worker_id) REFERENCES workers(id) ON DELETE CASCADE
66
+ ) STRICT;
67
+
68
+ CREATE INDEX IF NOT EXISTS workers_workspace_id_created_at ON workers (workspace_id, created_at);
69
+
70
+ CREATE INDEX IF NOT EXISTS workers_parent_worker_id ON workers (parent_worker_id);
71
+
72
+ CREATE UNIQUE INDEX IF NOT EXISTS workers_provider_identity ON workers (provider_identity);
73
+
74
+ CREATE UNIQUE INDEX IF NOT EXISTS workers_workspace_default_conversation
75
+ ON workers (workspace_id) WHERE default_conversation = 1;
76
+
77
+ -- {§worker-scheme-spawn}: a retained name cannot be rebound to another actor.
78
+ CREATE UNIQUE INDEX IF NOT EXISTS workers_workspace_name ON workers (workspace_id, name);
79
+
80
+ -- {§db-fk-indexes} Foreign-key check paths: without these, updating or replacing a route scans every worker.
81
+ CREATE INDEX IF NOT EXISTS workers_model_route_id ON workers (model_route_id) WHERE model_route_id IS NOT NULL;
82
+
83
+ CREATE INDEX IF NOT EXISTS workers_spawn_model_route_id ON workers (spawn_model_route_id) WHERE spawn_model_route_id IS NOT NULL;
84
+
85
+ CREATE TRIGGER IF NOT EXISTS workers_provider_identity_immutable
86
+ BEFORE UPDATE OF provider_identity ON workers
87
+ WHEN NEW.provider_identity != OLD.provider_identity
88
+ BEGIN
89
+ SELECT RAISE(ABORT, 'workers.provider_identity is immutable');
90
+ END;
91
+
92
+ CREATE TRIGGER IF NOT EXISTS workers_fork_event_boundary_immutable
93
+ BEFORE UPDATE OF fork_event_boundary ON workers
94
+ WHEN NEW.fork_event_boundary IS NOT OLD.fork_event_boundary
95
+ BEGIN
96
+ SELECT RAISE(ABORT, 'workers.fork_event_boundary is immutable');
97
+ END;
98
+
99
+ -- {§env-delta-log-pull}: one append-only occurrence journal gives every
100
+ -- producer a shared monotonic order. Audience is structural: direct parent,
101
+ -- explicit workspace broadcast, or their union. The event snapshots exactly
102
+ -- what an observer row needs because source-log curation cannot erase history.
103
+ -- source_record_id is forensic identity for the originating log/loop row, not a
104
+ -- foreign key: model log curation must not erase an already-recorded occurrence.
105
+ CREATE TABLE IF NOT EXISTS ambient_events (
106
+ id INTEGER NOT NULL PRIMARY KEY,
107
+ workspace_id INTEGER NOT NULL,
108
+ producer_worker_id INTEGER NOT NULL,
109
+ target_parent_worker_id INTEGER,
110
+ workspace_broadcast INTEGER NOT NULL DEFAULT 0 CHECK (workspace_broadcast IN (0, 1)),
111
+ kind TEXT NOT NULL CHECK (kind IN ('activity', 'loop_termination')),
112
+ source_record_id INTEGER NOT NULL CHECK (source_record_id >= 1),
113
+ at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
114
+ source TEXT,
115
+ op TEXT NOT NULL,
116
+ signal TEXT CHECK (signal IS NULL OR json_valid(signal)),
117
+ scheme TEXT,
118
+ username TEXT,
119
+ password TEXT,
120
+ hostname TEXT,
121
+ port INTEGER CHECK (port IS NULL OR (port BETWEEN 0 AND 65535)),
122
+ pathname TEXT,
123
+ query TEXT,
124
+ fragment TEXT,
125
+ line_marker TEXT CHECK (line_marker IS NULL OR json_valid(line_marker)),
126
+ tx TEXT NOT NULL,
127
+ mimetype_tx TEXT NOT NULL CHECK (length(mimetype_tx) > 0),
128
+ rx TEXT NOT NULL,
129
+ mimetype_rx TEXT NOT NULL CHECK (length(mimetype_rx) > 0),
130
+ status_rx INTEGER NOT NULL CHECK (status_rx BETWEEN 100 AND 599),
131
+ state TEXT NOT NULL CHECK (state IN ('resolved', 'failed', 'cancelled')),
132
+ outcome TEXT,
133
+ attrs TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(attrs)),
134
+ terminated_by TEXT CHECK (terminated_by IS NULL OR terminated_by = 'cancel'),
135
+ CHECK (target_parent_worker_id IS NOT NULL OR workspace_broadcast = 1),
136
+ CHECK (
137
+ (kind = 'activity' AND terminated_by IS NULL)
138
+ OR
139
+ (kind = 'loop_termination'
140
+ AND op = 'SEND'
141
+ -- {§env-delta-child-termination}: a message from the concluded child;
142
+ -- `source` names the actor and its READ address (#567, operator 2026-09-07).
143
+ AND scheme IS NULL
144
+ AND pathname IS NULL
145
+ AND json_valid(rx)
146
+ AND json_type(rx) = 'object'
147
+ AND json_type(rx, '$.status') = 'integer'
148
+ AND json_extract(rx, '$.status') = status_rx)
149
+ ),
150
+ FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE,
151
+ FOREIGN KEY (producer_worker_id) REFERENCES workers(id) ON DELETE CASCADE,
152
+ FOREIGN KEY (target_parent_worker_id) REFERENCES workers(id) ON DELETE CASCADE
153
+ ) STRICT;
154
+
155
+ CREATE INDEX IF NOT EXISTS ambient_events_workspace_id_id
156
+ ON ambient_events (workspace_id, id);
157
+
158
+ -- {§db-index-owners} Producer deletion's foreign-key check walks its events by producer; no registry statement selects by it.
159
+ CREATE INDEX IF NOT EXISTS ambient_events_producer_kind_id
160
+ ON ambient_events (producer_worker_id, kind, id);
161
+
162
+ CREATE INDEX IF NOT EXISTS ambient_events_parent_id
163
+ ON ambient_events (target_parent_worker_id, id)
164
+ WHERE target_parent_worker_id IS NOT NULL;
165
+
166
+ CREATE UNIQUE INDEX IF NOT EXISTS ambient_events_source_identity
167
+ ON ambient_events (producer_worker_id, kind, source_record_id);
168
+
169
+ CREATE TRIGGER IF NOT EXISTS ambient_events_structural_audience
170
+ BEFORE INSERT ON ambient_events
171
+ WHEN NOT EXISTS (
172
+ SELECT 1
173
+ FROM workers producer
174
+ WHERE producer.id = NEW.producer_worker_id
175
+ AND producer.workspace_id = NEW.workspace_id
176
+ AND (
177
+ NEW.target_parent_worker_id IS NULL
178
+ OR NEW.target_parent_worker_id = producer.parent_worker_id
179
+ )
180
+ )
181
+ BEGIN
182
+ SELECT RAISE(ABORT, 'ambient event audience must be the producer direct parent in the same workspace');
183
+ END;
@@ -0,0 +1,326 @@
1
+ -- MIGRATE: 3 loops
2
+ -- Chapter 3 of the schema baseline ({§db-schema-baseline}): Loops, their turns, and the immutable sources a turn was built from.
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
+ -- loops
7
+ -- policy: immutable per-loop proposal disposition ({§loop-policy-effective-read}).
8
+ CREATE TABLE IF NOT EXISTS loops (
9
+ id INTEGER NOT NULL PRIMARY KEY,
10
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
11
+ worker_id INTEGER NOT NULL,
12
+ sequence INTEGER NOT NULL CHECK (sequence >= 1),
13
+ status INTEGER NOT NULL DEFAULT 102 CHECK (status IN (100, 102, 200, 202, 413, 429, 499, 500, 504, 508)),
14
+ prompt TEXT NOT NULL,
15
+ -- {§prompt-causal-source}: canonical actor address for the initial prompt;
16
+ -- NULL means the owning worker itself.
17
+ prompt_source TEXT CHECK (prompt_source IS NULL OR length(prompt_source) > 0),
18
+ policy TEXT NOT NULL DEFAULT '{"proposals":"review"}' CHECK (json_valid(policy)),
19
+ -- {§worker-model-selection}: immutable loop snapshots of the resolved model route and the
20
+ -- effective spawn route (was provider_spec/child_provider_spec JSON).
21
+ model_route_id INTEGER REFERENCES model_routes(id),
22
+ spawn_model_route_id INTEGER REFERENCES model_routes(id),
23
+ reasoning_policy TEXT CHECK (reasoning_policy IS NULL OR length(reasoning_policy) > 0),
24
+ max_turns INTEGER NOT NULL DEFAULT 50 CHECK (max_turns >= -1),
25
+ -- {§worker-scheduled-send}: the selected cadence slot, coalesced at claim.
26
+ scheduled_at INTEGER CHECK (scheduled_at IS NULL OR scheduled_at BETWEEN 0 AND 8640000000000000),
27
+ repeat_interval_ms INTEGER CHECK (repeat_interval_ms IS NULL OR repeat_interval_ms > 0),
28
+ recurrence_root_loop_id INTEGER REFERENCES loops(id),
29
+ -- {§loop-execution-allowance}: initialized on first execution, charged with disposition.
30
+ execution_budget_ms INTEGER CHECK (execution_budget_ms IS NULL OR execution_budget_ms > 0),
31
+ execution_elapsed_ms REAL NOT NULL DEFAULT 0 CHECK (execution_elapsed_ms >= 0),
32
+ -- {§worker-wait-timing}: epoch milliseconds; NULL polling inherits streams.
33
+ wait_revision INTEGER NOT NULL DEFAULT 0 CHECK (wait_revision >= 0),
34
+ -- {§loop-rail-continuity}: one loop-owned streak and bounded repetition window.
35
+ strike_streak INTEGER NOT NULL DEFAULT 0 CHECK (strike_streak >= 0),
36
+ cycle_history TEXT NOT NULL DEFAULT '[]' CHECK (json_valid(cycle_history) AND json_type(cycle_history) = 'array'),
37
+ cycle_wait_revision INTEGER NOT NULL DEFAULT 0 CHECK (cycle_wait_revision >= 0 AND cycle_wait_revision <= wait_revision),
38
+ observed_wake_revision INTEGER NOT NULL DEFAULT 0 CHECK (observed_wake_revision >= 0),
39
+ wait_deadline_at INTEGER,
40
+ wait_poll_interval INTEGER CHECK (wait_poll_interval IS NULL OR wait_poll_interval >= 0),
41
+ wait_poll_at INTEGER,
42
+ -- {§methods-loop-run-open-paths}: the initial prompt frame's selected paths,
43
+ -- held here until turn 1 materializes that frame (string[] JSON).
44
+ open_paths TEXT NOT NULL DEFAULT '[]' CHECK (json_valid(open_paths)),
45
+ -- {§prompt-loop-containment}: one queued recovery loop may carry the
46
+ -- complete orphan frame set of one concluded source loop.
47
+ orphan_source_loop_id INTEGER,
48
+ -- {§worker-scheme} loop-termination delta: terminated_at is stamped by the trigger
49
+ -- below when status crosses into terminal (every death-path, uniformly).
50
+ terminated_at TEXT,
51
+ terminal_result TEXT,
52
+ -- {§loop-terminal-authorship}: 'cancel' names an external loop.cancel;
53
+ -- NULL covers model terminals and engine verdicts whose result carries the story.
54
+ terminated_by TEXT CHECK (terminated_by IS NULL OR terminated_by = 'cancel'),
55
+ CONSTRAINT loops_generation_policy_contract CHECK (
56
+ (model_route_id IS NULL) = (reasoning_policy IS NULL)
57
+ ),
58
+ CONSTRAINT loops_schedule_contract CHECK (
59
+ (repeat_interval_ms IS NULL OR scheduled_at IS NOT NULL)
60
+ AND (recurrence_root_loop_id IS NULL OR repeat_interval_ms IS NOT NULL)
61
+ ),
62
+ CONSTRAINT loops_terminal_result_contract CHECK (
63
+ CASE
64
+ WHEN status IN (100, 102, 202) THEN terminal_result IS NULL
65
+ WHEN terminal_result IS NULL OR NOT json_valid(terminal_result) THEN 0
66
+ ELSE
67
+ json_type(terminal_result) IS 'object'
68
+ AND json_type(terminal_result, '$.status') IS 'integer'
69
+ AND (
70
+ json_extract(terminal_result, '$.status') = status
71
+ OR (
72
+ status = 200
73
+ AND json_extract(terminal_result, '$.status') BETWEEN 200 AND 399
74
+ AND json_extract(terminal_result, '$.status') != 202
75
+ )
76
+ OR (
77
+ status = 500
78
+ AND json_extract(terminal_result, '$.status') BETWEEN 400 AND 599
79
+ )
80
+ )
81
+ AND CASE
82
+ WHEN json_extract(terminal_result, '$.status') < 400 THEN
83
+ json_type(terminal_result, '$.problem') IS NULL
84
+ ELSE
85
+ json_type(terminal_result, '$.problem') IS 'object'
86
+ AND json_type(terminal_result, '$.problem.status') IS 'integer'
87
+ AND json_extract(terminal_result, '$.problem.status')
88
+ = json_extract(terminal_result, '$.status')
89
+ AND json_type(terminal_result, '$.problem.type') IS 'text'
90
+ AND length(json_extract(terminal_result, '$.problem.type')) > 0
91
+ AND json_type(terminal_result, '$.problem.title') IS 'text'
92
+ AND length(json_extract(terminal_result, '$.problem.title')) > 0
93
+ AND json_type(terminal_result, '$.problem.detail') IS 'text'
94
+ AND length(json_extract(terminal_result, '$.problem.detail')) > 0
95
+ AND json_type(terminal_result, '$.problem.instance') IS 'text'
96
+ AND length(json_extract(terminal_result, '$.problem.instance')) > 0
97
+ END
98
+ END
99
+ ),
100
+ FOREIGN KEY (worker_id) REFERENCES workers(id) ON DELETE CASCADE,
101
+ FOREIGN KEY (orphan_source_loop_id) REFERENCES loops(id)
102
+ ) STRICT;
103
+
104
+ CREATE UNIQUE INDEX IF NOT EXISTS loops_worker_id_sequence ON loops (worker_id, sequence);
105
+
106
+ CREATE UNIQUE INDEX IF NOT EXISTS loops_orphan_source_loop_id ON loops (orphan_source_loop_id);
107
+
108
+ -- {§db-fk-indexes} Foreign-key check paths (route replacement, recurrence-root cascade) stop scanning loops.
109
+ CREATE INDEX IF NOT EXISTS loops_model_route_id ON loops (model_route_id) WHERE model_route_id IS NOT NULL;
110
+
111
+ CREATE INDEX IF NOT EXISTS loops_spawn_model_route_id ON loops (spawn_model_route_id) WHERE spawn_model_route_id IS NOT NULL;
112
+
113
+ CREATE INDEX IF NOT EXISTS loops_recurrence_root_loop_id ON loops (recurrence_root_loop_id) WHERE recurrence_root_loop_id IS NOT NULL;
114
+
115
+ CREATE UNIQUE INDEX IF NOT EXISTS loops_live_recurrence
116
+ ON loops (COALESCE(recurrence_root_loop_id, id))
117
+ WHERE repeat_interval_ms IS NOT NULL AND status IN (100, 102, 202);
118
+
119
+ -- turns
120
+ -- finish_reason / model: accepted provider-call metadata from the provider
121
+ -- response contract. Physical request accounting is normalized beneath the
122
+ -- logical emission attempt that caused it.
123
+ CREATE TABLE IF NOT EXISTS turns (
124
+ id INTEGER NOT NULL PRIMARY KEY,
125
+ version INTEGER NOT NULL DEFAULT 0 CHECK (version >= 0),
126
+ loop_id INTEGER NOT NULL,
127
+ sequence INTEGER NOT NULL CHECK (sequence >= 1),
128
+ timestamp TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
129
+ -- {§turn-record}: producer and purpose define the turn. Packet/provider
130
+ -- evidence below is an optional inference specialization.
131
+ producer TEXT NOT NULL CHECK (producer IN ('model', 'client', '_plurnk', 'plugin')),
132
+ kind TEXT NOT NULL CHECK (kind IN ('inference', 'initialization', 'operation', 'maintenance')),
133
+ status INTEGER NOT NULL CHECK (status BETWEEN 100 AND 599),
134
+ -- NULL while the producer still owns this turn. Status 102 is both the
135
+ -- provisional running value and the exact completed continue disposition;
136
+ -- completed_at distinguishes those states without inventing another status.
137
+ completed_at TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
138
+ -- Provider-derived curation calibration for this turn; NULL when input
139
+ -- capacity is unknown. {§tokenomics-client-gauge}
140
+ usage_curation_budget INTEGER CHECK (usage_curation_budget IS NULL OR usage_curation_budget >= 1),
141
+ -- {§packet-stored-shape}: NULL means no model request was assembled. A
142
+ -- present packet is either the measured request or that request extended
143
+ -- by the paired admitted-response fields. Its sections are rows
144
+ -- ({§packet-items}), never in this bag: the bag holds weight, attributions,
145
+ -- attachments, and the admitted response.
146
+ packet TEXT CHECK (
147
+ CASE
148
+ WHEN packet IS NULL THEN 1
149
+ WHEN json_valid(packet) = 0 THEN 0
150
+ ELSE COALESCE(
151
+ json_type(packet) = 'object'
152
+ AND json_type(packet, '$.weight') = 'integer'
153
+ AND json_extract(packet, '$.weight') >= 0
154
+ AND json_type(packet, '$.sections') IS NULL
155
+ AND json_type(packet, '$.attributions') = 'array'
156
+ AND (
157
+ (
158
+ json_type(packet, '$.assistant') IS NULL
159
+ AND json_type(packet, '$.assistantRaw') IS NULL
160
+ )
161
+ OR (
162
+ json_type(packet, '$.assistant') = 'object'
163
+ AND json_type(packet, '$.assistant.content') = 'text'
164
+ AND json_type(packet, '$.assistant.ops') = 'array'
165
+ AND json_type(packet, '$.assistant.reasoning') IN ('text', 'null')
166
+ AND json_type(packet, '$.assistantRaw') IS NOT NULL
167
+ )
168
+ ),
169
+ 0
170
+ )
171
+ END
172
+ ),
173
+ finish_reason TEXT,
174
+ model TEXT CHECK (model IS NULL OR length(model) >= 1),
175
+ -- Opaque provider→client metadata plus the grammar transport key; absent outside
176
+ -- recorded inference evidence. {§meta-passthrough}, {§operator-grammar}
177
+ meta TEXT CHECK (meta IS NULL OR json_valid(meta)),
178
+ CHECK (completed_at IS NOT NULL OR status = 102),
179
+ CHECK ((producer = 'model') = (kind = 'inference')),
180
+ CHECK (kind NOT IN ('initialization', 'maintenance') OR producer = '_plurnk'),
181
+ CHECK (
182
+ kind = 'inference'
183
+ OR (
184
+ usage_curation_budget IS NULL
185
+ AND packet IS NULL
186
+ AND finish_reason IS NULL
187
+ AND model IS NULL
188
+ AND meta IS NULL
189
+ )
190
+ ),
191
+ FOREIGN KEY (loop_id) REFERENCES loops(id) ON DELETE CASCADE
192
+ ) STRICT;
193
+
194
+ CREATE UNIQUE INDEX IF NOT EXISTS turns_loop_id_sequence ON turns (loop_id, sequence);
195
+
196
+ -- {§actor-boundary-doc-injection}: derived observation only; no durable row is rewritten.
197
+ CREATE VIEW IF NOT EXISTS work_loops AS
198
+ SELECT l.* FROM loops l
199
+ WHERE NOT EXISTS (SELECT 1 FROM turns t WHERE t.loop_id = l.id AND t.kind = 'maintenance')
200
+ OR EXISTS (SELECT 1 FROM turns t WHERE t.loop_id = l.id AND t.kind <> 'maintenance');
201
+
202
+ -- {§packet-items}: a packet's sections are rows over content-addressed items. Every rendered
203
+ -- block — one log row's record, one non-log section's content — is stored once by its hash;
204
+ -- a turn stores the ordered composition. A row whose rendering did not change between turns
205
+ -- hashes to the same item, so a turn's durable cost is its new and changed items.
206
+ CREATE TABLE IF NOT EXISTS packet_items (
207
+ hash TEXT NOT NULL PRIMARY KEY CHECK (length(hash) = 64),
208
+ text TEXT NOT NULL
209
+ ) STRICT, WITHOUT ROWID;
210
+
211
+ CREATE TABLE IF NOT EXISTS turn_sections (
212
+ turn_id INTEGER NOT NULL REFERENCES turns(id) ON DELETE CASCADE,
213
+ position INTEGER NOT NULL CHECK (position >= 0),
214
+ name TEXT NOT NULL CHECK (length(name) > 0),
215
+ slot TEXT NOT NULL CHECK (slot IN ('system', 'user')),
216
+ header TEXT,
217
+ weight INTEGER NOT NULL CHECK (weight >= 0),
218
+ PRIMARY KEY (turn_id, position),
219
+ UNIQUE (turn_id, name)
220
+ ) STRICT, WITHOUT ROWID;
221
+
222
+ CREATE TABLE IF NOT EXISTS turn_section_items (
223
+ turn_id INTEGER NOT NULL,
224
+ section INTEGER NOT NULL,
225
+ position INTEGER NOT NULL CHECK (position >= 0),
226
+ item_hash TEXT NOT NULL REFERENCES packet_items(hash),
227
+ PRIMARY KEY (turn_id, section, position),
228
+ FOREIGN KEY (turn_id, section) REFERENCES turn_sections(turn_id, position) ON DELETE CASCADE
229
+ ) STRICT, WITHOUT ROWID;
230
+
231
+ -- {§db-fk-indexes}: item collection and the packet_items foreign-key check path.
232
+ CREATE INDEX IF NOT EXISTS turn_section_items_item_hash ON turn_section_items (item_hash);
233
+
234
+ -- {§packet-items}: the one write of inference evidence — the packet bag, its sections as items,
235
+ -- and the provider metadata land in one statement through this view.
236
+ CREATE VIEW IF NOT EXISTS turn_inference_evidence AS
237
+ SELECT NULL AS turn_id, NULL AS packet, NULL AS sections,
238
+ NULL AS usage_curation_budget, NULL AS finish_reason, NULL AS model, NULL AS meta
239
+ WHERE 0;
240
+
241
+ CREATE TRIGGER IF NOT EXISTS turn_inference_evidence_insert
242
+ INSTEAD OF INSERT ON turn_inference_evidence
243
+ BEGIN
244
+ SELECT RAISE(ABORT, 'turn is not an open model inference turn')
245
+ WHERE NOT EXISTS (
246
+ SELECT 1 FROM turns
247
+ WHERE id = NEW.turn_id AND producer = 'model' AND kind = 'inference'
248
+ AND completed_at IS NULL AND packet IS NULL
249
+ );
250
+ SELECT RAISE(ABORT, 'packet sections must be a JSON array of {name, slot, header, weight, items}')
251
+ WHERE json_type(NEW.sections) IS NOT 'array';
252
+ INSERT OR IGNORE INTO packet_items (hash, text)
253
+ SELECT sha256(item.value), item.value
254
+ FROM json_each(NEW.sections) AS section, json_each(section.value, '$.items') AS item;
255
+ INSERT INTO turn_sections (turn_id, position, name, slot, header, weight)
256
+ SELECT NEW.turn_id, section.key,
257
+ json_extract(section.value, '$.name'), json_extract(section.value, '$.slot'),
258
+ json_extract(section.value, '$.header'), json_extract(section.value, '$.weight')
259
+ FROM json_each(NEW.sections) AS section;
260
+ INSERT INTO turn_section_items (turn_id, section, position, item_hash)
261
+ SELECT NEW.turn_id, section.key, item.key, sha256(item.value)
262
+ FROM json_each(NEW.sections) AS section, json_each(section.value, '$.items') AS item;
263
+ UPDATE turns
264
+ SET packet = NEW.packet,
265
+ usage_curation_budget = NEW.usage_curation_budget,
266
+ finish_reason = NEW.finish_reason,
267
+ model = NEW.model,
268
+ meta = NEW.meta
269
+ WHERE id = NEW.turn_id;
270
+ END;
271
+
272
+ -- {§packet-items}: a turn as its readers know it — the packet bag with its sections assembled
273
+ -- back into it, byte for byte: a section's content is its items joined by one blank line.
274
+ CREATE VIEW IF NOT EXISTS turn_packets AS
275
+ SELECT t.id, t.loop_id, t.sequence, t.timestamp, t.producer, t.kind, t.status, t.completed_at,
276
+ t.usage_curation_budget, t.finish_reason, t.model, t.meta, t.version,
277
+ CASE WHEN t.packet IS NULL THEN NULL ELSE json_set(t.packet, '$.sections', json((
278
+ SELECT COALESCE(json_group_array(json_object(
279
+ 'name', ts.name, 'slot', ts.slot, 'header', ts.header, 'weight', ts.weight,
280
+ 'content', COALESCE((
281
+ SELECT group_concat(pi.text, char(10) || char(10) ORDER BY tsi.position)
282
+ FROM turn_section_items tsi JOIN packet_items pi ON pi.hash = tsi.item_hash
283
+ WHERE tsi.turn_id = ts.turn_id AND tsi.section = ts.position
284
+ ), '')
285
+ ) ORDER BY ts.position), '[]')
286
+ FROM turn_sections ts WHERE ts.turn_id = t.id
287
+ ))) END AS packet
288
+ FROM turns t;
289
+
290
+ -- {§turn-source-resources}: immutable source facts belong to their turn, not
291
+ -- its curatable log. Derivation attachments are replaceable, source bytes are not.
292
+ CREATE TABLE IF NOT EXISTS turn_sources (
293
+ turn_id INTEGER NOT NULL REFERENCES turns(id) ON DELETE CASCADE,
294
+ kind TEXT NOT NULL CHECK (kind IN ('ops', 'reasoning')),
295
+ content TEXT NOT NULL,
296
+ model_call_id INTEGER REFERENCES model_calls(id),
297
+ deep_hash TEXT REFERENCES derivations(deep_hash),
298
+ PRIMARY KEY (turn_id, kind)
299
+ ) STRICT;
300
+
301
+ -- {§db-fk-indexes} A derivation replacement checks its referrers; the hash is indexed where it is a foreign key.
302
+ CREATE INDEX IF NOT EXISTS turn_sources_deep_hash ON turn_sources (deep_hash) WHERE deep_hash IS NOT NULL;
303
+
304
+ CREATE TRIGGER IF NOT EXISTS turn_sources_immutable
305
+ BEFORE UPDATE OF turn_id, kind, content, model_call_id ON turn_sources
306
+ BEGIN
307
+ SELECT RAISE(ABORT, 'turn source evidence is immutable');
308
+ END;
309
+
310
+ CREATE TRIGGER IF NOT EXISTS turn_sources_delete_with_turn_only
311
+ BEFORE DELETE ON turn_sources
312
+ WHEN EXISTS (SELECT 1 FROM turns WHERE id = OLD.turn_id)
313
+ BEGIN
314
+ SELECT RAISE(ABORT, 'turn source evidence belongs to its retained turn');
315
+ END;
316
+
317
+ -- {§turn-record} Producer and purpose never change beneath execution history.
318
+ CREATE TRIGGER IF NOT EXISTS turns_identity_forward_only
319
+ BEFORE UPDATE OF producer, kind ON turns
320
+ WHEN NOT (
321
+ OLD.producer = NEW.producer
322
+ AND OLD.kind = NEW.kind
323
+ )
324
+ BEGIN
325
+ SELECT RAISE(ABORT, 'turn producer and kind are immutable');
326
+ END;