@plurnk/plurnk-service 1.3.12 → 1.4.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 (469) hide show
  1. package/.env.defaults +84 -77
  2. package/INSTALL.md +50 -25
  3. package/README.md +24 -10
  4. package/SPEC.md +2311 -928
  5. package/dist/Paths.d.ts +4 -1
  6. package/dist/Paths.d.ts.map +1 -1
  7. package/dist/Paths.js +23 -21
  8. package/dist/Paths.js.map +1 -1
  9. package/dist/build-info.json +1 -1
  10. package/dist/content/edit-receipt.d.ts +13 -28
  11. package/dist/content/edit-receipt.d.ts.map +1 -1
  12. package/dist/content/edit-receipt.js +285 -104
  13. package/dist/content/edit-receipt.js.map +1 -1
  14. package/dist/content/edited-span.d.ts.map +1 -1
  15. package/dist/content/edited-span.js +2 -5
  16. package/dist/content/edited-span.js.map +1 -1
  17. package/dist/content/index.d.ts +3 -3
  18. package/dist/content/index.d.ts.map +1 -1
  19. package/dist/content/index.js +1 -1
  20. package/dist/content/index.js.map +1 -1
  21. package/dist/content/line-marker.d.ts +6 -9
  22. package/dist/content/line-marker.d.ts.map +1 -1
  23. package/dist/content/line-marker.js +7 -11
  24. package/dist/content/line-marker.js.map +1 -1
  25. package/dist/content/matcher.d.ts +14 -25
  26. package/dist/content/matcher.d.ts.map +1 -1
  27. package/dist/content/matcher.js +77 -107
  28. package/dist/content/matcher.js.map +1 -1
  29. package/dist/content/mimetype-binary.d.ts +2 -2
  30. package/dist/content/mimetype-binary.d.ts.map +1 -1
  31. package/dist/content/mimetype-binary.js +10 -10
  32. package/dist/content/mimetype-binary.js.map +1 -1
  33. package/dist/content/path-mimetype.js +3 -3
  34. package/dist/content/path-mimetype.js.map +1 -1
  35. package/dist/content/read-resolve.d.ts +8 -4
  36. package/dist/content/read-resolve.d.ts.map +1 -1
  37. package/dist/content/read-resolve.js +101 -49
  38. package/dist/content/read-resolve.js.map +1 -1
  39. package/dist/core/BranchReceipt.d.ts +7 -0
  40. package/dist/core/BranchReceipt.d.ts.map +1 -0
  41. package/dist/core/BranchReceipt.js +27 -0
  42. package/dist/core/BranchReceipt.js.map +1 -0
  43. package/dist/core/BudgetOverflow.d.ts +23 -0
  44. package/dist/core/BudgetOverflow.d.ts.map +1 -0
  45. package/dist/core/BudgetOverflow.js +61 -0
  46. package/dist/core/BudgetOverflow.js.map +1 -0
  47. package/dist/core/BudgetReadout.d.ts +8 -0
  48. package/dist/core/BudgetReadout.d.ts.map +1 -0
  49. package/dist/core/BudgetReadout.js +79 -0
  50. package/dist/core/BudgetReadout.js.map +1 -0
  51. package/dist/core/ChannelWrite.d.ts +28 -9
  52. package/dist/core/ChannelWrite.d.ts.map +1 -1
  53. package/dist/core/ChannelWrite.js +28 -21
  54. package/dist/core/ChannelWrite.js.map +1 -1
  55. package/dist/core/ChannelWrite.sql +11 -10
  56. package/dist/core/CoreSchemeServices.d.ts +10 -4
  57. package/dist/core/CoreSchemeServices.d.ts.map +1 -1
  58. package/dist/core/CoreSchemeServices.js +7 -1
  59. package/dist/core/CoreSchemeServices.js.map +1 -1
  60. package/dist/core/Dispatcher.d.ts +29 -20
  61. package/dist/core/Dispatcher.d.ts.map +1 -1
  62. package/dist/core/Dispatcher.js +1488 -599
  63. package/dist/core/Dispatcher.js.map +1 -1
  64. package/dist/core/DurableStatement.d.ts +6 -0
  65. package/dist/core/DurableStatement.d.ts.map +1 -0
  66. package/dist/core/DurableStatement.js +51 -0
  67. package/dist/core/DurableStatement.js.map +1 -0
  68. package/dist/core/Engine.d.ts +48 -20
  69. package/dist/core/Engine.d.ts.map +1 -1
  70. package/dist/core/Engine.js +1208 -789
  71. package/dist/core/Engine.js.map +1 -1
  72. package/dist/core/Engine.sql +309 -217
  73. package/dist/core/EnvFlags.js +1 -1
  74. package/dist/core/EnvFlags.js.map +1 -1
  75. package/dist/core/ErrorDetail.d.ts +6 -0
  76. package/dist/core/ErrorDetail.d.ts.map +1 -0
  77. package/dist/core/ErrorDetail.js +20 -0
  78. package/dist/core/ErrorDetail.js.map +1 -0
  79. package/dist/core/ExecutorRegistry.d.ts +14 -3
  80. package/dist/core/ExecutorRegistry.d.ts.map +1 -1
  81. package/dist/core/ExecutorRegistry.js +56 -30
  82. package/dist/core/ExecutorRegistry.js.map +1 -1
  83. package/dist/core/GitBranch.d.ts +20 -0
  84. package/dist/core/GitBranch.d.ts.map +1 -0
  85. package/dist/core/GitBranch.js +110 -0
  86. package/dist/core/GitBranch.js.map +1 -0
  87. package/dist/core/JournalTurn.d.ts +9 -0
  88. package/dist/core/JournalTurn.d.ts.map +1 -0
  89. package/dist/core/JournalTurn.js +14 -0
  90. package/dist/core/JournalTurn.js.map +1 -0
  91. package/dist/core/JournalTurn.sql +10 -0
  92. package/dist/core/LogBody.d.ts +17 -0
  93. package/dist/core/LogBody.d.ts.map +1 -0
  94. package/dist/core/LogBody.js +148 -0
  95. package/dist/core/LogBody.js.map +1 -0
  96. package/dist/core/LoopFlagsReader.d.ts +7 -0
  97. package/dist/core/LoopFlagsReader.d.ts.map +1 -0
  98. package/dist/core/LoopFlagsReader.js +33 -0
  99. package/dist/core/LoopFlagsReader.js.map +1 -0
  100. package/dist/core/LoopLifecycle.d.ts +8 -1
  101. package/dist/core/LoopLifecycle.d.ts.map +1 -1
  102. package/dist/core/LoopLifecycle.js +55 -9
  103. package/dist/core/LoopLifecycle.js.map +1 -1
  104. package/dist/core/LoopLifecycle.sql +9 -3
  105. package/dist/core/NoticeChannel.d.ts +13 -0
  106. package/dist/core/NoticeChannel.d.ts.map +1 -0
  107. package/dist/core/NoticeChannel.js +40 -0
  108. package/dist/core/NoticeChannel.js.map +1 -0
  109. package/dist/core/Owner.d.ts +0 -1
  110. package/dist/core/Owner.d.ts.map +1 -1
  111. package/dist/core/Owner.js +2 -5
  112. package/dist/core/Owner.js.map +1 -1
  113. package/dist/core/PacketBuilder.d.ts +25 -24
  114. package/dist/core/PacketBuilder.d.ts.map +1 -1
  115. package/dist/core/PacketBuilder.js +313 -375
  116. package/dist/core/PacketBuilder.js.map +1 -1
  117. package/dist/core/ProblemLog.d.ts +26 -0
  118. package/dist/core/ProblemLog.d.ts.map +1 -0
  119. package/dist/core/ProblemLog.js +58 -0
  120. package/dist/core/ProblemLog.js.map +1 -0
  121. package/dist/core/ProposalLifecycle.d.ts +15 -21
  122. package/dist/core/ProposalLifecycle.d.ts.map +1 -1
  123. package/dist/core/ProposalLifecycle.js +291 -78
  124. package/dist/core/ProposalLifecycle.js.map +1 -1
  125. package/dist/core/ProviderInstantiate.d.ts.map +1 -1
  126. package/dist/core/ProviderInstantiate.js +51 -48
  127. package/dist/core/ProviderInstantiate.js.map +1 -1
  128. package/dist/core/SchemeRegistry.d.ts +14 -8
  129. package/dist/core/SchemeRegistry.d.ts.map +1 -1
  130. package/dist/core/SchemeRegistry.js +189 -114
  131. package/dist/core/SchemeRegistry.js.map +1 -1
  132. package/dist/core/ServiceTeardown.d.ts +11 -0
  133. package/dist/core/ServiceTeardown.d.ts.map +1 -0
  134. package/dist/core/ServiceTeardown.js +70 -0
  135. package/dist/core/ServiceTeardown.js.map +1 -0
  136. package/dist/core/StoredPacket.d.ts +29 -0
  137. package/dist/core/StoredPacket.d.ts.map +1 -0
  138. package/dist/core/StoredPacket.js +147 -0
  139. package/dist/core/StoredPacket.js.map +1 -0
  140. package/dist/core/StrikeRail.d.ts +1 -2
  141. package/dist/core/StrikeRail.d.ts.map +1 -1
  142. package/dist/core/StrikeRail.js +25 -55
  143. package/dist/core/StrikeRail.js.map +1 -1
  144. package/dist/core/WorkerControlAddress.d.ts +17 -0
  145. package/dist/core/WorkerControlAddress.d.ts.map +1 -0
  146. package/dist/core/WorkerControlAddress.js +44 -0
  147. package/dist/core/WorkerControlAddress.js.map +1 -0
  148. package/dist/core/WorkerName.d.ts +31 -0
  149. package/dist/core/WorkerName.d.ts.map +1 -0
  150. package/dist/core/WorkerName.js +95 -0
  151. package/dist/core/WorkerName.js.map +1 -0
  152. package/dist/core/WorkerName.sql +36 -0
  153. package/dist/core/WorkspaceGate.d.ts +14 -0
  154. package/dist/core/WorkspaceGate.d.ts.map +1 -0
  155. package/dist/core/WorkspaceGate.js +155 -0
  156. package/dist/core/WorkspaceGate.js.map +1 -0
  157. package/dist/core/caps/CapsResolve.d.ts +1 -1
  158. package/dist/core/caps/CapsResolve.d.ts.map +1 -1
  159. package/dist/core/caps/CapsResolve.js.map +1 -1
  160. package/dist/core/caps/DbChannelCaps.d.ts +5 -11
  161. package/dist/core/caps/DbChannelCaps.d.ts.map +1 -1
  162. package/dist/core/caps/DbChannelCaps.js +24 -8
  163. package/dist/core/caps/DbChannelCaps.js.map +1 -1
  164. package/dist/core/caps/DbEntryCaps.d.ts +4 -13
  165. package/dist/core/caps/DbEntryCaps.d.ts.map +1 -1
  166. package/dist/core/caps/DbEntryCaps.js +15 -6
  167. package/dist/core/caps/DbEntryCaps.js.map +1 -1
  168. package/dist/core/caps/DbNotifyCaps.d.ts +1 -1
  169. package/dist/core/caps/DbNotifyCaps.d.ts.map +1 -1
  170. package/dist/core/caps/DbNotifyCaps.js +12 -11
  171. package/dist/core/caps/DbNotifyCaps.js.map +1 -1
  172. package/dist/core/caps/DbProjectionCaps.d.ts +5 -5
  173. package/dist/core/caps/DbProjectionCaps.d.ts.map +1 -1
  174. package/dist/core/caps/DbProjectionCaps.js +21 -4
  175. package/dist/core/caps/DbProjectionCaps.js.map +1 -1
  176. package/dist/core/caps/DbSubscriptionCaps.d.ts +4 -4
  177. package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -1
  178. package/dist/core/caps/DbSubscriptionCaps.js +57 -62
  179. package/dist/core/caps/DbSubscriptionCaps.js.map +1 -1
  180. package/dist/core/caps/DbTagCaps.d.ts +5 -12
  181. package/dist/core/caps/DbTagCaps.d.ts.map +1 -1
  182. package/dist/core/caps/DbTagCaps.js +14 -7
  183. package/dist/core/caps/DbTagCaps.js.map +1 -1
  184. package/dist/core/content-hash.js +1 -1
  185. package/dist/core/content-hash.js.map +1 -1
  186. package/dist/core/env-defaults.d.ts.map +1 -1
  187. package/dist/core/env-defaults.js.map +1 -1
  188. package/dist/core/fork.d.ts.map +1 -1
  189. package/dist/core/fork.js +55 -30
  190. package/dist/core/fork.js.map +1 -1
  191. package/dist/core/fork.sql +41 -27
  192. package/dist/core/git-env.d.ts +2 -0
  193. package/dist/core/git-env.d.ts.map +1 -1
  194. package/dist/core/git-env.js +13 -18
  195. package/dist/core/git-env.js.map +1 -1
  196. package/dist/core/git-iso.d.ts.map +1 -1
  197. package/dist/core/git-iso.js +9 -15
  198. package/dist/core/git-iso.js.map +1 -1
  199. package/dist/core/git-membership.d.ts +1 -1
  200. package/dist/core/git-membership.d.ts.map +1 -1
  201. package/dist/core/git-membership.js +198 -146
  202. package/dist/core/git-membership.js.map +1 -1
  203. package/dist/core/git-state.d.ts.map +1 -1
  204. package/dist/core/git-state.js +10 -11
  205. package/dist/core/git-state.js.map +1 -1
  206. package/dist/core/owner.sql +1 -1
  207. package/dist/core/packet-inject.d.ts.map +1 -1
  208. package/dist/core/packet-inject.js +7 -11
  209. package/dist/core/packet-inject.js.map +1 -1
  210. package/dist/core/packet-wire.d.ts +2 -20
  211. package/dist/core/packet-wire.d.ts.map +1 -1
  212. package/dist/core/packet-wire.js +242 -368
  213. package/dist/core/packet-wire.js.map +1 -1
  214. package/dist/core/plurnk-uri.d.ts +12 -1
  215. package/dist/core/plurnk-uri.d.ts.map +1 -1
  216. package/dist/core/plurnk-uri.js +49 -29
  217. package/dist/core/plurnk-uri.js.map +1 -1
  218. package/dist/core/results.d.ts +16 -5
  219. package/dist/core/results.d.ts.map +1 -1
  220. package/dist/core/results.js +27 -18
  221. package/dist/core/results.js.map +1 -1
  222. package/dist/core/ruler_count.d.ts +4 -0
  223. package/dist/core/ruler_count.d.ts.map +1 -0
  224. package/dist/core/ruler_count.js +7 -0
  225. package/dist/core/ruler_count.js.map +1 -0
  226. package/dist/core/scheme-types.d.ts +9 -11
  227. package/dist/core/scheme-types.d.ts.map +1 -1
  228. package/dist/core/scheme-types.js.map +1 -1
  229. package/dist/core/search-gate.d.ts.map +1 -1
  230. package/dist/core/search-gate.js +3 -11
  231. package/dist/core/search-gate.js.map +1 -1
  232. package/dist/core/teaching-corpus.d.ts +6 -0
  233. package/dist/core/teaching-corpus.d.ts.map +1 -0
  234. package/dist/core/teaching-corpus.js +23 -0
  235. package/dist/core/teaching-corpus.js.map +1 -0
  236. package/dist/core/teaching.d.ts +0 -1
  237. package/dist/core/teaching.d.ts.map +1 -1
  238. package/dist/core/teaching.js +2 -8
  239. package/dist/core/teaching.js.map +1 -1
  240. package/dist/core/token-ruler.d.ts.map +1 -1
  241. package/dist/core/token-ruler.js +3 -16
  242. package/dist/core/token-ruler.js.map +1 -1
  243. package/dist/core/turn-scheduler.d.ts +1 -1
  244. package/dist/core/turn-scheduler.d.ts.map +1 -1
  245. package/dist/core/turn-scheduler.js +1 -1
  246. package/dist/core/turn-scheduler.js.map +1 -1
  247. package/dist/core/worker-cap.d.ts +2 -4
  248. package/dist/core/worker-cap.d.ts.map +1 -1
  249. package/dist/core/worker-cap.js +13 -4
  250. package/dist/core/worker-cap.js.map +1 -1
  251. package/dist/core/{run-ops.sql → worker-ops.sql} +11 -11
  252. package/dist/core/workspace-settings.d.ts.map +1 -1
  253. package/dist/core/workspace-settings.js +17 -9
  254. package/dist/core/workspace-settings.js.map +1 -1
  255. package/dist/digest/Digest.d.ts +2 -1
  256. package/dist/digest/Digest.d.ts.map +1 -1
  257. package/dist/digest/Digest.js +337 -138
  258. package/dist/digest/Digest.js.map +1 -1
  259. package/dist/digest/digest.sql +19 -10
  260. package/dist/index.d.ts.map +1 -1
  261. package/dist/index.js +3 -5
  262. package/dist/index.js.map +1 -1
  263. package/dist/matrix/live-specimen.d.ts +9 -0
  264. package/dist/matrix/live-specimen.d.ts.map +1 -0
  265. package/dist/matrix/live-specimen.js +37 -0
  266. package/dist/matrix/live-specimen.js.map +1 -0
  267. package/dist/observe/api.d.ts +6 -0
  268. package/dist/observe/api.d.ts.map +1 -0
  269. package/dist/observe/api.js +11 -0
  270. package/dist/observe/api.js.map +1 -0
  271. package/dist/observe/init.d.ts +7 -0
  272. package/dist/observe/init.d.ts.map +1 -0
  273. package/dist/observe/init.js +159 -0
  274. package/dist/observe/init.js.map +1 -0
  275. package/dist/observe/metrics.d.ts +6 -0
  276. package/dist/observe/metrics.d.ts.map +1 -0
  277. package/dist/observe/metrics.js +15 -0
  278. package/dist/observe/metrics.js.map +1 -0
  279. package/dist/observe/spans.d.ts +4 -0
  280. package/dist/observe/spans.d.ts.map +1 -0
  281. package/dist/observe/spans.js +51 -0
  282. package/dist/observe/spans.js.map +1 -0
  283. package/dist/schemes/EffectPolicy.d.ts +1 -0
  284. package/dist/schemes/EffectPolicy.d.ts.map +1 -1
  285. package/dist/schemes/EffectPolicy.js +5 -2
  286. package/dist/schemes/EffectPolicy.js.map +1 -1
  287. package/dist/schemes/Exec.d.ts +6 -11
  288. package/dist/schemes/Exec.d.ts.map +1 -1
  289. package/dist/schemes/Exec.js +364 -247
  290. package/dist/schemes/Exec.js.map +1 -1
  291. package/dist/schemes/ExecOutputScheme.d.ts +8 -7
  292. package/dist/schemes/ExecOutputScheme.d.ts.map +1 -1
  293. package/dist/schemes/ExecOutputScheme.js +48 -9
  294. package/dist/schemes/ExecOutputScheme.js.map +1 -1
  295. package/dist/schemes/File.d.ts +7 -11
  296. package/dist/schemes/File.d.ts.map +1 -1
  297. package/dist/schemes/File.js +279 -142
  298. package/dist/schemes/File.js.map +1 -1
  299. package/dist/schemes/Log.d.ts +4 -8
  300. package/dist/schemes/Log.d.ts.map +1 -1
  301. package/dist/schemes/Log.js +475 -208
  302. package/dist/schemes/Log.js.map +1 -1
  303. package/dist/schemes/Log.sql +62 -30
  304. package/dist/schemes/Prompt.d.ts +3 -2
  305. package/dist/schemes/Prompt.d.ts.map +1 -1
  306. package/dist/schemes/Prompt.js +9 -6
  307. package/dist/schemes/Prompt.js.map +1 -1
  308. package/dist/schemes/Skill.d.ts +1 -1
  309. package/dist/schemes/Skill.d.ts.map +1 -1
  310. package/dist/schemes/Skill.js +2 -3
  311. package/dist/schemes/Skill.js.map +1 -1
  312. package/dist/schemes/Worker.d.ts +8 -16
  313. package/dist/schemes/Worker.d.ts.map +1 -1
  314. package/dist/schemes/Worker.js +179 -69
  315. package/dist/schemes/Worker.js.map +1 -1
  316. package/dist/schemes/_entry-chunk.d.ts.map +1 -1
  317. package/dist/schemes/_entry-chunk.js +12 -5
  318. package/dist/schemes/_entry-chunk.js.map +1 -1
  319. package/dist/schemes/_entry-crud.d.ts +10 -9
  320. package/dist/schemes/_entry-crud.d.ts.map +1 -1
  321. package/dist/schemes/_entry-crud.js +59 -13
  322. package/dist/schemes/_entry-crud.js.map +1 -1
  323. package/dist/schemes/_entry-crud.sql +20 -8
  324. package/dist/schemes/_entry-find.d.ts +20 -15
  325. package/dist/schemes/_entry-find.d.ts.map +1 -1
  326. package/dist/schemes/_entry-find.js +339 -174
  327. package/dist/schemes/_entry-find.js.map +1 -1
  328. package/dist/schemes/_entry-find.sql +20 -8
  329. package/dist/schemes/_entry-graph.d.ts +4 -2
  330. package/dist/schemes/_entry-graph.d.ts.map +1 -1
  331. package/dist/schemes/_entry-graph.js +55 -31
  332. package/dist/schemes/_entry-graph.js.map +1 -1
  333. package/dist/schemes/_entry-graph.sql +37 -22
  334. package/dist/schemes/_entry-manifest.d.ts +10 -15
  335. package/dist/schemes/_entry-manifest.d.ts.map +1 -1
  336. package/dist/schemes/_entry-manifest.js +50 -268
  337. package/dist/schemes/_entry-manifest.js.map +1 -1
  338. package/dist/schemes/_entry-ops.d.ts +9 -14
  339. package/dist/schemes/_entry-ops.d.ts.map +1 -1
  340. package/dist/schemes/_entry-ops.js +149 -77
  341. package/dist/schemes/_entry-ops.js.map +1 -1
  342. package/dist/schemes/_entry-ops.sql +1 -1
  343. package/dist/schemes/_entry-semantic.d.ts +23 -8
  344. package/dist/schemes/_entry-semantic.d.ts.map +1 -1
  345. package/dist/schemes/_entry-semantic.js +141 -60
  346. package/dist/schemes/_entry-semantic.js.map +1 -1
  347. package/dist/schemes/_entry-semantic.sql +63 -45
  348. package/dist/schemes/_entry-send.d.ts +3 -4
  349. package/dist/schemes/_entry-send.d.ts.map +1 -1
  350. package/dist/schemes/_entry-send.js +48 -23
  351. package/dist/schemes/_entry-send.js.map +1 -1
  352. package/dist/schemes/_path-scope.d.ts +23 -0
  353. package/dist/schemes/_path-scope.d.ts.map +1 -0
  354. package/dist/schemes/_path-scope.js +61 -0
  355. package/dist/schemes/_path-scope.js.map +1 -0
  356. package/dist/schemes/_search-candidate.d.ts +20 -0
  357. package/dist/schemes/_search-candidate.d.ts.map +1 -0
  358. package/dist/schemes/_search-candidate.js +19 -0
  359. package/dist/schemes/_search-candidate.js.map +1 -0
  360. package/dist/schemes/_search-exclusion.d.ts +7 -0
  361. package/dist/schemes/_search-exclusion.d.ts.map +1 -0
  362. package/dist/schemes/_search-exclusion.js +23 -0
  363. package/dist/schemes/_search-exclusion.js.map +1 -0
  364. package/dist/schemes/_search-index.d.ts +6 -0
  365. package/dist/schemes/_search-index.d.ts.map +1 -0
  366. package/dist/schemes/_search-index.js +326 -0
  367. package/dist/schemes/_search-index.js.map +1 -0
  368. package/dist/schemes/cosine.js +1 -1
  369. package/dist/schemes/cosine.js.map +1 -1
  370. package/dist/schemes/exec-abort.js +3 -3
  371. package/dist/schemes/exec-abort.js.map +1 -1
  372. package/dist/schemes/exec-env.js +3 -3
  373. package/dist/schemes/exec-env.js.map +1 -1
  374. package/dist/server/BranchBatches.d.ts +48 -0
  375. package/dist/server/BranchBatches.d.ts.map +1 -0
  376. package/dist/server/BranchBatches.js +591 -0
  377. package/dist/server/BranchBatches.js.map +1 -0
  378. package/dist/server/Daemon.d.ts +36 -66
  379. package/dist/server/Daemon.d.ts.map +1 -1
  380. package/dist/server/Daemon.js +920 -446
  381. package/dist/server/Daemon.js.map +1 -1
  382. package/dist/server/DaemonModule.d.ts +31 -0
  383. package/dist/server/DaemonModule.d.ts.map +1 -0
  384. package/dist/server/DaemonModule.js +2 -0
  385. package/dist/server/DaemonModule.js.map +1 -0
  386. package/dist/server/branch-batch.sql +152 -0
  387. package/dist/server/client-input.d.ts +12 -0
  388. package/dist/server/client-input.d.ts.map +1 -1
  389. package/dist/server/client-input.js +262 -57
  390. package/dist/server/client-input.js.map +1 -1
  391. package/dist/server/dispatch-as-plurnk.d.ts +1 -1
  392. package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
  393. package/dist/server/dispatch-as-plurnk.js +15 -7
  394. package/dist/server/dispatch-as-plurnk.js.map +1 -1
  395. package/dist/server/drain.sql +92 -62
  396. package/dist/server/envelope.d.ts +2 -5
  397. package/dist/server/envelope.d.ts.map +1 -1
  398. package/dist/server/envelope.js +119 -95
  399. package/dist/server/envelope.js.map +1 -1
  400. package/dist/server/envelope.sql +19 -23
  401. package/dist/server/exec-poll-backoff.js +1 -1
  402. package/dist/server/exec-poll-backoff.js.map +1 -1
  403. package/dist/server/lifecycle-recovery.sql +79 -2
  404. package/dist/server/logEntry.d.ts +3 -1
  405. package/dist/server/logEntry.d.ts.map +1 -1
  406. package/dist/server/logEntry.js +4 -2
  407. package/dist/server/logEntry.js.map +1 -1
  408. package/dist/server/logEntry.sql +1 -1
  409. package/dist/server/loop-model.d.ts.map +1 -1
  410. package/dist/server/loop-model.js +22 -9
  411. package/dist/server/loop-model.js.map +1 -1
  412. package/dist/server/loopDocs.d.ts.map +1 -1
  413. package/dist/server/loopDocs.js +5 -4
  414. package/dist/server/loopDocs.js.map +1 -1
  415. package/dist/server/seam-entry-read.sql +15 -10
  416. package/dist/server/seam-log-read.sql +2 -2
  417. package/dist/server/seam-loop.sql +1 -1
  418. package/dist/server/seam-proposal-list.sql +17 -7
  419. package/dist/service.d.ts.map +1 -1
  420. package/dist/service.js +66 -60
  421. package/dist/service.js.map +1 -1
  422. package/migrations/001_schema.sql +897 -0
  423. package/package.json +57 -26
  424. package/dist/core/PluginLoader.d.ts +0 -20
  425. package/dist/core/PluginLoader.d.ts.map +0 -1
  426. package/dist/core/PluginLoader.js +0 -142
  427. package/dist/core/PluginLoader.js.map +0 -1
  428. package/dist/core/TelemetryChannel.d.ts +0 -37
  429. package/dist/core/TelemetryChannel.d.ts.map +0 -1
  430. package/dist/core/TelemetryChannel.js +0 -80
  431. package/dist/core/TelemetryChannel.js.map +0 -1
  432. package/dist/core/path-decode.d.ts +0 -3
  433. package/dist/core/path-decode.d.ts.map +0 -1
  434. package/dist/core/path-decode.js +0 -9
  435. package/dist/core/path-decode.js.map +0 -1
  436. package/dist/core/plugin-attribution.d.ts +0 -5
  437. package/dist/core/plugin-attribution.d.ts.map +0 -1
  438. package/dist/core/plugin-attribution.js +0 -39
  439. package/dist/core/plugin-attribution.js.map +0 -1
  440. package/dist/core/world-state.d.ts +0 -10
  441. package/dist/core/world-state.d.ts.map +0 -1
  442. package/dist/core/world-state.js +0 -35
  443. package/dist/core/world-state.js.map +0 -1
  444. package/dist/core/world-state.sql +0 -35
  445. package/dist/core/zero-pin.d.ts +0 -3
  446. package/dist/core/zero-pin.d.ts.map +0 -1
  447. package/dist/core/zero-pin.js +0 -16
  448. package/dist/core/zero-pin.js.map +0 -1
  449. package/dist/server/auto.d.ts +0 -6
  450. package/dist/server/auto.d.ts.map +0 -1
  451. package/dist/server/auto.js +0 -63
  452. package/dist/server/auto.js.map +0 -1
  453. package/dist/server/clientTurn.d.ts +0 -6
  454. package/dist/server/clientTurn.d.ts.map +0 -1
  455. package/dist/server/clientTurn.js +0 -22
  456. package/dist/server/clientTurn.js.map +0 -1
  457. package/dist/server/clientTurn.sql +0 -10
  458. package/dist/server/noProposals.d.ts +0 -6
  459. package/dist/server/noProposals.d.ts.map +0 -1
  460. package/dist/server/noProposals.js +0 -37
  461. package/dist/server/noProposals.js.map +0 -1
  462. package/dist/server/version-info.d.ts +0 -14
  463. package/dist/server/version-info.d.ts.map +0 -1
  464. package/dist/server/version-info.js +0 -69
  465. package/dist/server/version-info.js.map +0 -1
  466. package/migrations/0000-00-00.01_schema.sql +0 -536
  467. package/migrations/0004_loop-provider.sql +0 -3
  468. package/migrations/0005_subscription-published-channel.sql +0 -3
  469. package/migrations/0006_loop-max-turns.sql +0 -3
