@plurnk/plurnk-service 4.1.0 → 4.3.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 (452) hide show
  1. package/.env.defaults +3 -0
  2. package/INSTALL.md +7 -2
  3. package/README.md +3 -1
  4. package/SPEC.md +1996 -1370
  5. package/dist/build-info.d.ts.map +1 -1
  6. package/dist/build-info.js +25 -3
  7. package/dist/build-info.js.map +1 -1
  8. package/dist/build-info.json +1 -1
  9. package/dist/completions/_plurnk-service +2 -2
  10. package/dist/completions/plurnk-service.bash +2 -2
  11. package/dist/completions/plurnk-service.fish +2 -0
  12. package/dist/content/body-preview.js.map +1 -1
  13. package/dist/content/byte-view.d.ts.map +1 -1
  14. package/dist/content/byte-view.js +3 -2
  15. package/dist/content/byte-view.js.map +1 -1
  16. package/dist/content/edit-collision.d.ts +2 -1
  17. package/dist/content/edit-collision.d.ts.map +1 -1
  18. package/dist/content/edit-collision.js.map +1 -1
  19. package/dist/content/edit-receipt.d.ts.map +1 -1
  20. package/dist/content/edit-receipt.js +28 -23
  21. package/dist/content/edit-receipt.js.map +1 -1
  22. package/dist/content/edited-span.js +1 -1
  23. package/dist/content/edited-span.js.map +1 -1
  24. package/dist/content/line-anchors.d.ts +3 -2
  25. package/dist/content/line-anchors.d.ts.map +1 -1
  26. package/dist/content/line-anchors.js +33 -19
  27. package/dist/content/line-anchors.js.map +1 -1
  28. package/dist/content/line-selection.js.map +1 -1
  29. package/dist/content/pattern-edits.js +1 -1
  30. package/dist/content/pattern-edits.js.map +1 -1
  31. package/dist/content/read-projector.d.ts +1 -1
  32. package/dist/content/read-projector.d.ts.map +1 -1
  33. package/dist/content/read-projector.js +10 -8
  34. package/dist/content/read-projector.js.map +1 -1
  35. package/dist/content/read-resolve.d.ts.map +1 -1
  36. package/dist/content/read-resolve.js +6 -5
  37. package/dist/content/read-resolve.js.map +1 -1
  38. package/dist/core/AdmittedTurnExecutor.d.ts +4 -4
  39. package/dist/core/AdmittedTurnExecutor.d.ts.map +1 -1
  40. package/dist/core/AdmittedTurnExecutor.js +20 -18
  41. package/dist/core/AdmittedTurnExecutor.js.map +1 -1
  42. package/dist/core/AmbientMembers.d.ts +18 -0
  43. package/dist/core/AmbientMembers.d.ts.map +1 -0
  44. package/dist/core/AmbientMembers.js +84 -0
  45. package/dist/core/AmbientMembers.js.map +1 -0
  46. package/dist/core/BareBatchRunner.d.ts +1 -1
  47. package/dist/core/BareBatchRunner.d.ts.map +1 -1
  48. package/dist/core/BareBatchRunner.js +2 -2
  49. package/dist/core/BareBatchRunner.js.map +1 -1
  50. package/dist/core/CapabilityPolicies.js.map +1 -1
  51. package/dist/core/CapabilityResolver.d.ts +1 -2
  52. package/dist/core/CapabilityResolver.d.ts.map +1 -1
  53. package/dist/core/CapabilityResolver.js +11 -7
  54. package/dist/core/CapabilityResolver.js.map +1 -1
  55. package/dist/core/ChannelWrite.d.ts +2 -2
  56. package/dist/core/ChannelWrite.d.ts.map +1 -1
  57. package/dist/core/ChannelWrite.js.map +1 -1
  58. package/dist/core/ChannelWrite.sql +27 -0
  59. package/dist/core/ClientInteractions.js.map +1 -1
  60. package/dist/core/ContextFit.js +1 -1
  61. package/dist/core/ContextFit.js.map +1 -1
  62. package/dist/core/CoreSchemeServices.d.ts.map +1 -1
  63. package/dist/core/CoreSchemeServices.js +6 -4
  64. package/dist/core/CoreSchemeServices.js.map +1 -1
  65. package/dist/core/DataStatementRunner.d.ts.map +1 -1
  66. package/dist/core/DataStatementRunner.js +24 -15
  67. package/dist/core/DataStatementRunner.js.map +1 -1
  68. package/dist/core/Dispatcher.d.ts +29 -5
  69. package/dist/core/Dispatcher.d.ts.map +1 -1
  70. package/dist/core/Dispatcher.js +242 -132
  71. package/dist/core/Dispatcher.js.map +1 -1
  72. package/dist/core/EditMutations.d.ts.map +1 -1
  73. package/dist/core/EditMutations.js +12 -6
  74. package/dist/core/EditMutations.js.map +1 -1
  75. package/dist/core/EditSequence.js.map +1 -1
  76. package/dist/core/Engine.d.ts +12 -6
  77. package/dist/core/Engine.d.ts.map +1 -1
  78. package/dist/core/Engine.js +29 -7
  79. package/dist/core/Engine.js.map +1 -1
  80. package/dist/core/ExecutionOutputs.js.map +1 -1
  81. package/dist/core/ExecutorRegistry.d.ts +1 -2
  82. package/dist/core/ExecutorRegistry.d.ts.map +1 -1
  83. package/dist/core/ExecutorRegistry.js +2 -2
  84. package/dist/core/ExecutorRegistry.js.map +1 -1
  85. package/dist/core/FileAddress.d.ts +1 -0
  86. package/dist/core/FileAddress.d.ts.map +1 -1
  87. package/dist/core/FileAddress.js +8 -1
  88. package/dist/core/FileAddress.js.map +1 -1
  89. package/dist/core/FilePublication.d.ts.map +1 -1
  90. package/dist/core/FilePublication.js +6 -3
  91. package/dist/core/FilePublication.js.map +1 -1
  92. package/dist/core/FileSnapshot.d.ts.map +1 -1
  93. package/dist/core/FileSnapshot.js +8 -5
  94. package/dist/core/FileSnapshot.js.map +1 -1
  95. package/dist/core/KillHandler.d.ts.map +1 -1
  96. package/dist/core/KillHandler.js +7 -0
  97. package/dist/core/KillHandler.js.map +1 -1
  98. package/dist/core/LiveSubscription.d.ts +1 -0
  99. package/dist/core/LiveSubscription.d.ts.map +1 -1
  100. package/dist/core/LiveSubscription.js +3 -2
  101. package/dist/core/LiveSubscription.js.map +1 -1
  102. package/dist/core/LiveSubscriptions.d.ts +4 -1
  103. package/dist/core/LiveSubscriptions.d.ts.map +1 -1
  104. package/dist/core/LiveSubscriptions.js +42 -1
  105. package/dist/core/LiveSubscriptions.js.map +1 -1
  106. package/dist/core/LogBody.d.ts.map +1 -1
  107. package/dist/core/LogBody.js +22 -19
  108. package/dist/core/LogBody.js.map +1 -1
  109. package/dist/core/LogVisibility.d.ts +1 -1
  110. package/dist/core/LogVisibility.d.ts.map +1 -1
  111. package/dist/core/LogVisibility.js +4 -6
  112. package/dist/core/LogVisibility.js.map +1 -1
  113. package/dist/core/LogWriter.d.ts.map +1 -1
  114. package/dist/core/LogWriter.js +6 -9
  115. package/dist/core/LogWriter.js.map +1 -1
  116. package/dist/core/LoopDriver.d.ts +4 -4
  117. package/dist/core/LoopDriver.d.ts.map +1 -1
  118. package/dist/core/LoopDriver.js +4 -5
  119. package/dist/core/LoopDriver.js.map +1 -1
  120. package/dist/core/LoopLifecycle.d.ts +2 -0
  121. package/dist/core/LoopLifecycle.d.ts.map +1 -1
  122. package/dist/core/LoopLifecycle.js +13 -3
  123. package/dist/core/LoopLifecycle.js.map +1 -1
  124. package/dist/core/LoopLifecycle.sql +4 -4
  125. package/dist/core/LoopOutcome.d.ts.map +1 -1
  126. package/dist/core/LoopOutcome.js +2 -2
  127. package/dist/core/LoopOutcome.js.map +1 -1
  128. package/dist/core/MembershipMaterialization.d.ts.map +1 -1
  129. package/dist/core/MembershipMaterialization.js +29 -29
  130. package/dist/core/MembershipMaterialization.js.map +1 -1
  131. package/dist/core/MessageResources.d.ts +5 -1
  132. package/dist/core/MessageResources.d.ts.map +1 -1
  133. package/dist/core/MessageResources.js +12 -0
  134. package/dist/core/MessageResources.js.map +1 -1
  135. package/dist/core/MessageResources.sql +8 -0
  136. package/dist/core/MutationEffects.d.ts +1 -0
  137. package/dist/core/MutationEffects.d.ts.map +1 -1
  138. package/dist/core/MutationEffects.js +14 -10
  139. package/dist/core/MutationEffects.js.map +1 -1
  140. package/dist/core/OperationHistory.d.ts.map +1 -1
  141. package/dist/core/OperationHistory.js +4 -3
  142. package/dist/core/OperationHistory.js.map +1 -1
  143. package/dist/core/OperatorConfig.d.ts.map +1 -1
  144. package/dist/core/OperatorConfig.js +3 -2
  145. package/dist/core/OperatorConfig.js.map +1 -1
  146. package/dist/core/PacketBuilder.d.ts +1 -1
  147. package/dist/core/PacketBuilder.d.ts.map +1 -1
  148. package/dist/core/PacketBuilder.js +7 -5
  149. package/dist/core/PacketBuilder.js.map +1 -1
  150. package/dist/core/ProblemLog.d.ts +2 -5
  151. package/dist/core/ProblemLog.d.ts.map +1 -1
  152. package/dist/core/ProblemLog.js +2 -3
  153. package/dist/core/ProblemLog.js.map +1 -1
  154. package/dist/core/ProposalLifecycle.d.ts +12 -11
  155. package/dist/core/ProposalLifecycle.d.ts.map +1 -1
  156. package/dist/core/ProposalLifecycle.js +92 -84
  157. package/dist/core/ProposalLifecycle.js.map +1 -1
  158. package/dist/core/ReasoningEvent.d.ts +2 -0
  159. package/dist/core/ReasoningEvent.d.ts.map +1 -1
  160. package/dist/core/ReplyMetadata.d.ts.map +1 -1
  161. package/dist/core/ReplyMetadata.js +4 -3
  162. package/dist/core/ReplyMetadata.js.map +1 -1
  163. package/dist/core/ResourceBindings.d.ts +2 -2
  164. package/dist/core/ResourceBindings.d.ts.map +1 -1
  165. package/dist/core/ResourceBindings.js.map +1 -1
  166. package/dist/core/ResourceMutations.d.ts +1 -1
  167. package/dist/core/ResourceMutations.d.ts.map +1 -1
  168. package/dist/core/ResourceMutations.js +1 -2
  169. package/dist/core/ResourceMutations.js.map +1 -1
  170. package/dist/core/ResourceSelector.js +2 -2
  171. package/dist/core/ResourceSelector.js.map +1 -1
  172. package/dist/core/ResourceTransfers.d.ts.map +1 -1
  173. package/dist/core/ResourceTransfers.js +162 -120
  174. package/dist/core/ResourceTransfers.js.map +1 -1
  175. package/dist/core/SchemeRegistry.d.ts +6 -5
  176. package/dist/core/SchemeRegistry.d.ts.map +1 -1
  177. package/dist/core/SchemeRegistry.js +32 -26
  178. package/dist/core/SchemeRegistry.js.map +1 -1
  179. package/dist/core/ServiceHelp.d.ts.map +1 -1
  180. package/dist/core/ServiceHelp.js +2 -1
  181. package/dist/core/ServiceHelp.js.map +1 -1
  182. package/dist/core/StoredPacket.d.ts.map +1 -1
  183. package/dist/core/StoredPacket.js +26 -19
  184. package/dist/core/StoredPacket.js.map +1 -1
  185. package/dist/core/StrikeRail.d.ts +1 -2
  186. package/dist/core/StrikeRail.d.ts.map +1 -1
  187. package/dist/core/StrikeRail.js +4 -4
  188. package/dist/core/StrikeRail.js.map +1 -1
  189. package/dist/core/TerminalResult.d.ts +0 -2
  190. package/dist/core/TerminalResult.d.ts.map +1 -1
  191. package/dist/core/TerminalResult.js +0 -18
  192. package/dist/core/TerminalResult.js.map +1 -1
  193. package/dist/core/ToolInputSchema.d.ts.map +1 -1
  194. package/dist/core/ToolInputSchema.js +2 -2
  195. package/dist/core/ToolInputSchema.js.map +1 -1
  196. package/dist/core/ToolResources.d.ts +1 -0
  197. package/dist/core/ToolResources.d.ts.map +1 -1
  198. package/dist/core/ToolResources.js +7 -6
  199. package/dist/core/ToolResources.js.map +1 -1
  200. package/dist/core/TurnDispositionHandler.d.ts +1 -1
  201. package/dist/core/TurnDispositionHandler.d.ts.map +1 -1
  202. package/dist/core/TurnDispositionHandler.js +0 -1
  203. package/dist/core/TurnDispositionHandler.js.map +1 -1
  204. package/dist/core/TurnMaterialization.d.ts.map +1 -1
  205. package/dist/core/TurnMaterialization.js +3 -2
  206. package/dist/core/TurnMaterialization.js.map +1 -1
  207. package/dist/core/TurnRunner.d.ts +13 -12
  208. package/dist/core/TurnRunner.d.ts.map +1 -1
  209. package/dist/core/TurnRunner.js +197 -173
  210. package/dist/core/TurnRunner.js.map +1 -1
  211. package/dist/core/TurnRunner.sql +3 -3
  212. package/dist/core/WorkerOwners.js.map +1 -1
  213. package/dist/core/caps/DbEntryCaps.js.map +1 -1
  214. package/dist/core/caps/DbMessageCaps.d.ts +3 -3
  215. package/dist/core/caps/DbMessageCaps.d.ts.map +1 -1
  216. package/dist/core/caps/DbProjectionCaps.js +1 -1
  217. package/dist/core/caps/DbProjectionCaps.js.map +1 -1
  218. package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -1
  219. package/dist/core/caps/DbSubscriptionCaps.js +1 -0
  220. package/dist/core/caps/DbSubscriptionCaps.js.map +1 -1
  221. package/dist/core/caps/SchemeCtxImpl.d.ts +1 -0
  222. package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -1
  223. package/dist/core/caps/SchemeCtxImpl.js +10 -1
  224. package/dist/core/caps/SchemeCtxImpl.js.map +1 -1
  225. package/dist/core/env-catalog.js.map +1 -1
  226. package/dist/core/env-defaults.d.ts.map +1 -1
  227. package/dist/core/env-defaults.js +5 -3
  228. package/dist/core/env-defaults.js.map +1 -1
  229. package/dist/core/file-creation-policy.d.ts.map +1 -1
  230. package/dist/core/file-creation-policy.js +2 -1
  231. package/dist/core/file-creation-policy.js.map +1 -1
  232. package/dist/core/file-materialization.d.ts.map +1 -1
  233. package/dist/core/file-materialization.js +9 -11
  234. package/dist/core/file-materialization.js.map +1 -1
  235. package/dist/core/git-env.d.ts +1 -0
  236. package/dist/core/git-env.d.ts.map +1 -1
  237. package/dist/core/git-env.js +34 -3
  238. package/dist/core/git-env.js.map +1 -1
  239. package/dist/core/git-membership.d.ts +8 -0
  240. package/dist/core/git-membership.d.ts.map +1 -1
  241. package/dist/core/git-membership.js +107 -21
  242. package/dist/core/git-membership.js.map +1 -1
  243. package/dist/core/git-state.d.ts.map +1 -1
  244. package/dist/core/git-state.js +1 -0
  245. package/dist/core/git-state.js.map +1 -1
  246. package/dist/core/notifications.d.ts +5 -0
  247. package/dist/core/notifications.d.ts.map +1 -1
  248. package/dist/core/packet-wire.d.ts +26 -21
  249. package/dist/core/packet-wire.d.ts.map +1 -1
  250. package/dist/core/packet-wire.js +150 -112
  251. package/dist/core/packet-wire.js.map +1 -1
  252. package/dist/core/plurnk-uri.d.ts +1 -1
  253. package/dist/core/plurnk-uri.d.ts.map +1 -1
  254. package/dist/core/plurnk-uri.js +6 -5
  255. package/dist/core/plurnk-uri.js.map +1 -1
  256. package/dist/core/results.d.ts +9 -4
  257. package/dist/core/results.d.ts.map +1 -1
  258. package/dist/core/results.js +14 -1
  259. package/dist/core/results.js.map +1 -1
  260. package/dist/core/runtime-floor.d.ts +8 -0
  261. package/dist/core/runtime-floor.d.ts.map +1 -0
  262. package/dist/core/runtime-floor.js +40 -0
  263. package/dist/core/runtime-floor.js.map +1 -0
  264. package/dist/core/runtime-guard.d.ts +2 -0
  265. package/dist/core/runtime-guard.d.ts.map +1 -0
  266. package/dist/core/runtime-guard.js +5 -0
  267. package/dist/core/runtime-guard.js.map +1 -0
  268. package/dist/core/scheme-types.d.ts +20 -0
  269. package/dist/core/scheme-types.d.ts.map +1 -1
  270. package/dist/core/sqlite-synchronous.d.ts +1 -1
  271. package/dist/core/sqlite-synchronous.d.ts.map +1 -1
  272. package/dist/core/sqlite-synchronous.js.map +1 -1
  273. package/dist/core/statement-primary.d.ts +2 -2
  274. package/dist/core/statement-primary.d.ts.map +1 -1
  275. package/dist/core/statement-primary.js.map +1 -1
  276. package/dist/core/workspace-settings.js +1 -1
  277. package/dist/core/workspace-settings.js.map +1 -1
  278. package/dist/evidence/EvidenceReader.d.ts.map +1 -1
  279. package/dist/evidence/EvidenceReader.js +20 -6
  280. package/dist/evidence/EvidenceReader.js.map +1 -1
  281. package/dist/launch/Launch.d.ts +1 -0
  282. package/dist/launch/Launch.d.ts.map +1 -1
  283. package/dist/launch/Launch.js +28 -12
  284. package/dist/launch/Launch.js.map +1 -1
  285. package/dist/man/plurnk-service.1 +12 -2
  286. package/dist/schemes/EffectPolicy.js +1 -1
  287. package/dist/schemes/EffectPolicy.js.map +1 -1
  288. package/dist/schemes/Env.d.ts +1 -1
  289. package/dist/schemes/Env.d.ts.map +1 -1
  290. package/dist/schemes/Env.js +7 -1
  291. package/dist/schemes/Env.js.map +1 -1
  292. package/dist/schemes/Exec.d.ts +10 -12
  293. package/dist/schemes/Exec.d.ts.map +1 -1
  294. package/dist/schemes/Exec.js +337 -437
  295. package/dist/schemes/Exec.js.map +1 -1
  296. package/dist/schemes/ExecOutputScheme.d.ts +4 -6
  297. package/dist/schemes/ExecOutputScheme.d.ts.map +1 -1
  298. package/dist/schemes/ExecOutputScheme.js +17 -17
  299. package/dist/schemes/ExecOutputScheme.js.map +1 -1
  300. package/dist/schemes/ExecScheduler.d.ts.map +1 -1
  301. package/dist/schemes/ExecScheduler.js +1 -2
  302. package/dist/schemes/ExecScheduler.js.map +1 -1
  303. package/dist/schemes/ExecutionInput.js +3 -3
  304. package/dist/schemes/ExecutionInput.js.map +1 -1
  305. package/dist/schemes/File.d.ts +3 -18
  306. package/dist/schemes/File.d.ts.map +1 -1
  307. package/dist/schemes/File.js +148 -84
  308. package/dist/schemes/File.js.map +1 -1
  309. package/dist/schemes/Log.d.ts.map +1 -1
  310. package/dist/schemes/Log.js +193 -161
  311. package/dist/schemes/Log.js.map +1 -1
  312. package/dist/schemes/QuestionTool.d.ts.map +1 -1
  313. package/dist/schemes/QuestionTool.js +6 -8
  314. package/dist/schemes/QuestionTool.js.map +1 -1
  315. package/dist/schemes/ResourceTreeScheme.d.ts.map +1 -1
  316. package/dist/schemes/ResourceTreeScheme.js +2 -2
  317. package/dist/schemes/ResourceTreeScheme.js.map +1 -1
  318. package/dist/schemes/TurnSource.js +3 -3
  319. package/dist/schemes/TurnSource.js.map +1 -1
  320. package/dist/schemes/Worker.js.map +1 -1
  321. package/dist/schemes/_entry-crud.d.ts.map +1 -1
  322. package/dist/schemes/_entry-crud.js +4 -2
  323. package/dist/schemes/_entry-crud.js.map +1 -1
  324. package/dist/schemes/_entry-find.d.ts +2 -1
  325. package/dist/schemes/_entry-find.d.ts.map +1 -1
  326. package/dist/schemes/_entry-find.js +241 -130
  327. package/dist/schemes/_entry-find.js.map +1 -1
  328. package/dist/schemes/_entry-manifest.js +1 -1
  329. package/dist/schemes/_entry-manifest.js.map +1 -1
  330. package/dist/schemes/_entry-ops.js.map +1 -1
  331. package/dist/schemes/_search-index.js.map +1 -1
  332. package/dist/schemes/exec-entry-sink.d.ts +30 -0
  333. package/dist/schemes/exec-entry-sink.d.ts.map +1 -0
  334. package/dist/schemes/exec-entry-sink.js +238 -0
  335. package/dist/schemes/exec-entry-sink.js.map +1 -0
  336. package/dist/schemes/exec-lifetime.d.ts.map +1 -1
  337. package/dist/schemes/exec-lifetime.js +5 -2
  338. package/dist/schemes/exec-lifetime.js.map +1 -1
  339. package/dist/server/ClientOperations.d.ts +45 -0
  340. package/dist/server/ClientOperations.d.ts.map +1 -0
  341. package/dist/server/ClientOperations.js +192 -0
  342. package/dist/server/ClientOperations.js.map +1 -0
  343. package/dist/server/ClientReads.d.ts +13 -5
  344. package/dist/server/ClientReads.d.ts.map +1 -1
  345. package/dist/server/ClientReads.js +108 -21
  346. package/dist/server/ClientReads.js.map +1 -1
  347. package/dist/server/Credentials.js +2 -2
  348. package/dist/server/Credentials.js.map +1 -1
  349. package/dist/server/Daemon.d.ts +40 -28
  350. package/dist/server/Daemon.d.ts.map +1 -1
  351. package/dist/server/Daemon.js +263 -839
  352. package/dist/server/Daemon.js.map +1 -1
  353. package/dist/server/DaemonLock.d.ts +2 -0
  354. package/dist/server/DaemonLock.d.ts.map +1 -1
  355. package/dist/server/DaemonLock.js +10 -1
  356. package/dist/server/DaemonLock.js.map +1 -1
  357. package/dist/server/DaemonModules.d.ts +39 -0
  358. package/dist/server/DaemonModules.d.ts.map +1 -0
  359. package/dist/server/DaemonModules.js +219 -0
  360. package/dist/server/DaemonModules.js.map +1 -0
  361. package/dist/server/DrainSupervisor.d.ts +4 -2
  362. package/dist/server/DrainSupervisor.d.ts.map +1 -1
  363. package/dist/server/DrainSupervisor.js +318 -290
  364. package/dist/server/DrainSupervisor.js.map +1 -1
  365. package/dist/server/EnvFunctionality.d.ts +10 -7
  366. package/dist/server/EnvFunctionality.d.ts.map +1 -1
  367. package/dist/server/EnvFunctionality.js +7 -5
  368. package/dist/server/EnvFunctionality.js.map +1 -1
  369. package/dist/server/Functionality.d.ts +4 -5
  370. package/dist/server/Functionality.d.ts.map +1 -1
  371. package/dist/server/Functionality.js +24 -15
  372. package/dist/server/Functionality.js.map +1 -1
  373. package/dist/server/HttpListener.d.ts.map +1 -1
  374. package/dist/server/HttpListener.js +28 -8
  375. package/dist/server/HttpListener.js.map +1 -1
  376. package/dist/server/MembersFunctionality.d.ts +19 -7
  377. package/dist/server/MembersFunctionality.d.ts.map +1 -1
  378. package/dist/server/MembersFunctionality.js +37 -17
  379. package/dist/server/MembersFunctionality.js.map +1 -1
  380. package/dist/server/MessageDelivery.d.ts +43 -0
  381. package/dist/server/MessageDelivery.d.ts.map +1 -0
  382. package/dist/server/MessageDelivery.js +186 -0
  383. package/dist/server/MessageDelivery.js.map +1 -0
  384. package/dist/server/ModuleHost.d.ts +3 -3
  385. package/dist/server/ModuleHost.d.ts.map +1 -1
  386. package/dist/server/Places.d.ts +19 -0
  387. package/dist/server/Places.d.ts.map +1 -0
  388. package/dist/server/Places.js +76 -0
  389. package/dist/server/Places.js.map +1 -0
  390. package/dist/server/PluginSources.d.ts.map +1 -1
  391. package/dist/server/PluginSources.js +2 -1
  392. package/dist/server/PluginSources.js.map +1 -1
  393. package/dist/server/PlurnkSkill.d.ts.map +1 -1
  394. package/dist/server/PlurnkSkill.js +5 -4
  395. package/dist/server/PlurnkSkill.js.map +1 -1
  396. package/dist/server/Rollback.d.ts.map +1 -1
  397. package/dist/server/Rollback.js +2 -1
  398. package/dist/server/Rollback.js.map +1 -1
  399. package/dist/server/WorkerModels.d.ts +83 -0
  400. package/dist/server/WorkerModels.d.ts.map +1 -0
  401. package/dist/server/WorkerModels.js +500 -0
  402. package/dist/server/WorkerModels.js.map +1 -0
  403. package/dist/server/WorkerOverview.d.ts +22 -0
  404. package/dist/server/WorkerOverview.d.ts.map +1 -0
  405. package/dist/server/WorkerOverview.js +42 -0
  406. package/dist/server/WorkerOverview.js.map +1 -0
  407. package/dist/server/WorkspacePlugins.d.ts +1 -1
  408. package/dist/server/WorkspacePlugins.d.ts.map +1 -1
  409. package/dist/server/WorkspacePlugins.js +0 -1
  410. package/dist/server/WorkspacePlugins.js.map +1 -1
  411. package/dist/server/WorkspaceResidency.d.ts +3 -3
  412. package/dist/server/WorkspaceResidency.d.ts.map +1 -1
  413. package/dist/server/WorkspaceResidency.js.map +1 -1
  414. package/dist/server/client-input.d.ts +2 -2
  415. package/dist/server/client-input.d.ts.map +1 -1
  416. package/dist/server/client-input.js +19 -12
  417. package/dist/server/client-input.js.map +1 -1
  418. package/dist/server/envelope.d.ts +4 -1
  419. package/dist/server/envelope.d.ts.map +1 -1
  420. package/dist/server/envelope.js +7 -3
  421. package/dist/server/envelope.js.map +1 -1
  422. package/dist/server/envelope.sql +10 -6
  423. package/dist/server/logEntry.d.ts +38 -1
  424. package/dist/server/logEntry.d.ts.map +1 -1
  425. package/dist/server/logEntry.js +9 -9
  426. package/dist/server/logEntry.js.map +1 -1
  427. package/dist/server/logEntry.sql +4 -2
  428. package/dist/server/loopDocs.d.ts.map +1 -1
  429. package/dist/server/loopDocs.js +11 -2
  430. package/dist/server/loopDocs.js.map +1 -1
  431. package/dist/server/module-discovery.d.ts +2 -3
  432. package/dist/server/module-discovery.d.ts.map +1 -1
  433. package/dist/server/module-discovery.js +6 -6
  434. package/dist/server/module-discovery.js.map +1 -1
  435. package/dist/server/places.sql +83 -0
  436. package/dist/server/seam-loop.sql +8 -0
  437. package/dist/server/worker-overview.sql +50 -0
  438. package/dist/service.d.ts +1 -0
  439. package/dist/service.d.ts.map +1 -1
  440. package/dist/service.js +35 -9
  441. package/dist/service.js.map +1 -1
  442. package/docs/members.md +31 -33
  443. package/migrations/033_hidden_places.sql +10 -0
  444. package/package.json +48 -57
  445. package/dist/observe/init.d.ts +0 -8
  446. package/dist/observe/init.d.ts.map +0 -1
  447. package/dist/observe/init.js +0 -163
  448. package/dist/observe/init.js.map +0 -1
  449. package/dist/server/WorkerModelResolver.d.ts +0 -20
  450. package/dist/server/WorkerModelResolver.d.ts.map +0 -1
  451. package/dist/server/WorkerModelResolver.js +0 -200
  452. package/dist/server/WorkerModelResolver.js.map +0 -1
