@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
@@ -1,10 +1,12 @@
1
1
  import { InvalidOperationResultError } from "@plurnk/plurnk-schemes";
2
2
  import { schemeNameOf } from "./plurnk-uri.js";
3
- import { assertEditBatchReceipt, EditCollision, LineAnchors } from "../content/index.js";
3
+ import { EditCollision, LineAnchors } from "../content/index.js";
4
4
  import SchemeCtxImpl from "./caps/SchemeCtxImpl.js";
5
5
  import Results from "./results.js";
6
6
  import MutationEffects from "./MutationEffects.js";
7
- // EDIT preparation and settlement ({§edit-batch-merges}): anchors, batches, merge facts, and the prepared-edit registry.
7
+ import PatternEdits from "../content/pattern-edits.js";
8
+ import PatternSelection from "./PatternSelection.js";
9
+ // {§edit-execution}: one authored EDIT owns one effect and one proposal.
8
10
  export default class EditMutations {
9
11
  #schemes;
10
12
  #liveSubscriptions;
@@ -13,6 +15,11 @@ export default class EditMutations {
13
15
  #checkCapabilities;
14
16
  #editTargetIdentity;
15
17
  #resolveDataEntryAddress;
18
+ // {§kill-pattern} — EDITs synthesized from a KILL with a matcher remove whole lines.
19
+ #lineDeletions = new WeakSet();
20
+ markLineDeletion(statement) {
21
+ this.#lineDeletions.add(statement);
22
+ }
16
23
  #preparedEdits = new WeakMap();
17
24
  constructor({ schemes, liveSubscriptions, run, checkWritable, checkCapabilities, editTargetIdentity, resolveDataEntryAddress }) {
18
25
  this.#schemes = schemes;
@@ -23,18 +30,19 @@ export default class EditMutations {
23
30
  this.#editTargetIdentity = editTargetIdentity;
24
31
  this.#resolveDataEntryAddress = resolveDataEntryAddress;
25
32
  }
26
- async resolveEditAnchors(statements, identity, schemeName, manifest, ctx) {
27
- const anchored = statements.filter(({ lineMarker }) => LineAnchors.hasAnchor(lineMarker));
33
+ async #resolveEditAnchors(authored, identity, schemeName, manifest, ctx, sequence) {
34
+ const anchored = LineAnchors.hasAnchor(authored.lineMarker);
28
35
  // {§edit-batch-merges} — a body that looks like a pasted READ rendering needs the current
29
36
  // anchors to be verified, so it takes the anchored path even without an anchor of its own.
30
37
  const looksRendered = ({ body }) => {
31
38
  const rows = (body ?? "").split("\n").filter((row) => row.length > 0);
32
39
  return rows.length > 0 && rows.every((row) => LineAnchors.isAnchoredLine(row));
33
40
  };
34
- const rendered = statements.some(looksRendered)
41
+ const rendered = looksRendered(authored)
35
42
  && manifest.textEditScopes === true && manifest.writableBy.includes("model");
36
- if (anchored.length === 0 && !rendered) {
37
- return { statements: statements, precondition: null, prefixFacts: new Map() };
43
+ const track = sequence !== undefined && manifest.textEditScopes === true && manifest.writableBy.includes("model");
44
+ if (!anchored && !rendered && !track) {
45
+ return { statement: authored, precondition: null };
38
46
  }
39
47
  if (manifest.textEditScopes !== true || !manifest.writableBy.includes("model")) {
40
48
  return {
@@ -44,30 +52,29 @@ export default class EditMutations {
44
52
  recovery: "Remove the scope and submit the scheme's complete editable unit.",
45
53
  retryable: false,
46
54
  }),
47
- failedStatement: null,
48
55
  };
49
56
  }
50
57
  if (identity === null) {
51
58
  return {
52
59
  result: MutationEffects.failure("edit-target-required", 400, "A line-anchored EDIT requires a target resource.", {}, { recovery: "Provide the target that rendered the line anchor.", retryable: false }),
53
- failedStatement: null,
54
60
  };
55
61
  }
56
- const first = statements[0];
57
- if (first === undefined)
58
- return { statements: [], precondition: null, prefixFacts: new Map() };
59
62
  const current = await this.#run(schemeName, {
60
63
  op: "READ",
61
- delimiter: first.delimiter,
62
- annotation: null,
63
- target: first.target,
64
- metadata: first.metadata,
64
+ aside: null,
65
+ target: authored.target,
66
+ metadata: authored.metadata,
65
67
  lineMarker: { marks: [1, -1] },
68
+ matcher: null,
66
69
  body: null,
67
- position: first.position,
70
+ position: authored.position,
68
71
  }, ctx);
69
72
  if (current.status === 204 || current.status === 404) {
70
- return { result: EditCollision.result(identity), failedStatement: null };
73
+ sequence?.forget(identity);
74
+ if (!anchored && !rendered) {
75
+ return { statement: authored, precondition: null };
76
+ }
77
+ return { result: EditCollision.result(identity) };
71
78
  }
72
79
  if (current.status >= 300) {
73
80
  return {
@@ -77,59 +84,39 @@ export default class EditMutations {
77
84
  stage: "mutation-precondition",
78
85
  retryable: false,
79
86
  }),
80
- failedStatement: null,
81
87
  };
82
88
  }
83
89
  if (current.status !== 200) {
84
- return { result: EditCollision.result(identity), failedStatement: null };
90
+ return { result: EditCollision.result(identity) };
85
91
  }
86
92
  const content = current.content;
87
93
  if (typeof content !== "string") {
88
94
  throw new InvalidOperationResultError(`Scheme '${schemeName}' returned READ ${current.status} without textual content while validating an EDIT anchor.`);
89
95
  }
90
- const lineAnchors = current.lineAnchors;
91
96
  const lineAnchorIdentity = current.lineAnchorIdentity;
92
- try {
93
- LineAnchors.assertProjection(content, lineAnchors);
94
- if (typeof lineAnchorIdentity !== "string" || lineAnchorIdentity.length === 0) {
95
- throw new TypeError("READ line anchors require their canonical derivation identity.");
96
- }
97
- }
98
- catch (cause) {
99
- throw new InvalidOperationResultError(`Scheme '${schemeName}' returned READ 200 without its core-owned line-anchor projection.`, { cause });
97
+ if (typeof lineAnchorIdentity !== "string" || lineAnchorIdentity.length === 0) {
98
+ throw new InvalidOperationResultError(`Scheme '${schemeName}' returned READ 200 without its canonical derivation identity.`);
100
99
  }
101
- const resolved = [];
100
+ // {§line-anchor-write-authority}: internal validation does not depend on published edit hints.
101
+ const lineAnchors = LineAnchors.tokens(lineAnchorIdentity, content);
102
+ let resolved;
103
+ const snapshot = sequence?.observe(lineAnchorIdentity, content);
104
+ const resolve = (marker) => LineAnchors.resolve(lineAnchors, marker, snapshot?.anchors);
102
105
  const checks = [];
103
- // {§edit-batch-receipt} — every anchor is resolved before any verdict, so a collision
104
- // names each anchor that no longer resolves, not just the first (#428).
105
- const stale = [];
106
+ // {§edit-batch-receipt} — diagnose all unresolved anchors, including both range endpoints.
107
+ const unresolved = new Map();
106
108
  // {§edit-batch-merges} — a body whose every line carries this resource's own rendered
107
109
  // `@xxxxx L:` prefix, hash-verified at its ordinal against the current anchors, is the
108
110
  // READ rendering pasted back: the prefixes are stripped and the row says so. A look-alike
109
111
  // that does not verify is content and is written as authored, with the fact reported.
110
- const prefixFacts = new Map();
112
+ let prefixFact;
111
113
  let publishedReads = null;
112
114
  const publishedAnchors = async () => {
113
115
  if (publishedReads !== null)
114
116
  return publishedReads;
115
- const rows = await ctx.db.engine_render_log.all({ worker_id: ctx.workerId });
116
- const reads = [];
117
- for (const row of rows) {
118
- if (row.op !== "READ" || row.status_rx !== 200 || typeof row.rx !== "string")
119
- continue;
120
- let parsed;
121
- try {
122
- parsed = JSON.parse(row.rx);
123
- }
124
- catch {
125
- continue;
126
- }
127
- if (parsed.lineAnchorIdentity !== lineAnchorIdentity || !Array.isArray(parsed.lineAnchors))
128
- continue;
129
- reads.push({ startLine: typeof parsed.startLine === "number" ? parsed.startLine : 1, anchors: parsed.lineAnchors });
130
- }
131
- publishedReads = reads;
132
- return reads;
117
+ const rows = await ctx.db.edit_published_reads.all({ worker_id: ctx.workerId, identity: lineAnchorIdentity });
118
+ publishedReads = rows.map(({ start_line, anchors }) => ({ startLine: start_line, anchors: JSON.parse(anchors) }));
119
+ return publishedReads;
133
120
  };
134
121
  const stripRendered = async (statement) => {
135
122
  const body = statement.body;
@@ -144,37 +131,46 @@ export default class EditMutations {
144
131
  const current = verifies(lineAnchors, 1);
145
132
  const source = current ? "current" : (await publishedAnchors()).some(({ anchors, startLine }) => verifies(anchors, startLine)) ? "log" : null;
146
133
  if (source === null) {
147
- prefixFacts.set(statement, { rule: "rendered-prefix-unverified", lines: filled.length });
134
+ prefixFact = { rule: "rendered-prefix-unverified", lines: filled.length };
148
135
  return statement;
149
136
  }
150
- prefixFacts.set(statement, { rule: "rendered-prefix-stripped", lines: filled.length, source });
137
+ prefixFact = { rule: "rendered-prefix-stripped", lines: filled.length, source };
151
138
  // A rendered row per line: a blank last line keeps its terminator so the paste
152
139
  // reproduces exactly the lines it rendered.
153
140
  const stripped = rows.map((row) => row.replace(/^@[0-9A-Za-z]{5} +\d+:/, ""));
154
141
  return { ...statement, body: stripped.join("\n") + (stripped.length > 1 && stripped.at(-1) === "" ? "\n" : "") };
155
142
  };
156
- for (const authored of statements) {
157
- const statement = await stripRendered(authored);
158
- if (statement.lineMarker === null || !LineAnchors.hasAnchor(statement.lineMarker)) {
159
- resolved.push(statement);
160
- continue;
161
- }
162
- const resolution = LineAnchors.resolve(lineAnchors, statement.lineMarker);
143
+ const statement = await stripRendered(authored);
144
+ if (statement.lineMarker === null || !LineAnchors.hasAnchor(statement.lineMarker)) {
145
+ resolved = statement;
146
+ }
147
+ else {
148
+ const resolution = resolve(statement.lineMarker);
163
149
  if (!resolution.ok) {
164
- const { anchor, kind } = resolution.failure;
165
- const invalid = kind === "invalid";
166
- if (!invalid) {
167
- stale.push({ anchor, kind, ...("matches" in resolution.failure ? { lines: resolution.failure.matches } : {}) });
168
- continue;
150
+ if (resolution.failure.kind === "invalid") {
151
+ return {
152
+ result: MutationEffects.failure("line-anchor-invalid", 400, LineAnchors.invalidCoordinateDetail, {}, { anchor: resolution.failure.anchor, target: identity, recovery: LineAnchors.invalidCoordinateRecovery, retryable: false }),
153
+ };
154
+ }
155
+ for (const mark of statement.lineMarker.marks) {
156
+ if (typeof mark !== "string" || unresolved.has(mark))
157
+ continue;
158
+ const endpoint = resolve({ marks: [mark] });
159
+ if (endpoint.ok)
160
+ continue;
161
+ if (endpoint.failure.kind === "invalid") {
162
+ throw new InvalidOperationResultError("A validated EDIT anchor became an invalid line coordinate.");
163
+ }
164
+ const { anchor, kind, matches } = endpoint.failure;
165
+ unresolved.set(anchor, { anchor, kind, ...(matches === undefined ? {} : { lines: matches }) });
169
166
  }
170
167
  return {
171
- result: MutationEffects.failure("line-anchor-invalid", 400, LineAnchors.invalidCoordinateDetail, {}, {
172
- anchor,
173
- target: identity,
174
- recovery: LineAnchors.invalidCoordinateRecovery,
175
- retryable: false,
168
+ result: EditCollision.result(lineAnchorIdentity, {}, {
169
+ unresolvedAnchors: [...unresolved.values()],
170
+ editCount: 1,
171
+ applied: 0,
172
+ recovery: "0 of 1 edits applied. READ the target for current coordinates.",
176
173
  }),
177
- failedStatement: authored,
178
174
  };
179
175
  }
180
176
  for (const [index, anchor] of statement.lineMarker.marks.entries()) {
@@ -184,233 +180,168 @@ export default class EditMutations {
184
180
  if (typeof line !== "number") {
185
181
  throw new InvalidOperationResultError("An EDIT line anchor did not lower to a numeric line.");
186
182
  }
187
- checks.push({ anchor, line });
183
+ // The owner validates current content, not the carried anchor's former neighborhood.
184
+ checks.push({ anchor: lineAnchors[line - 1], line });
188
185
  }
189
- resolved.push({ ...statement, lineMarker: resolution.marker });
190
- }
191
- if (stale.length > 0) {
192
- const named = stale.map((s) => s.kind === "ambiguous" ? `${s.anchor} (matches lines ${(s.lines ?? []).join(", ")})` : s.anchor).join(", ");
193
- return {
194
- result: EditCollision.result(lineAnchorIdentity, {}, {
195
- staleAnchors: stale,
196
- editCount: statements.length,
197
- applied: 0,
198
- recovery: `${named} no longer resolve${stale.length === 1 ? "s" : ""} — the line moved or changed since the READ that rendered ${stale.length === 1 ? "it" : "them"}; 0 of ${statements.length} edits in this batch were applied. READ the target again before selecting current coordinates.`,
199
- }),
200
- failedStatement: null,
201
- };
186
+ resolved = { ...statement, lineMarker: resolution.marker };
202
187
  }
203
188
  const uniqueChecks = [...new Map(checks.map((check) => [`${check.anchor}:${check.line}`, check])).values()];
204
189
  return {
205
- statements: resolved,
206
- // A strip-only batch authored no anchor and so carries no compare-and-swap precondition.
190
+ statement: resolved,
191
+ // A strip-only EDIT authored no anchor and so carries no compare-and-swap precondition.
207
192
  precondition: uniqueChecks.length === 0 ? null : { identity: lineAnchorIdentity, checks: uniqueChecks },
208
- prefixFacts,
193
+ prefixFact,
194
+ snapshot,
209
195
  };
210
196
  }
211
- async prepareEditBatches(statements, context, schemeCtx) {
212
- const { workspaceId, loopId, origin } = context;
213
- const ctx = schemeCtx;
214
- const groups = new Map();
215
- for (const statement of statements) {
216
- const { key, identity } = await this.#editTargetIdentity(statement, workspaceId, ctx.functionalityWorkerId);
217
- const group = groups.get(key);
218
- if (group === undefined)
219
- groups.set(key, {
220
- identity,
221
- statements: [statement],
222
- });
223
- else
224
- group.statements.push(statement);
197
+ async edit(statement, ctx, sequence) {
198
+ const denial = this.#checkWritable(statement, ctx.writer, ctx.workspaceId)
199
+ ?? await this.#checkCapabilities(statement, ctx);
200
+ if (denial !== null)
201
+ return denial;
202
+ const schemeName = schemeNameOf(statement.target);
203
+ if (schemeName === null || statement.target === null) {
204
+ return MutationEffects.failure("target-required", 400, "EDIT requires a target scheme.", {}, { retryable: false });
225
205
  }
226
- for (const preparedGroup of groups.values()) {
227
- const group = preparedGroup.statements;
228
- const first = group[0];
229
- const schemeName = schemeNameOf(first.target);
230
- let initial;
231
- let projections = null;
232
- let prefixFacts = new Map();
233
- let denial = group.map((statement) => this.#checkWritable(statement, origin, ctx.functionalityWorkerId)).find((result) => result !== null) ?? null;
234
- if (denial === null) {
235
- for (const statement of group) {
236
- denial = await this.#checkCapabilities(statement, ctx.workspaceId, loopId, ctx.functionalityWorkerId);
237
- if (denial !== null)
238
- break;
239
- }
240
- }
241
- if (denial !== null) {
242
- initial = denial;
243
- }
244
- else if (schemeName === null) {
245
- initial = MutationEffects.failure("target-required", 400, "EDIT requires a target scheme.", {}, { retryable: false });
246
- }
247
- else {
248
- const handler = this.#schemes.get(schemeName, ctx.functionalityWorkerId);
249
- const method = handler?.editBatch;
250
- const manifest = this.#schemes.manifestFor(schemeName, ctx.functionalityWorkerId);
251
- if (handler === undefined || typeof method !== "function" || manifest?.category !== "data") {
252
- initial = MutationEffects.failure("operation-not-implemented", 501, `Scheme '${schemeName}' does not implement EDIT batches.`, {}, {
253
- scheme: schemeName,
254
- operation: "EDIT",
255
- retryable: false,
256
- });
257
- }
258
- else if (group.some(({ metadata }) => metadata !== null) && manifest.metadataModifier !== true) {
259
- initial = MutationEffects.failure("scheme-metadata-unsupported", 400, `Scheme '${schemeName}' does not accept the {metadata} modifier.`, {}, { scheme: schemeName, operation: "EDIT", retryable: false });
260
- }
261
- else {
262
- try {
263
- const resolved = await this.resolveEditAnchors(group, preparedGroup.identity, schemeName, manifest, schemeCtx);
264
- if ("result" in resolved) {
265
- initial = resolved.result;
266
- if (resolved.failedStatement !== null) {
267
- projections = new Map(group.map((statement) => [
268
- statement,
269
- statement === resolved.failedStatement
270
- ? resolved.result
271
- : MutationEffects.failure("edit-batch-rejected", 424, "This EDIT was not applied because another EDIT in the same resource batch was invalid.", {}, {
272
- operation: "EDIT",
273
- target: preparedGroup.identity,
274
- retryable: false,
275
- }),
276
- ]));
277
- }
278
- }
279
- else {
280
- prefixFacts = resolved.prefixFacts;
281
- const addressedScheme = first.target?.kind === "url" ? first.target.scheme : schemeName;
282
- const publishedChannel = first.target?.kind === "url"
283
- ? first.target.fragment ?? manifest.defaultChannel
284
- : manifest.defaultChannel;
285
- if (first.target === null) {
286
- throw new InvalidOperationResultError("An EDIT batch has no target.");
287
- }
288
- const binding = await this.#resolveDataEntryAddress({
289
- target: first.target,
290
- routedScheme: schemeName,
291
- handler,
292
- manifest,
293
- ctx: schemeCtx,
294
- });
295
- if (binding.result !== null) {
296
- initial = binding.result;
297
- }
298
- else if (binding.address === null) {
299
- initial = MutationEffects.failure("entry-not-found", 404, "The EDIT target could not be resolved.");
300
- }
301
- else {
302
- initial = Results.assert(await method.call(handler, resolved.statements, new SchemeCtxImpl(schemeCtx, addressedScheme ?? schemeName, manifest, this.#liveSubscriptions, {
303
- authority: binding.address.authority,
304
- ownerId: binding.address.ownerId,
305
- publishedChannel,
306
- editPrecondition: resolved.precondition,
307
- })));
308
- }
309
- }
310
- }
311
- catch (err) {
312
- if (err instanceof InvalidOperationResultError)
313
- throw err;
314
- console.error(`Scheme '${schemeName}' EDIT batch threw outside its operation result contract:`, err);
315
- initial = MutationEffects.failure("scheme-handler-threw", 500, `The '${schemeName}' scheme did not produce an EDIT result.`, {}, {
316
- stage: "scheme-dispatch",
317
- scheme: schemeName,
318
- operation: "EDIT",
319
- });
320
- }
321
- }
322
- }
323
- let resolveSettled;
324
- const settled = new Promise((resolve) => { resolveSettled = resolve; });
325
- const candidate = initial.editReceipt;
326
- const expectedNormalizations = group.filter(({ lineMarker }) => lineMarker?.marks.length === 3).length;
327
- if (initial.status < 400
328
- && (initial.scopeNormalizations?.length ?? 0) !== expectedNormalizations) {
329
- throw new InvalidOperationResultError(`EDIT batch normalized ${initial.scopeNormalizations?.length ?? 0} scope(s), expected ${expectedNormalizations}.`);
330
- }
331
- const batch = {
332
- initial,
333
- settled,
334
- aggregate: candidate === undefined || candidate === null
335
- ? undefined
336
- : assertEditBatchReceipt(candidate),
337
- settle: resolveSettled,
338
- };
339
- // {§edit-batch-merges} — the scheme's merge facts are keyed by authored index; a dropped
340
- // duplicate has no effect in the applied-edits receipt, so receipt indices re-align.
341
- const merges = initial.status < 400
342
- ? (initial.merges ?? [])
343
- : [];
344
- const DROPPING_RULES = new Set(["duplicate-of", "contained-relocated", "contained-already-applied"]);
345
- const droppedIndices = new Set(merges.filter(({ rule }) => DROPPING_RULES.has(rule)).map(({ index }) => index));
346
- let normalizationIndex = 0;
347
- for (const [index, statement] of group.entries()) {
348
- const dropped = droppedIndices.has(index);
349
- const ownsNormalization = statement.lineMarker?.marks.length === 3 && initial.status < 400 && !dropped;
350
- const own = merges.filter((merge) => merge.index === index).map(({ index: _index, ...fact }) => fact);
351
- const prefix = prefixFacts.get(statement);
352
- if (prefix !== undefined)
353
- own.push(prefix);
354
- this.#preparedEdits.set(statement, {
355
- first: index === 0,
356
- index,
357
- normalizationIndex: ownsNormalization ? normalizationIndex++ : null,
358
- projection: projections?.get(statement) ?? null,
359
- batch,
360
- receiptIndex: dropped ? null : index - [...droppedIndices].filter((d) => d < index).length,
361
- merged: own,
362
- });
206
+ const handler = this.#schemes.get(schemeName, ctx.workspaceId);
207
+ const manifest = this.#schemes.manifestFor(schemeName, ctx.workspaceId);
208
+ if (handler?.editBatch === undefined || manifest === undefined) {
209
+ return MutationEffects.failure("operation-not-implemented", 501, `Scheme '${schemeName}' does not implement EDIT.`, {}, { scheme: schemeName, operation: "EDIT", retryable: false });
210
+ }
211
+ if (statement.metadata !== null && manifest.metadataModifier !== true) {
212
+ return MutationEffects.failure("scheme-metadata-unsupported", 400, `Scheme '${schemeName}' does not accept the [metadata] modifier.`, {}, { scheme: schemeName, operation: "EDIT", retryable: false });
213
+ }
214
+ const addressedScheme = statement.target.kind === "url" ? statement.target.scheme : schemeName;
215
+ const publishedChannel = statement.target.fragment ?? manifest.defaultChannel;
216
+ const binding = manifest.category !== "data" ? null : await this.#resolveDataEntryAddress({
217
+ target: statement.target, routedScheme: schemeName, handler, manifest, ctx, access: "write",
218
+ });
219
+ if (binding?.result !== null && binding?.result !== undefined)
220
+ return binding.result;
221
+ if (binding !== null && binding.address === null) {
222
+ return MutationEffects.failure("entry-not-found", 404, "The EDIT target could not be resolved.");
223
+ }
224
+ const identity = await this.#editTargetIdentity(statement, ctx.workspaceId, ctx.workspaceId);
225
+ const resolved = await this.#resolveEditAnchors(statement, identity, schemeName, manifest, ctx, sequence);
226
+ if ("result" in resolved)
227
+ return resolved.result;
228
+ // {§edit-pattern} — a matcher expands the one authored EDIT into a batch of span edits
229
+ // over the current content, guarded by the anchors of every line it touches.
230
+ let batch = [resolved.statement];
231
+ let precondition = resolved.precondition;
232
+ let matched;
233
+ if (statement.matcher !== null) {
234
+ const expanded = await this.expandPattern(resolved.statement, this.#lineDeletions.has(statement) ? "lines" : "spans", schemeName, manifest, ctx);
235
+ if ("result" in expanded)
236
+ return expanded.result;
237
+ batch = expanded.statements;
238
+ matched = expanded.matched;
239
+ precondition = expanded.precondition;
240
+ if (batch.length === 0) {
241
+ // {§edit-pattern} zero matches is the answer: nothing touched, nothing failed.
242
+ sequence?.forget(expanded.identity);
243
+ return Results.assert({ status: 204, matched: 0, detail: "No span matched the pattern; the resource is unchanged." });
363
244
  }
364
245
  }
246
+ const result = Results.assert(await handler.editBatch(batch, new SchemeCtxImpl(ctx, addressedScheme ?? schemeName, manifest, this.#liveSubscriptions, {
247
+ authority: binding?.address?.authority ?? (statement.target.kind === "url" ? statement.target.hostname ?? "" : ""),
248
+ publishedChannel,
249
+ editPrecondition: precondition,
250
+ })));
251
+ const expectedNormalizations = matched !== undefined ? 0 : statement.lineMarker?.marks.length === 3 ? 1 : 0;
252
+ if (result.status < 400 && (result.scopeNormalizations?.length ?? 0) !== expectedNormalizations) {
253
+ throw new InvalidOperationResultError(`EDIT normalized ${result.scopeNormalizations?.length ?? 0} scope(s), expected ${expectedNormalizations}.`);
254
+ }
255
+ if (matched !== undefined) {
256
+ // The batch landed as one operation: the receipt counts the spans and keeps the
257
+ // boundary context of the first and last of them; the sequence re-reads next time.
258
+ if (resolved.snapshot !== undefined)
259
+ sequence?.forget(resolved.snapshot.identity);
260
+ return this.withMergeFacts(statement, MutationEffects.projectEdit(PatternEdits.compactReceipt(result, matched)));
261
+ }
262
+ const merged = resolved.prefixFact === undefined ? [] : [resolved.prefixFact];
263
+ this.#preparedEdits.set(statement, {
264
+ merged,
265
+ snapshot: resolved.snapshot,
266
+ resolved: resolved.statement,
267
+ sequence,
268
+ });
269
+ return this.withMergeFacts(statement, MutationEffects.projectEdit(result));
365
270
  }
366
- preparedEditResult(statement) {
367
- const prepared = this.#preparedEdits.get(statement);
368
- if (prepared === undefined) {
369
- throw new InvalidOperationResultError("EDIT reached dispatch without a prepared resource batch.");
271
+ // {§edit-pattern} {§kill-pattern} — read the resource once, match, and expand into a batch of
272
+ // coordinate edits: within-line spans replaced by the body ("spans"), or whole matched lines
273
+ // removed ("lines"). Every touched line's anchor guards the batch, so a same-turn change to
274
+ // one of them collides exactly as an anchored EDIT would.
275
+ async expandPattern(resolved, mode, schemeName, manifest, ctx) {
276
+ const matcher = resolved.matcher;
277
+ if (matcher === null)
278
+ throw new Error("expandPattern requires a matcher");
279
+ const operation = mode === "spans" ? "EDIT" : "KILL";
280
+ const refuse = (code, status, detail) => ({
281
+ result: PatternSelection.refuse(code, status, detail, schemeName, operation),
282
+ });
283
+ const dialect = PatternSelection.refuseDialect(matcher, schemeName, operation);
284
+ if (dialect !== null)
285
+ return { result: dialect };
286
+ if (manifest.textEditScopes !== true) {
287
+ return refuse("pattern-unsupported", 400, `Scheme '${schemeName}' has no textual lines for a pattern to select.`);
288
+ }
289
+ const target = resolved.target;
290
+ if (target === null)
291
+ return refuse("edit-target-required", 400, `A pattern ${operation} requires a target resource.`);
292
+ const current = await this.#run(schemeName, {
293
+ op: "READ", aside: null, target, metadata: resolved.metadata, lineMarker: { marks: [1, -1] }, matcher: null, body: null, position: resolved.position,
294
+ }, ctx);
295
+ if (current.status === 204 || current.status === 404) {
296
+ return refuse("entry-not-found", 404, `Nothing to match: ${target.raw} has no text.`);
297
+ }
298
+ if (current.status >= 300)
299
+ return { result: current };
300
+ const content = current.content;
301
+ const read = current;
302
+ // The whole-resource slice reads as the text primitive; the channel's own mimetype picks
303
+ // the handler the pattern runs under, exactly as FIND does.
304
+ const mimetype = typeof read.sourceMimetype === "string" ? read.sourceMimetype : read.mimetype;
305
+ const identity = current.lineAnchorIdentity;
306
+ if (typeof content !== "string" || typeof identity !== "string" || identity.length === 0) {
307
+ throw new InvalidOperationResultError(`Scheme '${schemeName}' returned READ ${current.status} without textual content and its anchor identity for a pattern ${operation}.`);
308
+ }
309
+ const matched = await PatternSelection.match({
310
+ matcher, content, mimetype: typeof mimetype === "string" ? mimetype : "text/plain",
311
+ marks: resolved.lineMarker?.marks, ctx, scheme: schemeName, operation,
312
+ });
313
+ if ("result" in matched)
314
+ return matched;
315
+ const { evidence, bounds } = matched;
316
+ let edits;
317
+ if (mode === "spans") {
318
+ const spans = PatternEdits.spans(matcher, content, evidence, bounds);
319
+ if ("error" in spans)
320
+ return refuse("pattern-span-invalid", 400, spans.error);
321
+ edits = PatternEdits.replacements(spans, (resolved.body ?? "").replace(/\r\n?/g, "\n"));
370
322
  }
371
- return MutationEffects.projectPreparedEdit(prepared);
323
+ else {
324
+ edits = PatternEdits.deletions(PatternEdits.lines(evidence, bounds));
325
+ }
326
+ const tokens = LineAnchors.tokens(identity, content);
327
+ const checks = PatternEdits.touchedLines(edits).flatMap((line) => tokens[line - 1] === undefined ? [] : [{ anchor: tokens[line - 1], line }]);
328
+ return {
329
+ statements: edits.map((edit) => ({ ...resolved, lineMarker: edit.marker, matcher: null, body: edit.body })),
330
+ matched: edits.length,
331
+ precondition: { identity, checks },
332
+ identity,
333
+ };
372
334
  }
373
335
  withMergeFacts(statement, result) {
374
- const prepared = this.#preparedEdits.get(statement);
375
- if (prepared === undefined || prepared.merged.length === 0)
376
- return result;
377
- return Results.assert({ ...result, merged: prepared.merged });
336
+ const merged = this.mergeFacts(statement);
337
+ return merged.length === 0 ? result : Results.assert({ ...result, merged });
378
338
  }
379
339
  settleEdit(statement, result) {
380
340
  const prepared = this.#preparedEdits.get(statement);
381
- if (prepared?.first !== true)
382
- return;
383
- const normalizations = prepared.batch.initial.scopeNormalizations;
384
- prepared.batch.settle(normalizations === undefined
385
- ? result
386
- : Results.assert({ ...result, scopeNormalizations: normalizations }));
387
- }
388
- recordEditSettlement(statement, settlement) {
389
- if (statement.op !== "EDIT")
390
- return;
391
- const prepared = this.#preparedEdits.get(statement);
392
- if (prepared === undefined || !prepared.first) {
393
- throw new InvalidOperationResultError("An EDIT proposal settled without its prepared batch owner.");
394
- }
395
- const { resolution, applied } = settlement;
396
- if (resolution.decision !== "accept"
397
- || applied === undefined
398
- || applied.status >= 300) {
399
- prepared.batch.aggregate = undefined;
400
- return;
401
- }
402
- if (applied.editReceipt === null) {
403
- prepared.batch.aggregate = undefined;
404
- return;
405
- }
406
- if (applied.editReceipt !== undefined) {
407
- prepared.batch.aggregate = assertEditBatchReceipt(applied.editReceipt);
408
- return;
341
+ if (prepared?.snapshot !== undefined && prepared.resolved !== undefined) {
342
+ prepared.sequence?.settle(prepared.snapshot, prepared.resolved, result);
409
343
  }
410
- if (resolution.body !== undefined)
411
- prepared.batch.aggregate = undefined;
412
344
  }
413
- // The merge facts the preparation recorded for one statement, for its proposal settlement.
414
345
  mergeFacts(statement) {
415
346
  return this.#preparedEdits.get(statement)?.merged ?? [];
416
347
  }