@@ -1,148 +1,353 @@
1
- // Client-input validation at the SEAM — the daemon's client surface fail-hards on malformed
2
- // input for EVERY module riding it (#364 flushed these out of the retired WS handlers, where
3
- // only the socket path got them). Messages are the client-facing contract; tests assert them.
1
+ // Client-input validation at the seam. Malformed external input becomes one
2
+ // exact public operation failure for every module riding the daemon surface.
3
+ // Internal invariant violations still throw ordinary implementation errors.
4
4
  import { isAbsolute } from "node:path";
5
- const CONSTRAINT_EFFECTS = new Set(["pick", "hide", "view", "repo"]);
5
+ import { Policy } from "@plurnk/plurnk-execs";
6
+ import Results, { OperationFailureError } from "../core/results.js";
7
+ import WorkerName, { WorkerNameError } from "../core/WorkerName.js";
8
+ const CONSTRAINT_EFFECTS = new Set(["pick", "hide", "view"]);
6
9
  export default class ClientInput {
7
- // A workspace pin must be an absolute path (or null = headless) — a relative root would
10
+ static #invalid(context, code, detail, extensions = {}) {
11
+ throw new OperationFailureError(Results.failure("daemon:input", code, 400, detail, {}, {
12
+ context,
13
+ stage: "input-validation",
14
+ retryable: false,
15
+ ...extensions,
16
+ }));
17
+ }
18
+ // A workspace pin must be an absolute path (or null = headless) - a relative root would
8
19
  // silently resolve against the daemon's cwd, never the client's.