@@ -7,7 +7,7 @@
7
7
  // Format and omission rules are owned by {§packet-markdown}. Section producers
8
8
  // supply names and typed content; this projection preserves their ordered evidence.
9
9
  import { relative, sep } from "node:path";
10
- import { Problems, Validator } from "@plurnk/plurnk-contracts";
10
+ import { Problems, Validator, isRecord, isSafeInteger, isExecutionOp } from "@plurnk/plurnk-contracts";
11
11
  import { TextCoordinates } from "@plurnk/plurnk-mimetypes";
12
12
  import BodyPreview from "../content/body-preview.js";
13
13
  import { renderAuthoredTarget, renderTarget } from "./plurnk-uri.js";
@@ -21,7 +21,6 @@ import { Results as SchemeResults } from "@plurnk/plurnk-schemes";
21
21
  import { assertEditReceipt, assertResourceEffects, LineAnchors, } from "../content/index.js";
22
22
  // {§packet-attachment-parts} — the attachment kinds and their readout weights live in one table.
23
23
  import { audioWeight, imageWeight, pdfWeight } from "./attachments.js";
24
- import { isExecutionOp } from "@plurnk/plurnk-contracts";
25
24
  export default class PacketWire {
26
25
  // {§packet-markdown} Render the sections in `slot` to one ChatMessage.content
27
26
  // string. Sections render in list order; empties are omitted (no empty headers on the wire);
@@ -47,17 +46,13 @@ export default class PacketWire {
47
46
  // Durable operation failures render as `{status, path}` JSON pointers to the log rows that
48
47
  // own their exact RFC 9457 results.
49
48
  static renderFailurePointers(failures) {
50
- const rows = Array.isArray(failures) ? failures : [];
51
- const pointers = rows
52
- .filter((row) => typeof row.status === "number" && typeof row.coordinate === "string")
53
- .map((row) => JSON.stringify({ status: row.status, path: `log:///${row.coordinate}` }));
49
+ const pointers = failures.map((row) => JSON.stringify({ status: row.status, path: `log:///${row.coordinate}` }));
54
50
  return pointers.length === 0 ? "" : `[${pointers.join(",\n")}]`;
55
51
  }
56
52
  // {§notice-callout} — non-terminal observations, deliberately separate from operation failures, in the
57
53
  // card's own callout form: the level picks the callout, the directive leads, the fact follows, the kind closes.
58
54
  static renderNotices(notices) {
59
- const observations = Array.isArray(notices) ? notices : [];
60
- return observations.map((notice) => {
55
+ return notices.map((notice) => {
61
56
  const kind = typeof notice.kind === "string" ? notice.kind : "notice";
62
57
  const callout = notice.level === "error" ? "CAUTION" : notice.level === "warn" ? "WARNING" : "NOTE";
63
58
  const text = [notice.directive, notice.message]
@@ -82,8 +77,7 @@ export default class PacketWire {
82
77
  return `{"workers":${PacketWire.#pointers(workers)},\n"streams":${PacketWire.#pointers(streams)},\n"messages":${PacketWire.#pointers(messages)}}`;
83
78
  }
84
79
  static #pointers(rows) {
85
- const items = Array.isArray(rows) ? rows : [];
86
- const pointers = items.map((r) => JSON.stringify({
80
+ const pointers = rows.map((r) => JSON.stringify({
87
81
  status: r.status,
88
82
  path: r.path,
89
83
  ...(typeof r.detail === "string" && r.detail.length > 0 ? { detail: r.detail } : {}),
@@ -97,7 +91,7 @@ export default class PacketWire {
97
91
  }
98
92
  // The git section content: the working-tree summary. "" when absent.
99
93
  static renderGit(git) {
100
- const status = git === null || git === undefined ? "" : PacketWire.#renderGitState(git);
94
+ const status = git === null ? "" : PacketWire.#renderGitState(git);
101
95
  return status.length === 0 ? "" : `> [!NOTE]\n${status.split("\n").map((line) => `> ${line}`).join("\n")}`;
102
96
  }
103
97
  // The log section's content: the model's curated rows as Markdown-framed records ({§log-wire-format}).
@@ -109,10 +103,9 @@ export default class PacketWire {
109
103
  // {§context-gauge} — the wire row and its reclaimable-body accounting come from one render
110
104
  // pass; packet assembly never re-parses its text.
111
105
  static renderLogWithAccounting(entries, weighContent, options = {}) {
112
- const log = Array.isArray(entries) ? entries : [];
113
- if (log.length === 0)
106
+ if (entries.length === 0)
114
107
  return { content: "", records: [], curationTargets: [], attachments: [], bodied: [] };
115
- const rows = PacketWire.#renderLogEntries(log, weighContent, options);
108
+ const rows = PacketWire.#renderLogEntries(entries, weighContent, options);
116
109
  const records = rows.map(({ content }) => content);
117
110
  return {
118
111
  content: records.join("\n\n"),
@@ -236,7 +229,7 @@ export default class PacketWire {
236
229
  }
237
230
  // {§log-wire-format} Orientation precedes telemetry on every receipt.
238
231
  static #canonicalJson(obj) {
239
- return JSON.stringify(Object.fromEntries(Object.keys(obj).sort().map((key) => [key, obj[key]])));
232
+ return JSON.stringify(Object.fromEntries(Object.keys(obj).toSorted().map((key) => [key, obj[key]])));
240
233
  }
241
234
  static #receiptMeta(value) {
242
235
  const receipt = assertEditReceipt(value);
@@ -317,7 +310,7 @@ export default class PacketWire {
317
310
  if (e.op !== "SEND" || e.origin !== "_plurnk")
318
311
  return false;
319
312
  const attrs = typeof e.attrs === "string" ? JSON.parse(e.attrs) : e.attrs;
320
- return attrs !== null && typeof attrs === "object" && attrs.kind === "message";
313
+ return isRecord(attrs) && attrs.kind === "message";
321
314
  }
322
315
  // {§markerless-first-page} — a body the model did not author or ask for exactly takes its first page in
323
316
  // the packet: not the model's own row, not a retrieval (paged at its source), not an emission row,
@@ -412,7 +405,8 @@ export default class PacketWire {
412
405
  return entries.map((e, index) => {
413
406
  const identity = PacketWire.#rowIdentity(e, options);
414
407
  // Parse rx once — reused for the matcher/items enrichment and the body.
415
- const rx = (typeof e.rx === "string" ? PacketWire.#safeParse(e.rx) : e.rx);
408
+ const parsedRx = typeof e.rx === "string" ? PacketWire.#safeParse(e.rx) : e.rx;
409
+ const rx = isRecord(parsedRx) ? parsedRx : null;
416
410
  const facts = PacketWire.#rowResultFacts(identity, e, rx, bodies[index]);
417
411
  const paired = options.paired?.has(String(e.coordinate)) ?? false;
418
412
  const projected = paired && bodies[index].provenance === "authored"
@@ -423,22 +417,23 @@ export default class PacketWire {
423
417
  }
424
418
  static #attrsOf(e) {
425
419
  const attrs = typeof e.attrs === "string" ? PacketWire.#safeParse(e.attrs) : e.attrs;
426
- return attrs !== null && typeof attrs === "object" && !Array.isArray(attrs) ? attrs : {};
420
+ return isRecord(attrs) ? attrs : {};
427
421
  }
428
422
  // One stored log row as the renderer sees it: the durable columns decoded once, a transient
429
423
  // open row rendered open ({§invalid-emission-attempts}).
430
424
  static entryView(r, transientOpenLogEntryId = null) {
431
- const tx = (r.mimetype_tx === "application/json" ? JSON.parse(r.tx) : r.tx);
425
+ const parsedTx = r.mimetype_tx === "application/json" ? JSON.parse(r.tx) : r.tx;
426
+ const tx = isRecord(parsedTx) ? parsedTx : typeof parsedTx === "string" ? parsedTx : null;
432
427
  const rx = r.mimetype_rx === "application/json" ? JSON.parse(r.rx) : r.rx;
433
428
  // {§context-fit} — a READ row's anchors ride with its lines whatever its status: a receipt that
434
429
  // carries a prefix carries the prefix's anchors.
435
- const readResult = LogEntryProjection.op(r) === "READ" && rx !== null && typeof rx === "object" && typeof rx.content === "string";
436
- const rawLineAnchors = readResult && Object.hasOwn(rx, "lineAnchors") ? rx.lineAnchors : undefined;
437
- if (rawLineAnchors !== undefined && !Array.isArray(rawLineAnchors)) {
438
- throw new TypeError("A READ result's lineAnchors field must be an array.");
430
+ const readResult = LogEntryProjection.op(r) === "READ" && isRecord(rx) && typeof rx.content === "string" ? rx : null;
431
+ const rawLineAnchors = readResult !== null && Object.hasOwn(readResult, "lineAnchors") ? readResult.lineAnchors : undefined;
432
+ if (rawLineAnchors !== undefined && !(Array.isArray(rawLineAnchors) && rawLineAnchors.every((anchor) => typeof anchor === "string"))) {
433
+ throw new TypeError("A READ result's lineAnchors field must be an array of strings.");
439
434
  }
440
435
  const lineAnchors = rawLineAnchors;
441
- const rawLineNumberWidth = readResult && Object.hasOwn(rx, "lineNumberWidth") ? rx.lineNumberWidth : undefined;
436
+ const rawLineNumberWidth = readResult !== null && Object.hasOwn(readResult, "lineNumberWidth") ? readResult.lineNumberWidth : undefined;
442
437
  if (rawLineNumberWidth !== undefined && !LineAnchors.isLineNumberWidth(rawLineNumberWidth)) {
443
438
  throw new TypeError("A READ result's lineNumberWidth field must be a valid decimal line width.");
444
439
  }
@@ -502,16 +497,16 @@ export default class PacketWire {
502
497
  // subsystem token when present; absence means the owning worker.
503
498
  // {§message-short-identity} an arrival whose source is the transport's own name for it adds
504
499
  // nothing to its address; a peer's or an agent's source still shows.
505
- const arrivalAttrs = typeof e.attrs === "string" ? PacketWire.#safeParse(e.attrs) : e.attrs;
506
- const selfAddressed = arrivalAttrs !== null && typeof arrivalAttrs === "object" && arrivalAttrs.selfAddressed === true;
500
+ const attrs = PacketWire.#attrsOf(e);
501
+ const selfAddressed = attrs.selfAddressed === true;
507
502
  if (typeof e.source === "string" && e.source.length > 0 && !selfAddressed)
508
503
  meta.source = e.source;
509
504
  // {§message-causal-source}: every other sender has an address; the operator's message is named
510
505
  // for the model, or it reads as the model's own SEND.
511
506
  if (PacketWire.isArrival(e) && meta.source === undefined)
512
507
  meta.origin = "user";
513
- if (e.source === "file" && e.attrs !== null && typeof e.attrs === "object" && "git" in e.attrs) {
514
- const git = e.attrs.git;
508
+ if (e.source === "file" && Object.hasOwn(attrs, "git")) {
509
+ const git = attrs.git;
515
510
  if (typeof git !== "string" || git.length !== 2) {
516
511
  throw new TypeError("A source=file log row carries malformed Git XY metadata.");
517
512
  }
@@ -520,19 +515,20 @@ export default class PacketWire {
520
515
  // {§log-wire-format}: routine success is implicit, independently of the operation.
521
516
  if (typeof e.status === "number" && e.status !== 200)
522
517
  meta.status = e.status;
523
- const tx = (typeof e.tx === "string" ? PacketWire.#safeParse(e.tx) : e.tx);
518
+ const parsedTx = typeof e.tx === "string" ? PacketWire.#safeParse(e.tx) : e.tx;
519
+ const tx = isRecord(parsedTx) ? parsedTx : null;
524
520
  const replay = options.paired?.get(String(e.coordinate));
525
521
  const paired = replay !== undefined;
526
522
  if (!paired && typeof tx?.aside === "string")
527
523
  meta.aside = tx.aside;
528
- const authored = tx?.target;
529
- const target = PacketWire.#operandPath(e.target ?? authored, options.projectRoot ?? null, authored ?? null);
524
+ const authored = PacketWire.#authoredPath(tx?.target);
525
+ const target = PacketWire.#operandPath(e.target ?? PacketWire.#actionTarget(tx?.target), options.projectRoot ?? null, authored);
530
526
  const pair = op === "COPY" || op === "MOVE";
531
527
  const selections = pair
532
- ? [tx?.source, tx?.destination]
528
+ ? [PacketWire.#selection(tx?.source), PacketWire.#selection(tx?.destination)]
533
529
  : [{ ...tx, target: e.target ?? tx?.target }];
534
- const paths = selections.map((selection) => PacketWire.#operandPath(selection?.target, options.projectRoot ?? null, authored ?? null));
535
- if (pair && typeof e.status === "number" && e.status < 400 && paths.some((path) => path === null)) {
530
+ const paths = selections.map((selection) => PacketWire.#operandPath(PacketWire.#actionTarget(selection?.target), options.projectRoot ?? null, authored));
531
+ if (pair && typeof e.status === "number" && e.status < 400 && paths.some((candidate) => candidate === null)) {
536
532
  throw new Error(`A successful ${op} log row must retain both operand selections.`);
537
533
  }
538
534
  for (const field of ["scope", "metadata"]) {
@@ -540,45 +536,39 @@ export default class PacketWire {
540
536
  continue;
541
537
  const values = selections.map((selection) => field === "scope"
542
538
  ? PacketWire.#requestScope(selection?.lineMarker)
543
- : selection?.metadata?.length ? selection.metadata : null);
539
+ : PacketWire.#metadata(selection?.metadata));
544
540
  if (pair) {
545
- const paired = Object.fromEntries(values.flatMap((value, index) => value === null ? [] : [[index === 0 ? "from" : "to", value]]));
546
- if (Object.keys(paired).length > 0)
547
- meta[field] = paired;
541
+ const pairedValues = Object.fromEntries(values.flatMap((value, index) => value === null ? [] : [[index === 0 ? "from" : "to", value]]));
542
+ if (Object.keys(pairedValues).length > 0)
543
+ meta[field] = pairedValues;
548
544
  }
549
545
  else if (values[0] !== null)
550
546
  meta[field] = values[0];
551
547
  }
552
548
  // {§log-wire-format}: describe resources and patterns directly; never serialize an OP.
553
549
  const parts = selections.flatMap((selection, index) => {
554
- const pattern = selection?.matcher?.raw;
550
+ const matcher = selection?.matcher;
551
+ const pattern = isRecord(matcher) ? matcher.raw : undefined;
555
552
  return [
556
553
  ...(paths[index] === null ? [] : [`→ ${paths[index]}`]),
557
554
  ...(typeof pattern !== "string" || pattern.length === 0 ? []
558
555
  : [/[\r\n]/u.test(pattern) ? JSON.stringify(pattern) : pattern]),
559
556
  ];
560
557
  });
561
- const request = replay?.statement;
562
- const requestedSelections = request === undefined ? [] : request.op === "COPY" || request.op === "MOVE"
563
- ? [request.source, request.destination] : [request];
564
- const resolved = paired && paths.some((path, index) => {
565
- const selection = requestedSelections[index];
566
- const requested = selection !== undefined && "target" in selection ? selection.target : null;
567
- return path !== PacketWire.#operandPath(requested, options.projectRoot ?? null, requested);
568
- });
558
+ // {§paired-receipt}: every receipt names its operand; a paired one leaves its pattern to the replayed operation.
559
+ const operands = paths.filter((candidate) => candidate !== null).map((candidate) => `→ ${candidate}`).join(" ");
569
560
  const description = op === "error" || op === "extension" || parts.length === 0 ? null
570
- : !paired ? parts.join(" ") : resolved ? paths.filter((path) => path !== null).map((path) => `→ ${path}`).join(" ") : null;
561
+ : !paired ? parts.join(" ") : operands.length > 0 ? operands : null;
571
562
  // {§worker-auto-name} The created identity is an outcome, not an authored target.
572
- if ((op === "WORK" || op === "FORK") && e.attrs !== null && typeof e.attrs === "object"
573
- && typeof e.attrs.worker === "string") {
574
- meta.worker = e.attrs.worker;
563
+ if ((op === "WORK" || op === "FORK") && typeof attrs.worker === "string") {
564
+ meta.worker = attrs.worker;
575
565
  // {§worker-scheme-spawn} — a WORK that reached a worker the name already held says so.
576
- if (e.attrs.delivered === "message")
566
+ if (attrs.delivered === "message")
577
567
  meta.delivered = "message";
578
568
  }
579
569
  // {§worker-wait-timing} — the accepted bound, not elapsed time or the current configuration.
580
- if (op === "WAIT" && e.attrs !== null && typeof e.attrs === "object" && "waiting" in e.attrs) {
581
- const seconds = e.attrs.waiting;
570
+ if (op === "WAIT" && Object.hasOwn(attrs, "waiting")) {
571
+ const seconds = attrs.waiting;
582
572
  if (typeof seconds !== "number" || !Number.isFinite(seconds) || seconds < 0) {
583
573
  throw new TypeError("A WAIT receipt carries a malformed waiting bound.");
584
574
  }
@@ -588,21 +578,21 @@ export default class PacketWire {
588
578
  // `stream` link, distinct from the runtime-owned invocation target.
589
579
  // {§exec-target-routing} {§fs-namespace} — the receipt names the working directory only
590
580
  // when it is not the project root, and then in project-relative form.
591
- if (isExecutionOp(op) && e.attrs !== null && typeof e.attrs === "object" && typeof e.attrs.cwd === "string") {
592
- const cwd = PacketWire.#projectRelativeCwd(e.attrs.cwd, options.projectRoot ?? null);
581
+ if (isExecutionOp(op) && typeof attrs.cwd === "string") {
582
+ const cwd = PacketWire.#projectRelativeCwd(attrs.cwd, options.projectRoot ?? null);
593
583
  if (cwd !== null)
594
584
  meta.cwd = cwd;
595
585
  }
596
- if (isExecutionOp(op) && e.attrs !== null && typeof e.attrs === "object" && typeof e.attrs.stream === "string") {
597
- meta.stream = e.attrs.stream;
586
+ if (isExecutionOp(op) && typeof attrs.stream === "string") {
587
+ meta.stream = attrs.stream;
598
588
  }
599
589
  return { meta, op, tx, coordinate, path, renderedLeaf, target, description };
600
590
  }
601
- // The row's result facts from its rx: the terminal stream's exit, the Problem or detail, the
602
- // matcher, the retrieval extents, and the structured mutation receipts. Returns what the body
603
- // projection needs to know about the result.
591
+ // The row's result facts from its rx, added to the metadata line stage by stage: the attachments and the
592
+ // returned address, the terminal stream's exit, the Problem or detail, the retrieval extents, and the
593
+ // structured mutation receipts. Returns what the body projection needs to know about the result.
604
594
  static #rowResultFacts(identity, e, rx, fullBody) {
605
- const { meta, op, tx } = identity;
595
+ const { meta, op } = identity;
606
596
  if (op === "SEND" && rx !== null && typeof rx === "object" && Array.isArray(rx.attachments) && rx.attachments.length > 0) {
607
597
  meta.attachments = rx.attachments.map(({ name, mediaType, target }) => ({ name, mediaType, path: target }));
608
598
  }
@@ -611,8 +601,19 @@ export default class PacketWire {
611
601
  && rx.resource.length > 0 && rx.resource !== identity.target && rx.resource !== meta.stream) {
612
602
  meta.resource = rx.resource;
613
603
  }
614
- // {§exec-stream}: explicit and automatic READs preserve the same
615
- // durable liveness facts, including an empty active channel.
604
+ PacketWire.#streamReadFacts(meta, op, rx);
605
+ PacketWire.#problemFacts(identity, e, rx);
606
+ const { findItems, range } = PacketWire.#retrievalFacts(identity, e, rx, fullBody);
607
+ const structuredMutationReceipt = PacketWire.#mutationReceiptFacts(meta, op, rx);
608
+ return {
609
+ findItems, range, structuredMutationReceipt,
610
+ ...(op === "READ" && rx?.matches !== undefined
611
+ ? { matches: SchemeResults.assertMatchEvidenceList(rx.matches) } : {}),
612
+ };
613
+ }
614
+ // {§exec-stream}: explicit and automatic READs preserve the same
615
+ // durable liveness facts, including an empty active channel.
616
+ static #streamReadFacts(meta, op, rx) {
616
617
  if (op === "READ" && rx !== null && typeof rx === "object" && Object.hasOwn(rx, "terminal")) {
617
618
  if (typeof rx.terminal !== "boolean") {
618
619
  throw new TypeError("A stream READ result carries a malformed terminal flag.");
@@ -627,36 +628,39 @@ export default class PacketWire {
627
628
  // {§executor-page-receipt} — a producer's full-page fact survives projection as written.
628
629
  if (Object.hasOwn(rx, "page")) {
629
630
  const page = rx.page;
630
- if (page === null || typeof page !== "object" || !Number.isSafeInteger(page.size) || !Number.isSafeInteger(page.returned)) {
631
+ if (!isRecord(page) || !isSafeInteger(page.size) || !isSafeInteger(page.returned)) {
631
632
  throw new TypeError("A stream READ result carries a malformed page.");
632
633
  }
633
634
  meta.page = { size: page.size, returned: page.returned };
634
635
  }
635
636
  }
636
- // {§problem-projection} — the exact durable Problem remains the
637
- // failure authority; the packet carries only facts not already
638
- // owned by its enclosing row. Errors remains only an index.
637
+ }
638
+ // {§problem-projection} — the exact durable Problem remains the
639
+ // failure authority; the packet carries only facts not already
640
+ // owned by its enclosing row. Errors remains only an index.
641
+ // The success-side sibling (#342): a sub-problem receipt may carry one
642
+ // terse `detail` (e.g. the EDIT 304) so situational teaching is paid
643
+ // only when the situation occurs, never in the hot path.
644
+ static #problemFacts(identity, e, rx) {
645
+ const { meta } = identity;
639
646
  if (typeof e.status === "number" && e.status >= 400 && rx !== null && typeof rx === "object") {
640
- const problem = rx.problem;
641
- Validator.assertProblemDetails(problem);
647
+ const problem = Validator.assertProblemDetails(rx.problem);
642
648
  meta.problem = Problems.project(problem, {
643
649
  status: e.status,
644
650
  row: { ...meta, target: identity.target },
645
651
  });
646
652
  }
647
- // The success-side sibling (#342): a sub-problem receipt may carry one
648
- // terse `detail` (e.g. the EDIT 304) so situational teaching is paid
649
- // only when the situation occurs, never in the hot path.
650
- if (!Object.hasOwn(meta, "problem") && rx !== null && typeof rx === "object"
651
- && typeof rx.detail === "string"
652
- && rx.detail.length > 0) {
653
+ if (!Object.hasOwn(meta, "problem") && rx !== null && typeof rx.detail === "string" && rx.detail.length > 0) {
653
654
  meta.detail = rx.detail;
654
655
  }
655
- // {§retrieval-packet-metadata}: one extent/coordinate owner plus
656
- // only FIND aggregates that add information beyond that extent.
656
+ }
657
+ // {§retrieval-packet-metadata}: one extent/coordinate owner plus
658
+ // only FIND aggregates that add information beyond that extent.
659
+ static #retrievalFacts(identity, e, rx, fullBody) {
660
+ const { meta, op, tx } = identity;
657
661
  let findItems = null;
658
662
  let range = null;
659
- const patterned = tx !== null && tx !== undefined && typeof tx === "object" && tx.matcher !== null && typeof tx.matcher === "object" && typeof tx.matcher.raw === "string";
663
+ const patterned = tx !== null && tx !== undefined && typeof tx === "object" && isRecord(tx.matcher) && typeof tx.matcher.raw === "string";
660
664
  if (patterned && op !== "FIND" && rx !== null && typeof rx === "object" && typeof rx.matched === "number")
661
665
  meta.matched = rx.matched;
662
666
  // {§channel-selection-visibility} — a READ names the resource's other channels with their
@@ -677,13 +681,10 @@ export default class PacketWire {
677
681
  range = rx !== null && typeof rx === "object" && rx.range !== undefined
678
682
  ? Validator.assertRangeExtent(rx.range)
679
683
  : null;
680
- const problemOwnsRange = typeof e.status === "number"
681
- && e.status >= 400
682
- && meta.problem !== null
683
- && typeof meta.problem === "object"
684
- && Object.hasOwn(meta.problem, "range");
684
+ const problem = isRecord(meta.problem) ? meta.problem : null;
685
+ const problemOwnsRange = typeof e.status === "number" && e.status >= 400 && problem !== null && Object.hasOwn(problem, "range");
685
686
  if (problemOwnsRange) {
686
- Validator.assertRangeExtent(meta.problem.range);
687
+ Validator.assertRangeExtent(problem?.range);
687
688
  delete meta.scope;
688
689
  }
689
690
  if (range !== null && !problemOwnsRange) {
@@ -722,9 +723,12 @@ export default class PacketWire {
722
723
  meta.matchLocationCount = rx.matchLocationCount;
723
724
  }
724
725
  }
725
- // {§edit-result-receipt-projection} {§edit-result-copy-move-effects}
726
- // EDIT/scoped entry KILL own one receipt; COPY/MOVE own resource effects whose
727
- // optional receipts describe scoped textual materializations.
726
+ return { findItems, range };
727
+ }
728
+ // {§edit-result-receipt-projection} {§edit-result-copy-move-effects}
729
+ // EDIT/scoped entry KILL own one receipt; COPY/MOVE own resource effects whose
730
+ // optional receipts describe scoped textual materializations.
731
+ static #mutationReceiptFacts(meta, op, rx) {
728
732
  let structuredMutationReceipt = false;
729
733
  if ((op === "EDIT" || op === "KILL") && rx !== null && typeof rx === "object" && Object.hasOwn(rx, "receipt")) {
730
734
  Object.assign(meta, PacketWire.#receiptMeta(rx.receipt));
@@ -744,11 +748,7 @@ export default class PacketWire {
744
748
  }));
745
749
  structuredMutationReceipt = effects.some((effect) => effect.receipt !== undefined);
746
750
  }
747
- return {
748
- findItems, range, structuredMutationReceipt,
749
- ...(op === "READ" && rx?.matches !== undefined
750
- ? { matches: SchemeResults.assertMatchEvidenceList(rx.matches) } : {}),
751
- };
751
+ return structuredMutationReceipt;
752
752
  }
753
753
  // The body the row shows: the canonical full body, shared with log READ, log FIND and search
754
754
  // derivation, whole. Whether a result fit was decided where it landed ({§context-fit}).
@@ -791,8 +791,9 @@ export default class PacketWire {
791
791
  ...(enclosingRegion === undefined ? {} : { enclosingRegion: ScopeFormat.region(enclosingRegion) }),
792
792
  }));
793
793
  if (evidence.length > 0) {
794
- meta.matches = BodyPreview.items(evidence, JSON.stringify);
795
- if (meta.matches.length !== evidence.length)
794
+ const shown = BodyPreview.items(evidence, JSON.stringify);
795
+ meta.matches = shown;
796
+ if (shown.length !== evidence.length)
796
797
  meta.matchLocationCount = evidence.length;
797
798
  }
798
799
  }
@@ -886,33 +887,31 @@ export default class PacketWire {
886
887
  return row(converge(display === "open", attachment), attachment, null);
887
888
  }
888
889
  static #attachmentOf(rx, target, coordinate, path) {
889
- const view = rx;
890
- const contentHash = rx?.nativeContentHash;
891
- if (typeof contentHash !== "string")
890
+ if (!isRecord(rx) || typeof rx.nativeContentHash !== "string")
892
891
  return null;
892
+ const contentHash = rx.nativeContentHash;
893
893
  const pathname = typeof target?.pathname === "string" && target.pathname.length > 0
894
894
  ? target.pathname
895
895
  : typeof target?.raw === "string" ? target.raw : null;
896
896
  if (pathname === null || coordinate === null || path === null)
897
897
  return null;
898
898
  const scheme = target?.scheme ?? "file";
899
- const image = view?.image;
900
- if (image !== undefined && typeof image.mimetype === "string" && Number.isSafeInteger(image.width) && Number.isSafeInteger(image.height)) {
901
- const width = image.width;
902
- const height = image.height;
899
+ const image = rx.image;
900
+ if (isRecord(image) && typeof image.mimetype === "string" && isSafeInteger(image.width) && isSafeInteger(image.height)) {
901
+ const { width, height } = image;
903
902
  return { contentHash, coordinate, path, scheme, pathname, mimetype: image.mimetype, kind: "image", width, height, weight: imageWeight(width, height) };
904
903
  }
905
- const document = view?.document;
906
- if (document !== undefined && typeof document.mimetype === "string" && Number.isSafeInteger(document.bytes)) {
907
- const pages = Number.isSafeInteger(document.pages) ? document.pages : null;
904
+ const document = rx.document;
905
+ if (isRecord(document) && typeof document.mimetype === "string" && isSafeInteger(document.bytes)) {
906
+ const pages = isSafeInteger(document.pages) ? document.pages : null;
908
907
  return {
909
908
  contentHash, coordinate, path, scheme, pathname, mimetype: document.mimetype, kind: "pdf",
910
909
  ...(pages === null ? {} : { pages }),
911
910
  weight: pdfWeight(pages, document.bytes),
912
911
  };
913
912
  }
914
- const audio = view?.audio;
915
- if (audio !== undefined && typeof audio.mimetype === "string" && Number.isSafeInteger(audio.bytes)) {
913
+ const audio = rx.audio;
914
+ if (isRecord(audio) && typeof audio.mimetype === "string" && isSafeInteger(audio.bytes)) {
916
915
  const duration = typeof audio.duration === "number" && Number.isFinite(audio.duration) && audio.duration >= 0 ? audio.duration : null;
917
916
  return {
918
917
  contentHash, coordinate, path, scheme, pathname, mimetype: audio.mimetype, kind: "audio",
@@ -943,7 +942,7 @@ export default class PacketWire {
943
942
  const parts = [];
944
943
  for (const [at, section] of sections.entries()) {
945
944
  parts.push({ type: "text", text: `${at === 0 ? "" : "\n\n"}${PacketWire.renderSection(section)}` });
946
- for (const attachment of attachments.filter((attachment) => attachment.section === section.name)) {
945
+ for (const attachment of attachments.filter((candidate) => candidate.section === section.name)) {
947
946
  parts.push({ type: "text", text: `\n\n${PacketWire.attachmentCaption(attachment)}` });
948
947
  parts.push({ type: "file", data: await bytesOf(attachment), mediaType: attachment.mimetype });
949
948
  }
@@ -1011,15 +1010,54 @@ export default class PacketWire {
1011
1010
  static #requestScope(marker) {
1012
1011
  if (marker === null || marker === undefined)
1013
1012
  return null;
1014
- const marks = marker.marks;
1015
- if (!Array.isArray(marks) || marks.some((mark) => typeof mark !== "string" && typeof mark !== "number")) {
1013
+ const marks = isRecord(marker) ? marker.marks : undefined;
1014
+ const isMark = (mark) => typeof mark === "string" || typeof mark === "number";
1015
+ if (!Array.isArray(marks) || !marks.every(isMark)) {
1016
1016
  throw new TypeError("An operation scope must retain its authored marks.");
1017
1017
  }
1018
+ const [first, ...rest] = marks;
1019
+ if (first === undefined)
1020
+ throw new TypeError("An operation scope must retain its authored marks.");
1018
1021
  // Failed selections still describe what was attempted; the operation owns validity.
1019
- return ScopeFormat.marker(marker);
1022
+ return ScopeFormat.marker({ marks: [first, ...rest] });
1023
+ }
1024
+ // {§packet-stored-shape} A stored operand target: the address columns as nullable strings, the port a number, the
1025
+ // authored `kind` and `raw` read where used. A field of another type is a malformed row.
1026
+ static #actionTarget(value) {
1027
+ if (value === null || value === undefined)
1028
+ return null;
1029
+ if (!isRecord(value))
1030
+ throw new TypeError("A stored operand target must be an object.");
1031
+ const text = (name) => {
1032
+ const field = value[name];
1033
+ if (field === undefined || field === null || typeof field === "string")
1034
+ return field;
1035
+ throw new TypeError(`A stored operand target carries a malformed ${name}.`);
1036
+ };
1037
+ const port = value.port;
1038
+ if (port !== undefined && port !== null && typeof port !== "number") {
1039
+ throw new TypeError("A stored operand target carries a malformed port.");
1040
+ }
1041
+ return {
1042
+ kind: value.kind, raw: value.raw, scheme: text("scheme"), hostname: text("hostname"), port, pathname: text("pathname"),
1043
+ query: text("query"), fragment: text("fragment"), username: text("username"), password: text("password"),
1044
+ };
1045
+ }
1046
+ // The target as the model authored it, when the stored statement's target is a path the grammar names; a row
1047
+ // whose stored target is not renders without its authored spelling.
1048
+ static #authoredPath(value) {
1049
+ if (value === null || value === undefined)
1050
+ return null;
1051
+ return Validator.validateParsedPath(value).valid ? Validator.assertParsedPath(value) : null;
1052
+ }
1053
+ static #selection(value) {
1054
+ return isRecord(value) ? value : null;
1055
+ }
1056
+ static #metadata(value) {
1057
+ return Array.isArray(value) && value.length > 0 && value.every((item) => typeof item === "string") ? value : null;
1020
1058
  }
1021
1059
  // {§packet-git-status}: the count line, then one bounded line per non-empty class. Untracked paths are
1022
- // named because they are NOT members ({§membership-baseline}) — a human `git add`s or picks them.
1060
+ // named because they are NOT members ({§membership-baseline}) — the user admits them.
1023
1061
  static #renderGitState(git) {
1024
1062
  const sync = git.ahead > 0 || git.behind > 0 ? ` (↑${git.ahead} ↓${git.behind})` : "";
1025
1063
  const position = git.branch === null ? "detached HEAD" : `branch \`${git.branch}\`${git.unborn ? " (no commits)" : ""}`;