9
20
  static assertProjectRoot(context, projectRoot) {
10
21
  const root = projectRoot ?? null;
11
22
  if (root === null)
12
23
  return null;
13
24
  if (typeof root !== "string" || root.length === 0) {
14
- throw new Error(`${context}: projectRoot must be a non-empty string or null`);
25
+ ClientInput.#invalid(context, "project-root-invalid", "projectRoot is neither a non-empty string nor null.", { field: "projectRoot", recovery: "Provide an absolute project path or null." });
26
+ }
27
+ if (!isAbsolute(root)) {
28
+ ClientInput.#invalid(context, "project-root-not-absolute", `projectRoot '${root}' is not an absolute path.`, { field: "projectRoot", value: root, recovery: "Provide an absolute project path." });
15
29
  }
16
- if (!isAbsolute(root))
17
- throw new Error(`${context}: projectRoot must be an absolute path`);
18
30
  return root;
19
31
  }
32
+ static assertOptionalName(context, field, value) {
33
+ if (value === undefined)
34
+ return undefined;
35
+ if (typeof value !== "string" || value.length === 0) {
36
+ ClientInput.#invalid(context, "name-invalid", `${field} is not a non-empty string.`, { field, recovery: `Provide a non-empty ${field}.` });
37
+ }
38
+ return value;
39
+ }
40
+ static assertOptionalWorkerName(context, field, value) {
41
+ const workerName = ClientInput.assertOptionalName(context, field, value);
42
+ if (workerName === undefined)
43
+ return undefined;
44
+ try {
45
+ return WorkerName.assert(workerName);
46
+ }
47
+ catch (error) {
48
+ if (!(error instanceof WorkerNameError))
49
+ throw error;
50
+ throw new OperationFailureError(Results.failure("daemon:worker", error.code, error.rejection === "reserved" ? 409 : 400, error.message, {}, {
51
+ context,
52
+ field,
53
+ name: error.workerName,
54
+ recovery: error.recovery,
55
+ retryable: false,
56
+ }));
57
+ }
58
+ }
59
+ static assertOptionalSelector(context, field, value) {
60
+ if (value === undefined)
61
+ return undefined;
62
+ if (typeof value !== "string" || value.length === 0) {
63
+ ClientInput.#invalid(context, `${field}-invalid`, `${field} is not a non-empty string.`, { field, recovery: `Provide a non-empty provider ${field}.` });
64
+ }
65
+ return value;
66
+ }
67
+ static assertOptionalChannel(context, channel) {
68
+ if (channel === undefined)
69
+ return undefined;
70
+ if (typeof channel !== "string" || channel.length === 0) {
71
+ ClientInput.#invalid(context, "channel-invalid", "channel is not a non-empty string.", { field: "channel", recovery: "Provide a non-empty channel name." });
72
+ }
73
+ return channel;
74
+ }
75
+ static assertId(context, field, value) {
76
+ if (!Number.isSafeInteger(value) || value < 1) {
77
+ ClientInput.#invalid(context, "identifier-invalid", `${field} is not a positive safe integer.`, { field, value, recovery: `Provide a valid ${field}.` });
78
+ }
79
+ return value;
80
+ }
81
+ static assertPrompt(context, prompt) {
82
+ if (typeof prompt !== "string" || prompt.length === 0) {
83
+ ClientInput.#invalid(context, "prompt-invalid", "prompt is not a non-empty string.", { field: "prompt", recovery: "Provide a non-empty prompt." });
84
+ }
85
+ return prompt;
86
+ }
87
+ static assertMaxTurns(context, maxTurns) {
88
+ if (maxTurns === undefined)
89
+ return undefined;
90
+ if (!Number.isSafeInteger(maxTurns) || maxTurns < -1) {
91
+ ClientInput.#invalid(context, "max-turns-invalid", "maxTurns is neither -1 nor a non-negative safe integer.", {
92
+ field: "maxTurns",
93
+ value: maxTurns,
94
+ recovery: "Use -1 for no per-call ceiling or a non-negative integer ceiling.",
95
+ });
96
+ }
97
+ return maxTurns;
98
+ }
99
+ static assertOpenPaths(context, openPaths) {
100
+ if (openPaths === undefined)
101
+ return undefined;
102
+ if (!Array.isArray(openPaths)) {
103
+ ClientInput.#invalid(context, "open-paths-invalid", "openPaths is not an array.", { field: "openPaths", recovery: "Provide an array of non-empty paths." });
104
+ }
105
+ for (let i = 0; i < openPaths.length; i++) {
106
+ if (typeof openPaths[i] !== "string" || openPaths[i].length === 0) {
107
+ ClientInput.#invalid(context, "open-path-invalid", `openPaths[${i}] is not a non-empty string.`, { field: `openPaths[${i}]`, recovery: "Provide a non-empty path." });
108
+ }
109
+ }
110
+ return openPaths;
111
+ }
112
+ static assertLimit(context, limit) {
113
+ if (limit === undefined)
114
+ return undefined;
115
+ if (!Number.isSafeInteger(limit) || limit < 1) {
116
+ ClientInput.#invalid(context, "limit-invalid", "limit is not a positive safe integer.", { field: "limit", value: limit, recovery: "Use a positive integer limit." });
117
+ }
118
+ return limit;
119
+ }
120
+ static assertProposalResolution(context, resolution) {
121
+ if (typeof resolution !== "object" || resolution === null || Array.isArray(resolution)) {
122
+ ClientInput.#invalid(context, "proposal-resolution-invalid", "resolution is not an object.", { field: "resolution", recovery: "Provide a proposal decision." });
123
+ }
124
+ const value = resolution;
125
+ const supported = new Set(["decision", "body", "outcome"]);
126
+ for (const key of Object.keys(value)) {
127
+ if (!supported.has(key)) {
128
+ ClientInput.#invalid(context, "proposal-resolution-field-not-supported", `resolution.${key} is not supported.`, {
129
+ field: `resolution.${key}`,
130
+ supportedFields: [...supported],
131
+ recovery: "Remove the unsupported proposal resolution field.",
132
+ });
133
+ }
134
+ }
135
+ if (value.decision !== "accept" && value.decision !== "reject" && value.decision !== "cancel") {
136
+ ClientInput.#invalid(context, "proposal-decision-invalid", "resolution.decision is not accept, reject, or cancel.", {
137
+ field: "resolution.decision",
138
+ allowedDecisions: ["accept", "reject", "cancel"],
139
+ recovery: "Use an allowed proposal decision.",
140
+ });
141
+ }
142
+ if (value.body !== undefined && typeof value.body !== "string") {
143
+ ClientInput.#invalid(context, "proposal-body-invalid", "resolution.body is not a string.", { field: "resolution.body", recovery: "Provide a string body or omit it." });
144
+ }
145
+ if (value.outcome !== undefined && (typeof value.outcome !== "string" || value.outcome.length === 0)) {
146
+ ClientInput.#invalid(context, "proposal-outcome-invalid", "resolution.outcome is not a non-empty string.", { field: "resolution.outcome", recovery: "Provide a non-empty outcome or omit it." });
147
+ }
148
+ return {
149
+ decision: value.decision,
150
+ ...(value.body === undefined ? {} : { body: value.body }),
151
+ ...(value.outcome === undefined ? {} : { outcome: value.outcome }),
152
+ };
153
+ }
20
154
  static assertConstraint(context, effect, glob) {
21
155
  if (typeof effect !== "string" || !CONSTRAINT_EFFECTS.has(effect)) {
22
- throw new Error(`${context}: effect must be one of pick | hide | view | repo`);
156
+ ClientInput.#invalid(context, "constraint-effect-invalid", `Constraint effect ${JSON.stringify(effect)} is not supported.`, {
157
+ field: "effect",
158
+ allowedEffects: [...CONSTRAINT_EFFECTS],
159
+ recovery: "Use one of the allowed constraint effects.",
160
+ });
23
161
  }
24
162
  if (typeof glob !== "string" || glob.length === 0) {
25
- throw new Error(`${context}: glob must be a non-empty string`);
163
+ ClientInput.#invalid(context, "constraint-glob-invalid", "Constraint glob is not a non-empty string.", { field: "glob", recovery: "Provide a non-empty constraint glob." });
26
164
  }
27
165
  }
28
166
  static parseConstraints(raw) {
29
167
  if (raw === undefined || raw === null)
30
168
  return [];
31
- if (!Array.isArray(raw))
32
- throw new Error("workspace.create: constraints must be an array");
169
+ if (!Array.isArray(raw)) {
170
+ ClientInput.#invalid("workspace.create", "constraints-invalid", "constraints is not an array.", { field: "constraints", recovery: "Provide an array of constraint objects." });
171
+ }
33
172
  return raw.map((c, i) => {
173
+ if (typeof c !== "object" || c === null || Array.isArray(c)) {
174
+ ClientInput.#invalid("workspace.create", "constraint-invalid", `constraints[${i}] is not an object.`, {
175
+ field: `constraints[${i}]`,
176
+ recovery: "Provide an object with effect and glob fields.",
177
+ });
178
+ }
34
179
  const e = c;
35
180
  if (typeof e.effect !== "string" || !CONSTRAINT_EFFECTS.has(e.effect)) {
36
- throw new Error(`workspace.create: constraints[${i}].effect must be one of pick | hide | view | repo`);
181
+ ClientInput.#invalid("workspace.create", "constraint-effect-invalid", `constraints[${i}].effect ${JSON.stringify(e.effect)} is not supported.`, {
182
+ field: `constraints[${i}].effect`,
183
+ allowedEffects: [...CONSTRAINT_EFFECTS],
184
+ recovery: "Use one of the allowed constraint effects.",
185
+ });
37
186
  }
38
187
  if (typeof e.glob !== "string" || e.glob.length === 0) {
39
- throw new Error(`workspace.create: constraints[${i}].glob must be a non-empty string`);
188
+ ClientInput.#invalid("workspace.create", "constraint-glob-invalid", `constraints[${i}].glob is not a non-empty string.`, {
189
+ field: `constraints[${i}].glob`,
190
+ recovery: "Provide a non-empty constraint glob.",
191
+ });
40
192
  }
41
193
  return { effect: e.effect, glob: e.glob };
42
194
  });
43
195
  }
44
- // §wait — loop flags are booleans (mode aside); a truthy string silently flipping auto-approval would
45
- // be a review-bypass, so the shape fail-hards at the surface.
196
+ // Loop flags are booleans (mode aside); a truthy string silently flipping
197
+ // auto-approval would be a review bypass, so the public surface rejects it.
46
198
  static normalizeLoopFlags(context, flags) {
47
199
  if (flags === undefined)
48
200
  return undefined;
49
201
  if (typeof flags !== "object" || flags === null || Array.isArray(flags)) {
50
- throw new Error(`${context}: flags must be an object`);
202
+ ClientInput.#invalid(context, "loop-flags-invalid", "flags is not an object.", { field: "flags", recovery: "Provide an object containing supported loop flags." });
51
203
  }
52
204
  const f = flags;
53
205
  const booleanFlags = new Set(["auto", "noProposals", "noWeb", "noInteraction"]);
54
206
  const allowed = new Set([...booleanFlags, "mode"]);
55
207
  for (const key of Object.keys(f)) {
56
- if (!allowed.has(key))
57
- throw new Error(`${context}: flags.${key} is not supported`);
208
+ if (!allowed.has(key)) {
209
+ ClientInput.#invalid(context, "loop-flag-not-supported", `Loop flag '${key}' is not supported.`, {
210
+ field: `flags.${key}`,
211
+ allowedFlags: [...allowed],
212
+ recovery: "Remove the unsupported loop flag.",
213
+ });
214
+ }
58
215
  }
59
216
  for (const bool of booleanFlags) {
60
217
  if (f[bool] !== undefined && typeof f[bool] !== "boolean") {
61
- throw new Error(`${context}: flags.${bool} must be a boolean`);
218
+ ClientInput.#invalid(context, "loop-flag-invalid", `Loop flag '${bool}' is not boolean.`, { field: `flags.${bool}`, recovery: "Use true or false for this loop flag." });
62
219
  }
63
220
  }
64
221
  if (f.mode !== undefined && f.mode !== "ask" && f.mode !== "act") {
65
- throw new Error(`${context}: flags.mode must be 'ask' or 'act'`);
222
+ ClientInput.#invalid(context, "loop-mode-invalid", `Loop mode ${JSON.stringify(f.mode)} is not supported.`, {
223
+ field: "flags.mode",
224
+ allowedModes: ["ask", "act"],
225
+ recovery: "Use loop mode 'ask' or 'act'.",
226
+ });
66
227
  }
67
228
  return f;
68
229
  }
69
- // #231 — validate + serialize the client open-context bag. filesItems is a scalar (replace);
70
- // mdDocs is [{alias, content}] (union'd with env at turn-0). A pre-serialized string passes
71
- // through (a module may serialize at its own edge).
230
+ // {§operator-config} — validate and serialize the client open-context bag. filesItems is a scalar (replace);
231
+ // mdDocs is [{alias, content}] (union'd with env at turn-0). A module may
232
+ // serialize the object at its edge; core still parses and validates it here.
72
233
  static parseSettings(raw) {
73
234
  if (raw === undefined || raw === null)
74
235
  return "{}";
75
- if (typeof raw === "string")
76
- return raw;
77
- if (typeof raw !== "object" || Array.isArray(raw))
78
- throw new Error("workspace.create: settings must be an object");
79
- const r = raw;
236
+ let parsed = raw;
237
+ if (typeof raw === "string") {
238
+ try {
239
+ parsed = JSON.parse(raw);
240
+ }
241
+ catch {
242
+ ClientInput.#invalid("workspace.create", "settings-invalid", "settings is not valid JSON.", { field: "settings", recovery: "Provide a JSON object." });
243
+ }
244
+ }
245
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
246
+ ClientInput.#invalid("workspace.create", "settings-invalid", "settings is not an object.", { field: "settings", recovery: "Provide a settings object." });
247
+ }
248
+ const r = parsed;
249
+ const supported = new Set(["filesItems", "maxCommands", "git", "mdDocs", "client", "execs", "questions"]);
250
+ for (const key of Object.keys(r)) {
251
+ if (!supported.has(key)) {
252
+ ClientInput.#invalid("workspace.create", "setting-not-supported", `settings.${key} is not supported.`, {
253
+ field: `settings.${key}`,
254
+ supportedSettings: [...supported],
255
+ recovery: "Remove the unsupported setting.",
256
+ });
257
+ }
258
+ }
80
259
  const out = {};
81
260
  if (r.filesItems !== undefined) {
82
- if (typeof r.filesItems !== "number" || !Number.isInteger(r.filesItems)) {
83
- throw new Error("workspace.create: settings.filesItems must be an integer (-1 full | 0 off | N first-N)");
261
+ if (typeof r.filesItems !== "number" || !Number.isInteger(r.filesItems) || r.filesItems < -1) {
262
+ ClientInput.#invalid("workspace.create", "setting-invalid", `settings.filesItems ${JSON.stringify(r.filesItems)} is not an integer.`, {
263
+ field: "settings.filesItems",
264
+ recovery: "Use -1 for all files, 0 for none, or a positive first-N limit.",
265
+ });
84
266
  }
85
267
  out.filesItems = r.filesItems;
86
268
  }
87
- // #232 — tighten-only ceilings: a client may narrow, never widen (composed
269
+ // {§operator-config} — tighten-only ceilings: a client may narrow, never widen (composed
88
270
  // most-restrictive-wins at each read-site). maxCommands min()s the env ceiling;
89
271
  // git:false denies git for the workspace (env AND workspace).
90
272
  if (r.maxCommands !== undefined) {
91
273
  if (typeof r.maxCommands !== "number" || !Number.isInteger(r.maxCommands) || r.maxCommands < 0) {
92
- throw new Error("workspace.create: settings.maxCommands must be a non-negative integer (a tighten-only ceiling; 0 = plan + conclude only, no actions)");
274
+ ClientInput.#invalid("workspace.create", "setting-invalid", `settings.maxCommands ${JSON.stringify(r.maxCommands)} is not a non-negative integer.`, {
275
+ field: "settings.maxCommands",
276
+ recovery: "Use a non-negative integer command ceiling.",
277
+ });
93
278
  }
94
279
  out.maxCommands = r.maxCommands;
95
280
  }
96
281
  if (r.git !== undefined) {
97
- if (typeof r.git !== "boolean")
98
- throw new Error("workspace.create: settings.git must be a boolean (false denies git for the workspace)");
282
+ if (typeof r.git !== "boolean") {
283
+ ClientInput.#invalid("workspace.create", "setting-invalid", "settings.git is not boolean.", { field: "settings.git", recovery: "Use true or false for settings.git." });
284
+ }
99
285
  out.git = r.git;
100
286
  }
101
- // §send-300-choices — operator questions: the client AFFIRMATIVELY requests them per
287
+ // {§send-300-choices} — operator questions: the client AFFIRMATIVELY requests them per
102
288
  // workspace (its own PLURNK_QUESTIONS=1 forwarded); enabled = allowed (service env) AND this.
103
289
  if (r.questions !== undefined) {
104
- if (typeof r.questions !== "boolean")
105
- throw new Error("workspace.create: settings.questions must be a boolean (operator questions — [300] — requested for this workspace)");
290
+ if (typeof r.questions !== "boolean") {
291
+ ClientInput.#invalid("workspace.create", "setting-invalid", "settings.questions is not boolean.", { field: "settings.questions", recovery: "Use true or false for settings.questions." });
292
+ }
106
293
  out.questions = r.questions;
107
294
  }
108
- // #249 — workspace-stable frontend id (e.g. "plurnk.nvim/1.4.0"), forwarded to the plurnk
109
- // provider as Plurnk-Client telemetry; ignored by every other provider. Self-identified.
295
+ // {§client-metadata} — workspace-stable frontend id (e.g. "plurnk.nvim/1.4.0"), forwarded to the plurnk
296
+ // provider as Plurnk-Client metadata; ignored by every other provider. Self-identified.
110
297
  if (r.client !== undefined) {
111
298
  if (typeof r.client !== "string" || r.client.length === 0) {
112
- throw new Error("workspace.create: settings.client must be a non-empty string (the frontend id, e.g. 'plurnk.nvim/1.4.0')");
299
+ ClientInput.#invalid("workspace.create", "setting-invalid", "settings.client is not a non-empty string.", { field: "settings.client", recovery: "Provide the client identifier." });
113
300
  }
114
301
  out.client = r.client;
115
302
  }
116
- // #328 — the client's resolved PLURNK_EXECS_* policy subset, verbatim key→value, fed to execs'
117
- // Policy as the per-workspace client layer (subtractive: narrows the boot-registered set, never
118
- // widens). PLURNK_EXECS_MCP_* (server URLs + _HEADERS tokens) MUST NOT ride the wire — refused
119
- // here as defense-in-depth even though the client already excludes them (the bare MCP toggle stays).
303
+ // {§operator-config-workspace-execs} — retain the admitted policy map as
304
+ // the workspace snapshot. MCP connection configuration remains daemon-owned.
120
305
  if (r.execs !== undefined) {
121
306
  if (typeof r.execs !== "object" || r.execs === null || Array.isArray(r.execs)) {
122
- throw new Error("workspace.create: settings.execs must be an object of PLURNK_EXECS_* key→value strings");
307
+ ClientInput.#invalid("workspace.create", "setting-invalid", "settings.execs is not an object.", {
308
+ field: "settings.execs",
309
+ recovery: "Provide an object of PLURNK_EXECS_* string values.",
310
+ });
123
311
  }
124
312
  const execs = {};
125
313
  for (const [k, v] of Object.entries(r.execs)) {
126
- if (!/^PLURNK_EXECS_[A-Za-z0-9_]+$/.test(k))
127
- throw new Error(`workspace.create: settings.execs key '${k}' is not a PLURNK_EXECS_* flag`);
128
- if (/^PLURNK_EXECS_MCP_/i.test(k))
129
- throw new Error(`workspace.create: settings.execs may not carry MCP server config '${k}' — those are not policy and must not ride the wire`);
130
- if (typeof v !== "string")
131
- throw new Error(`workspace.create: settings.execs['${k}'] must be a string`);
314
+ if (/^PLURNK_(?:EXECS_)?MCP_/i.test(k)) {
315
+ ClientInput.#invalid("workspace.create", "mcp-configuration-forbidden", `settings.execs key '${k}' contains MCP server configuration rather than workspace policy.`, { field: `settings.execs.${k}`, recovery: "Configure MCP servers outside workspace settings." });
316
+ }
317
+ if (!Policy.isKey(k)) {
318
+ ClientInput.#invalid("workspace.create", "setting-key-invalid", `settings.execs key '${k}' is not a runtime policy key.`, {
319
+ field: `settings.execs.${k}`,
320
+ recovery: "Use PLURNK_EXECS_ONLY or PLURNK_EXECS_<canonical runtime tag>.",
321
+ });
322
+ }
323
+ if (typeof v !== "string") {
324
+ ClientInput.#invalid("workspace.create", "setting-invalid", `settings.execs['${k}'] is not a string.`, { field: `settings.execs.${k}`, recovery: "Use a string policy value." });
325
+ }
132
326
  execs[k] = v;
133
327
  }
134
328
  out.execs = execs;
135
329
  }
136
330
  if (r.mdDocs !== undefined) {
137
- if (!Array.isArray(r.mdDocs))
138
- throw new Error("workspace.create: settings.mdDocs must be an array");
331
+ if (!Array.isArray(r.mdDocs)) {
332
+ ClientInput.#invalid("workspace.create", "setting-invalid", "settings.mdDocs is not an array.", { field: "settings.mdDocs", recovery: "Provide an array of document objects." });
333
+ }
139
334
  out.mdDocs = r.mdDocs.map((d, i) => {
335
+ if (typeof d !== "object" || d === null || Array.isArray(d)) {
336
+ ClientInput.#invalid("workspace.create", "setting-invalid", `settings.mdDocs[${i}] is not an object.`, {
337
+ field: `settings.mdDocs[${i}]`,
338
+ recovery: "Provide an object with alias and content fields.",
339
+ });
340
+ }
140
341
  const e = d;
141
342
  if (typeof e.alias !== "string" || e.alias.length === 0 || /[^\w.-]/.test(e.alias)) {
142
- throw new Error(`workspace.create: settings.mdDocs[${i}].alias must be a non-empty [\\w.-] string`);
343
+ ClientInput.#invalid("workspace.create", "setting-invalid", `settings.mdDocs[${i}].alias is not a non-empty [\\w.-] string.`, {
344
+ field: `settings.mdDocs[${i}].alias`,
345
+ recovery: "Use a non-empty alias containing letters, digits, underscore, dot, or hyphen.",
346
+ });
347
+ }
348
+ if (typeof e.content !== "string") {
349
+ ClientInput.#invalid("workspace.create", "setting-invalid", `settings.mdDocs[${i}].content is not a string.`, { field: `settings.mdDocs[${i}].content`, recovery: "Provide string document content." });
143
350
  }
144
- if (typeof e.content !== "string")
145
- throw new Error(`workspace.create: settings.mdDocs[${i}].content must be a string`);
146
351
  return { alias: e.alias, content: e.content };
147
352
  });
148
353
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client-input.js","sourceRoot":"","sources":["../../src/server/client-input.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client-input.js","sourceRoot":"","sources":["../../src/server/client-input.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { PlurnkStatement } from "@plurnk/plurnk-grammar";
1
+ import type { PlurnkStatement } from "@plurnk/plurnk-contracts";
2
2
  import type { Db } from "../core/Db.ts";
3
3
  import type Engine from "../core/Engine.ts";
4
4
  export default class DispatchAsPlurnk {
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-as-plurnk.d.ts","sourceRoot":"","sources":["../../src/server/dispatch-as-plurnk.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAI5C,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACjC,OAAa,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B/G;CACJ"}
1
+ {"version":3,"file":"dispatch-as-plurnk.d.ts","sourceRoot":"","sources":["../../src/server/dispatch-as-plurnk.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAK5C,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACjC,OAAa,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C/G;CACJ"}
@@ -1,19 +1,20 @@
1
- // Self-hosting keystone (SPEC §actor-boundary, §actor-boundary-self-hosting): the runtime acting as an ordinary `plurnk`
1
+ // Self-hosting keystone (SPEC {§actor-boundary}, {§actor-boundary-self-hosting}): the runtime acting as an ordinary `plurnk`
2
2
  // actor. Uses the workspace's reserved plurnk worker, opens an ephemeral loop+turn,
3
3
  // and fires ops through Engine.dispatch with origin=plurnk — the same path the
4
4
  // model and clients use. Mirrors _dispatchAsClient, but the work is the
5
5
  // runtime's own (e.g. materializing operator doc entries). The ops land in the
6
6
  // plurnk worker's log, NOT the model's; other workers see only the resulting
7
- // workspace-scoped entries through the shared filesystem (§machine-processes), never the log.
7
+ // commons-owned entries through the shared filesystem ({§machine-processes}), never the log.
8
8
  import Envelope from "./envelope.js";
9
- import ClientTurn from "./clientTurn.js";
9
+ import JournalTurn from "../core/JournalTurn.js";
10
+ import Results, { OperationFailureError } from "../core/results.js";
10
11
  export default class DispatchAsPlurnk {
11
12
  static async dispatch(engine, db, workspaceId, statements) {
12
13
  if (statements.length === 0)
13
14
  return;
14
15
  const workerId = await Envelope.ensurePlurnkWorker(db, workspaceId);
15
16
  const loopId = await Envelope.ensureClientLoop(db, workerId);
16
- const turnId = await ClientTurn.insertClientTurn(db, loopId);
17
+ const { id: turnId } = await JournalTurn.insert(db, loopId);
17
18
  let sequence = 1;
18
19
  try {
19
20
  for (const statement of statements) {
@@ -22,14 +23,21 @@ export default class DispatchAsPlurnk {
22
23
  sequence: sequence++, origin: "plurnk",
23
24
  });
24
25
  if (result.status >= 400) {
25
- throw new Error(`plurnk actor ${statement.op} failed with status ${result.status}`);
26
+ throw new OperationFailureError(result);
26
27
  }
27
28
  }
28
- await Envelope.closeClientLoop(db, loopId, 200);
29
+ await Envelope.closeClientLoop(db, loopId, { status: 200 });
29
30
  }
30
31
  catch (cause) {
32
+ console.error(`Plurnk actor dispatch failed for loop ${loopId}:`, cause);
33
+ const failure = cause instanceof OperationFailureError
34
+ ? cause.result
35
+ : Results.failure("daemon:plurnk-actor", "dispatch-threw", 500, "The Plurnk actor failed outside its operation result contract.", {}, {
36
+ stage: "dispatch",
37
+ retryable: false,
38
+ });
31
39
  try {
32
- await Envelope.closeClientLoop(db, loopId, 499);
40
+ await Envelope.closeClientLoop(db, loopId, failure);
33
41
  }
34
42
  catch (closeCause) {
35
43
  throw new AggregateError([cause, closeCause], `plurnk actor loop ${loopId} failed and could not be closed`);
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-as-plurnk.js","sourceRoot":"","sources":["../../src/server/dispatch-as-plurnk.ts"],"names":[],"mappings":"AAAA,yHAAyH;AACzH,oFAAoF;AACpF,+EAA+E;AAC/E,wEAAwE;AACxE,+EAA+E;AAC/E,6EAA6E;AAC7E,8FAA8F;AAK9F,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,UAAU,MAAM,iBAAiB,CAAC;AAEzC,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACjC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,EAAM,EAAE,WAAmB,EAAE,UAA6B;QAC5F,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACpC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC;YACD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;oBACjC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;oBAChD,QAAQ,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ;iBACzC,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CAAC,gBAAgB,SAAS,CAAC,EAAE,uBAAuB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBACxF,CAAC;YACL,CAAC;YACD,MAAM,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC;gBACD,MAAM,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBAClB,MAAM,IAAI,cAAc,CACpB,CAAC,KAAK,EAAE,UAAU,CAAC,EACnB,qBAAqB,MAAM,iCAAiC,CAC/D,CAAC;YACN,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;CACJ"}
1
+ {"version":3,"file":"dispatch-as-plurnk.js","sourceRoot":"","sources":["../../src/server/dispatch-as-plurnk.ts"],"names":[],"mappings":"AAAA,6HAA6H;AAC7H,oFAAoF;AACpF,+EAA+E;AAC/E,wEAAwE;AACxE,+EAA+E;AAC/E,6EAA6E;AAC7E,6FAA6F;AAK7F,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,WAAW,MAAM,wBAAwB,CAAC;AACjD,OAAO,OAAO,EAAE,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEpE,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACjC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,EAAM,EAAE,WAAmB,EAAE,UAA6B;QAC5F,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACpC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC7D,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC;YACD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;oBACjC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;oBAChD,QAAQ,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ;iBACzC,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;oBACvB,MAAM,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;gBAC5C,CAAC;YACL,CAAC;YACD,MAAM,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,yCAAyC,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC;YACzE,MAAM,OAAO,GAAG,KAAK,YAAY,qBAAqB;gBAClD,CAAC,CAAC,KAAK,CAAC,MAAM;gBACd,CAAC,CAAC,OAAO,CAAC,OAAO,CACb,qBAAqB,EACrB,gBAAgB,EAChB,GAAG,EACH,gEAAgE,EAChE,EAAE,EACF;oBACI,KAAK,EAAE,UAAU;oBACjB,SAAS,EAAE,KAAK;iBACnB,CACJ,CAAC;YACN,IAAI,CAAC;gBACD,MAAM,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBAClB,MAAM,IAAI,cAAc,CACpB,CAAC,KAAK,EAAE,UAAU,CAAC,EACnB,qBAAqB,MAAM,iCAAiC,CAC/D,CAAC;YACN,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;CACJ"}