@plurnk/plurnk-service 1.0.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 (343) hide show
  1. package/.env.defaults +208 -0
  2. package/INSTALL.md +69 -0
  3. package/LICENSE +21 -0
  4. package/README.md +46 -0
  5. package/SPEC.md +1511 -0
  6. package/dist/Paths.d.ts +13 -0
  7. package/dist/Paths.d.ts.map +1 -0
  8. package/dist/Paths.js +60 -0
  9. package/dist/Paths.js.map +1 -0
  10. package/dist/content/edited-span.d.ts +2 -0
  11. package/dist/content/edited-span.d.ts.map +1 -0
  12. package/dist/content/edited-span.js +33 -0
  13. package/dist/content/edited-span.js.map +1 -0
  14. package/dist/content/index.d.ts +10 -0
  15. package/dist/content/index.d.ts.map +1 -0
  16. package/dist/content/index.js +11 -0
  17. package/dist/content/index.js.map +1 -0
  18. package/dist/content/line-marker.d.ts +15 -0
  19. package/dist/content/line-marker.d.ts.map +1 -0
  20. package/dist/content/line-marker.js +21 -0
  21. package/dist/content/line-marker.js.map +1 -0
  22. package/dist/content/matcher.d.ts +44 -0
  23. package/dist/content/matcher.d.ts.map +1 -0
  24. package/dist/content/matcher.js +126 -0
  25. package/dist/content/matcher.js.map +1 -0
  26. package/dist/content/mimetype-binary.d.ts +8 -0
  27. package/dist/content/mimetype-binary.d.ts.map +1 -0
  28. package/dist/content/mimetype-binary.js +17 -0
  29. package/dist/content/mimetype-binary.js.map +1 -0
  30. package/dist/content/path-mimetype.d.ts +5 -0
  31. package/dist/content/path-mimetype.d.ts.map +1 -0
  32. package/dist/content/path-mimetype.js +15 -0
  33. package/dist/content/path-mimetype.js.map +1 -0
  34. package/dist/content/read-resolve.d.ts +20 -0
  35. package/dist/content/read-resolve.d.ts.map +1 -0
  36. package/dist/content/read-resolve.js +68 -0
  37. package/dist/content/read-resolve.js.map +1 -0
  38. package/dist/core/ChannelWrite.d.ts +100 -0
  39. package/dist/core/ChannelWrite.d.ts.map +1 -0
  40. package/dist/core/ChannelWrite.js +112 -0
  41. package/dist/core/ChannelWrite.js.map +1 -0
  42. package/dist/core/ChannelWrite.sql +84 -0
  43. package/dist/core/Db.d.ts +14 -0
  44. package/dist/core/Db.d.ts.map +1 -0
  45. package/dist/core/Db.js +7 -0
  46. package/dist/core/Db.js.map +1 -0
  47. package/dist/core/Dispatcher.d.ts +67 -0
  48. package/dist/core/Dispatcher.d.ts.map +1 -0
  49. package/dist/core/Dispatcher.js +1021 -0
  50. package/dist/core/Dispatcher.js.map +1 -0
  51. package/dist/core/Engine.d.ts +113 -0
  52. package/dist/core/Engine.d.ts.map +1 -0
  53. package/dist/core/Engine.js +1410 -0
  54. package/dist/core/Engine.js.map +1 -0
  55. package/dist/core/Engine.sql +538 -0
  56. package/dist/core/EnvFlags.d.ts +13 -0
  57. package/dist/core/EnvFlags.d.ts.map +1 -0
  58. package/dist/core/EnvFlags.js +84 -0
  59. package/dist/core/EnvFlags.js.map +1 -0
  60. package/dist/core/ExecutorRegistry.d.ts +45 -0
  61. package/dist/core/ExecutorRegistry.d.ts.map +1 -0
  62. package/dist/core/ExecutorRegistry.js +128 -0
  63. package/dist/core/ExecutorRegistry.js.map +1 -0
  64. package/dist/core/PacketBuilder.d.ts +67 -0
  65. package/dist/core/PacketBuilder.d.ts.map +1 -0
  66. package/dist/core/PacketBuilder.js +524 -0
  67. package/dist/core/PacketBuilder.js.map +1 -0
  68. package/dist/core/PluginLoader.d.ts +17 -0
  69. package/dist/core/PluginLoader.d.ts.map +1 -0
  70. package/dist/core/PluginLoader.js +97 -0
  71. package/dist/core/PluginLoader.js.map +1 -0
  72. package/dist/core/ProposalLifecycle.d.ts +59 -0
  73. package/dist/core/ProposalLifecycle.d.ts.map +1 -0
  74. package/dist/core/ProposalLifecycle.js +215 -0
  75. package/dist/core/ProposalLifecycle.js.map +1 -0
  76. package/dist/core/ProviderInstantiate.d.ts +9 -0
  77. package/dist/core/ProviderInstantiate.d.ts.map +1 -0
  78. package/dist/core/ProviderInstantiate.js +156 -0
  79. package/dist/core/ProviderInstantiate.js.map +1 -0
  80. package/dist/core/SchemeRegistry.d.ts +26 -0
  81. package/dist/core/SchemeRegistry.d.ts.map +1 -0
  82. package/dist/core/SchemeRegistry.js +205 -0
  83. package/dist/core/SchemeRegistry.js.map +1 -0
  84. package/dist/core/StrikeRail.d.ts +28 -0
  85. package/dist/core/StrikeRail.d.ts.map +1 -0
  86. package/dist/core/StrikeRail.js +165 -0
  87. package/dist/core/StrikeRail.js.map +1 -0
  88. package/dist/core/TelemetryChannel.d.ts +37 -0
  89. package/dist/core/TelemetryChannel.d.ts.map +1 -0
  90. package/dist/core/TelemetryChannel.js +77 -0
  91. package/dist/core/TelemetryChannel.js.map +1 -0
  92. package/dist/core/TokenGauge.d.ts +16 -0
  93. package/dist/core/TokenGauge.d.ts.map +1 -0
  94. package/dist/core/TokenGauge.js +58 -0
  95. package/dist/core/TokenGauge.js.map +1 -0
  96. package/dist/core/caps/CapsResolve.d.ts +5 -0
  97. package/dist/core/caps/CapsResolve.d.ts.map +1 -0
  98. package/dist/core/caps/CapsResolve.js +13 -0
  99. package/dist/core/caps/CapsResolve.js.map +1 -0
  100. package/dist/core/caps/DbChannelCaps.d.ts +16 -0
  101. package/dist/core/caps/DbChannelCaps.d.ts.map +1 -0
  102. package/dist/core/caps/DbChannelCaps.js +41 -0
  103. package/dist/core/caps/DbChannelCaps.js.map +1 -0
  104. package/dist/core/caps/DbEntryCaps.d.ts +19 -0
  105. package/dist/core/caps/DbEntryCaps.d.ts.map +1 -0
  106. package/dist/core/caps/DbEntryCaps.js +28 -0
  107. package/dist/core/caps/DbEntryCaps.js.map +1 -0
  108. package/dist/core/caps/DbNotifyCaps.d.ts +8 -0
  109. package/dist/core/caps/DbNotifyCaps.d.ts.map +1 -0
  110. package/dist/core/caps/DbNotifyCaps.js +35 -0
  111. package/dist/core/caps/DbNotifyCaps.js.map +1 -0
  112. package/dist/core/caps/DbSubscriptionCaps.d.ts +10 -0
  113. package/dist/core/caps/DbSubscriptionCaps.d.ts.map +1 -0
  114. package/dist/core/caps/DbSubscriptionCaps.js +86 -0
  115. package/dist/core/caps/DbSubscriptionCaps.js.map +1 -0
  116. package/dist/core/caps/DbTagCaps.d.ts +17 -0
  117. package/dist/core/caps/DbTagCaps.d.ts.map +1 -0
  118. package/dist/core/caps/DbTagCaps.js +37 -0
  119. package/dist/core/caps/DbTagCaps.js.map +1 -0
  120. package/dist/core/caps/SchemeCtxImpl.d.ts +18 -0
  121. package/dist/core/caps/SchemeCtxImpl.d.ts.map +1 -0
  122. package/dist/core/caps/SchemeCtxImpl.js +42 -0
  123. package/dist/core/caps/SchemeCtxImpl.js.map +1 -0
  124. package/dist/core/env-defaults.d.ts +19 -0
  125. package/dist/core/env-defaults.d.ts.map +1 -0
  126. package/dist/core/env-defaults.js +89 -0
  127. package/dist/core/env-defaults.js.map +1 -0
  128. package/dist/core/fork.d.ts +6 -0
  129. package/dist/core/fork.d.ts.map +1 -0
  130. package/dist/core/fork.js +84 -0
  131. package/dist/core/fork.js.map +1 -0
  132. package/dist/core/fork.sql +85 -0
  133. package/dist/core/git-membership.d.ts +23 -0
  134. package/dist/core/git-membership.d.ts.map +1 -0
  135. package/dist/core/git-membership.js +366 -0
  136. package/dist/core/git-membership.js.map +1 -0
  137. package/dist/core/git-state.d.ts +15 -0
  138. package/dist/core/git-state.d.ts.map +1 -0
  139. package/dist/core/git-state.js +67 -0
  140. package/dist/core/git-state.js.map +1 -0
  141. package/dist/core/packet-inject.d.ts +5 -0
  142. package/dist/core/packet-inject.d.ts.map +1 -0
  143. package/dist/core/packet-inject.js +48 -0
  144. package/dist/core/packet-inject.js.map +1 -0
  145. package/dist/core/packet-wire.d.ts +46 -0
  146. package/dist/core/packet-wire.d.ts.map +1 -0
  147. package/dist/core/packet-wire.js +453 -0
  148. package/dist/core/packet-wire.js.map +1 -0
  149. package/dist/core/path-decode.d.ts +2 -0
  150. package/dist/core/path-decode.d.ts.map +1 -0
  151. package/dist/core/path-decode.js +8 -0
  152. package/dist/core/path-decode.js.map +1 -0
  153. package/dist/core/plugin-attribution.d.ts +5 -0
  154. package/dist/core/plugin-attribution.d.ts.map +1 -0
  155. package/dist/core/plugin-attribution.js +39 -0
  156. package/dist/core/plugin-attribution.js.map +1 -0
  157. package/dist/core/plurnk-uri.d.ts +7 -0
  158. package/dist/core/plurnk-uri.d.ts.map +1 -0
  159. package/dist/core/plurnk-uri.js +52 -0
  160. package/dist/core/plurnk-uri.js.map +1 -0
  161. package/dist/core/resolveForLoop.d.ts +5 -0
  162. package/dist/core/resolveForLoop.d.ts.map +1 -0
  163. package/dist/core/resolveForLoop.js +12 -0
  164. package/dist/core/resolveForLoop.js.map +1 -0
  165. package/dist/core/results.d.ts +12 -0
  166. package/dist/core/results.d.ts.map +1 -0
  167. package/dist/core/results.js +27 -0
  168. package/dist/core/results.js.map +1 -0
  169. package/dist/core/run-cap.d.ts +8 -0
  170. package/dist/core/run-cap.d.ts.map +1 -0
  171. package/dist/core/run-cap.js +20 -0
  172. package/dist/core/run-cap.js.map +1 -0
  173. package/dist/core/run-ops.sql +43 -0
  174. package/dist/core/scheme-types.d.ts +45 -0
  175. package/dist/core/scheme-types.d.ts.map +1 -0
  176. package/dist/core/scheme-types.js +6 -0
  177. package/dist/core/scheme-types.js.map +1 -0
  178. package/dist/core/session-settings.d.ts +23 -0
  179. package/dist/core/session-settings.d.ts.map +1 -0
  180. package/dist/core/session-settings.js +55 -0
  181. package/dist/core/session-settings.js.map +1 -0
  182. package/dist/core/teaching.d.ts +3 -0
  183. package/dist/core/teaching.d.ts.map +1 -0
  184. package/dist/core/teaching.js +13 -0
  185. package/dist/core/teaching.js.map +1 -0
  186. package/dist/core/types.d.ts +3 -0
  187. package/dist/core/types.d.ts.map +1 -0
  188. package/dist/core/types.js +2 -0
  189. package/dist/core/types.js.map +1 -0
  190. package/dist/digest/Digest.d.ts +20 -0
  191. package/dist/digest/Digest.d.ts.map +1 -0
  192. package/dist/digest/Digest.js +451 -0
  193. package/dist/digest/Digest.js.map +1 -0
  194. package/dist/digest/Digest.sql +1 -0
  195. package/dist/digest/digest.sql +55 -0
  196. package/dist/index.d.ts +18 -0
  197. package/dist/index.d.ts.map +1 -0
  198. package/dist/index.js +28 -0
  199. package/dist/index.js.map +1 -0
  200. package/dist/schemes/EffectPolicy.d.ts +6 -0
  201. package/dist/schemes/EffectPolicy.d.ts.map +1 -0
  202. package/dist/schemes/EffectPolicy.js +18 -0
  203. package/dist/schemes/EffectPolicy.js.map +1 -0
  204. package/dist/schemes/Exec.d.ts +39 -0
  205. package/dist/schemes/Exec.d.ts.map +1 -0
  206. package/dist/schemes/Exec.js +510 -0
  207. package/dist/schemes/Exec.js.map +1 -0
  208. package/dist/schemes/ExecOutputScheme.d.ts +20 -0
  209. package/dist/schemes/ExecOutputScheme.d.ts.map +1 -0
  210. package/dist/schemes/ExecOutputScheme.js +39 -0
  211. package/dist/schemes/ExecOutputScheme.js.map +1 -0
  212. package/dist/schemes/File.d.ts +42 -0
  213. package/dist/schemes/File.d.ts.map +1 -0
  214. package/dist/schemes/File.js +356 -0
  215. package/dist/schemes/File.js.map +1 -0
  216. package/dist/schemes/Known.d.ts +17 -0
  217. package/dist/schemes/Known.d.ts.map +1 -0
  218. package/dist/schemes/Known.js +40 -0
  219. package/dist/schemes/Known.js.map +1 -0
  220. package/dist/schemes/Log.d.ts +22 -0
  221. package/dist/schemes/Log.d.ts.map +1 -0
  222. package/dist/schemes/Log.js +269 -0
  223. package/dist/schemes/Log.js.map +1 -0
  224. package/dist/schemes/Log.sql +59 -0
  225. package/dist/schemes/Plurnk.d.ts +17 -0
  226. package/dist/schemes/Plurnk.d.ts.map +1 -0
  227. package/dist/schemes/Plurnk.js +46 -0
  228. package/dist/schemes/Plurnk.js.map +1 -0
  229. package/dist/schemes/Run.d.ts +25 -0
  230. package/dist/schemes/Run.d.ts.map +1 -0
  231. package/dist/schemes/Run.js +172 -0
  232. package/dist/schemes/Run.js.map +1 -0
  233. package/dist/schemes/Skill.d.ts +17 -0
  234. package/dist/schemes/Skill.d.ts.map +1 -0
  235. package/dist/schemes/Skill.js +40 -0
  236. package/dist/schemes/Skill.js.map +1 -0
  237. package/dist/schemes/Unknown.d.ts +17 -0
  238. package/dist/schemes/Unknown.d.ts.map +1 -0
  239. package/dist/schemes/Unknown.js +39 -0
  240. package/dist/schemes/Unknown.js.map +1 -0
  241. package/dist/schemes/_entry-chunk.d.ts +11 -0
  242. package/dist/schemes/_entry-chunk.d.ts.map +1 -0
  243. package/dist/schemes/_entry-chunk.js +100 -0
  244. package/dist/schemes/_entry-chunk.js.map +1 -0
  245. package/dist/schemes/_entry-crud.d.ts +31 -0
  246. package/dist/schemes/_entry-crud.d.ts.map +1 -0
  247. package/dist/schemes/_entry-crud.js +77 -0
  248. package/dist/schemes/_entry-crud.js.map +1 -0
  249. package/dist/schemes/_entry-crud.sql +101 -0
  250. package/dist/schemes/_entry-find.d.ts +32 -0
  251. package/dist/schemes/_entry-find.d.ts.map +1 -0
  252. package/dist/schemes/_entry-find.js +226 -0
  253. package/dist/schemes/_entry-find.js.map +1 -0
  254. package/dist/schemes/_entry-find.sql +54 -0
  255. package/dist/schemes/_entry-graph.d.ts +16 -0
  256. package/dist/schemes/_entry-graph.d.ts.map +1 -0
  257. package/dist/schemes/_entry-graph.js +94 -0
  258. package/dist/schemes/_entry-graph.js.map +1 -0
  259. package/dist/schemes/_entry-graph.sql +52 -0
  260. package/dist/schemes/_entry-manifest.d.ts +25 -0
  261. package/dist/schemes/_entry-manifest.d.ts.map +1 -0
  262. package/dist/schemes/_entry-manifest.js +266 -0
  263. package/dist/schemes/_entry-manifest.js.map +1 -0
  264. package/dist/schemes/_entry-ops.d.ts +32 -0
  265. package/dist/schemes/_entry-ops.d.ts.map +1 -0
  266. package/dist/schemes/_entry-ops.js +216 -0
  267. package/dist/schemes/_entry-ops.js.map +1 -0
  268. package/dist/schemes/_entry-ops.sql +31 -0
  269. package/dist/schemes/_entry-semantic.d.ts +38 -0
  270. package/dist/schemes/_entry-semantic.d.ts.map +1 -0
  271. package/dist/schemes/_entry-semantic.js +202 -0
  272. package/dist/schemes/_entry-semantic.js.map +1 -0
  273. package/dist/schemes/_entry-semantic.sql +95 -0
  274. package/dist/schemes/_entry-send.d.ts +11 -0
  275. package/dist/schemes/_entry-send.d.ts.map +1 -0
  276. package/dist/schemes/_entry-send.js +66 -0
  277. package/dist/schemes/_entry-send.js.map +1 -0
  278. package/dist/schemes/cosine.d.ts +4 -0
  279. package/dist/schemes/cosine.d.ts.map +1 -0
  280. package/dist/schemes/cosine.js +9 -0
  281. package/dist/schemes/cosine.js.map +1 -0
  282. package/dist/schemes/exec-abort.d.ts +15 -0
  283. package/dist/schemes/exec-abort.d.ts.map +1 -0
  284. package/dist/schemes/exec-abort.js +29 -0
  285. package/dist/schemes/exec-abort.js.map +1 -0
  286. package/dist/schemes/exec-env.d.ts +5 -0
  287. package/dist/schemes/exec-env.d.ts.map +1 -0
  288. package/dist/schemes/exec-env.js +34 -0
  289. package/dist/schemes/exec-env.js.map +1 -0
  290. package/dist/server/Daemon.d.ts +244 -0
  291. package/dist/server/Daemon.d.ts.map +1 -0
  292. package/dist/server/Daemon.js +1119 -0
  293. package/dist/server/Daemon.js.map +1 -0
  294. package/dist/server/client-input.d.ts +11 -0
  295. package/dist/server/client-input.d.ts.map +1 -0
  296. package/dist/server/client-input.js +145 -0
  297. package/dist/server/client-input.js.map +1 -0
  298. package/dist/server/clientTurn.d.ts +6 -0
  299. package/dist/server/clientTurn.d.ts.map +1 -0
  300. package/dist/server/clientTurn.js +23 -0
  301. package/dist/server/clientTurn.js.map +1 -0
  302. package/dist/server/clientTurn.sql +10 -0
  303. package/dist/server/dispatch-as-plurnk.d.ts +7 -0
  304. package/dist/server/dispatch-as-plurnk.d.ts.map +1 -0
  305. package/dist/server/dispatch-as-plurnk.js +23 -0
  306. package/dist/server/dispatch-as-plurnk.js.map +1 -0
  307. package/dist/server/drain.sql +124 -0
  308. package/dist/server/envelope.d.ts +53 -0
  309. package/dist/server/envelope.d.ts.map +1 -0
  310. package/dist/server/envelope.js +172 -0
  311. package/dist/server/envelope.js.map +1 -0
  312. package/dist/server/envelope.sql +76 -0
  313. package/dist/server/logEntry.d.ts +35 -0
  314. package/dist/server/logEntry.d.ts.map +1 -0
  315. package/dist/server/logEntry.js +49 -0
  316. package/dist/server/logEntry.js.map +1 -0
  317. package/dist/server/logEntry.sql +10 -0
  318. package/dist/server/loopDocs.d.ts +6 -0
  319. package/dist/server/loopDocs.d.ts.map +1 -0
  320. package/dist/server/loopDocs.js +22 -0
  321. package/dist/server/loopDocs.js.map +1 -0
  322. package/dist/server/noProposals.d.ts +6 -0
  323. package/dist/server/noProposals.d.ts.map +1 -0
  324. package/dist/server/noProposals.js +37 -0
  325. package/dist/server/noProposals.js.map +1 -0
  326. package/dist/server/seam-entry-read.sql +21 -0
  327. package/dist/server/seam-log-read.sql +21 -0
  328. package/dist/server/seam-loop.sql +9 -0
  329. package/dist/server/seam-proposal-list.sql +13 -0
  330. package/dist/server/version-info.d.ts +14 -0
  331. package/dist/server/version-info.d.ts.map +1 -0
  332. package/dist/server/version-info.js +69 -0
  333. package/dist/server/version-info.js.map +1 -0
  334. package/dist/server/yolo.d.ts +6 -0
  335. package/dist/server/yolo.d.ts.map +1 -0
  336. package/dist/server/yolo.js +64 -0
  337. package/dist/server/yolo.js.map +1 -0
  338. package/dist/service.d.ts +6 -0
  339. package/dist/service.d.ts.map +1 -0
  340. package/dist/service.js +309 -0
  341. package/dist/service.js.map +1 -0
  342. package/migrations/0000-00-00.01_schema.sql +500 -0
  343. package/package.json +86 -0
@@ -0,0 +1,18 @@
1
+ // Service-owned policy: maps an executor-declared `effect` to the proposal
2
+ // lifecycle. The executor declares the FACT (does this invocation mutate the
3
+ // host?); the service decides the POLICY (does it need a human gate?).
4
+ //
5
+ // Default (plurnk-service#182): `host` runs code / mutates the host → propose;
6
+ // `read` (observes external state) and `pure` (no observable effect) are
7
+ // side-effect-free → auto-run, no human in the loop. Conservative by
8
+ // construction — an undeclared/unknown effect classifies as `host` upstream
9
+ // (BaseExecutor.effect defaults to host), so it lands here as propose.
10
+ //
11
+ // Deployment-tunability (a high-security deployment proposing even `read`) is a
12
+ // later env knob; the default map is the contract until one is needed.
13
+ export default class EffectPolicy {
14
+ static decide(effect) {
15
+ return effect === "host" ? "propose" : "auto";
16
+ }
17
+ }
18
+ //# sourceMappingURL=EffectPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EffectPolicy.js","sourceRoot":"","sources":["../../src/schemes/EffectPolicy.ts"],"names":[],"mappings":"AAIA,2EAA2E;AAC3E,6EAA6E;AAC7E,uEAAuE;AACvE,EAAE;AACF,+EAA+E;AAC/E,yEAAyE;AACzE,qEAAqE;AACrE,4EAA4E;AAC5E,uEAAuE;AACvE,EAAE;AACF,gFAAgF;AAChF,uEAAuE;AACvE,MAAM,CAAC,OAAO,OAAO,YAAY;IAC7B,MAAM,CAAC,MAAM,CAAC,MAAc;QACxB,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAClD,CAAC;CACJ"}
@@ -0,0 +1,39 @@
1
+ import type { ExecStatement, FindStatement, ReadStatement } from "@plurnk/plurnk-grammar";
2
+ import type { SchemeManifest, PlurnkSchemeContext } from "../core/scheme-types.ts";
3
+ import type { ReadResult } from "./_entry-ops.ts";
4
+ import type { EntryData, ReadEntryResult, WriteEntryResult, DeleteEntryResult } from "./_entry-crud.ts";
5
+ import type { FindResult } from "./_entry-find.ts";
6
+ type ExecResult = {
7
+ status: number;
8
+ body?: string;
9
+ attrs?: object;
10
+ error?: string;
11
+ };
12
+ export default class Exec {
13
+ #private;
14
+ static manifest: SchemeManifest;
15
+ idle(): Promise<void>;
16
+ hasActiveSpawns(runId: number): boolean;
17
+ hasActiveHoldSpawns(runId: number, holdSet: ReadonlySet<string>): boolean;
18
+ kill(pathname: string, signal: number | null, ctx: PlurnkSchemeContext): Promise<{
19
+ status: number;
20
+ error?: string;
21
+ }>;
22
+ abortSubscription(subscriptionId: number): void;
23
+ exec(statement: ExecStatement, ctx: PlurnkSchemeContext): Promise<ExecResult>;
24
+ applyResolution(args: {
25
+ attrs: object;
26
+ body?: string;
27
+ }, ctx: PlurnkSchemeContext): Promise<{
28
+ status: number;
29
+ outcome?: string;
30
+ body?: string;
31
+ }>;
32
+ read(statement: ReadStatement, ctx: PlurnkSchemeContext): Promise<ReadResult>;
33
+ find(statement: FindStatement, ctx: PlurnkSchemeContext): Promise<FindResult>;
34
+ readEntry(pathname: string, ctx: PlurnkSchemeContext): Promise<ReadEntryResult>;
35
+ writeEntry(pathname: string, entry: EntryData, ctx: PlurnkSchemeContext): Promise<WriteEntryResult>;
36
+ deleteEntry(pathname: string, ctx: PlurnkSchemeContext): Promise<DeleteEntryResult>;
37
+ }
38
+ export {};
39
+ //# sourceMappingURL=Exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Exec.d.ts","sourceRoot":"","sources":["../../src/schemes/Exec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAkB,MAAM,wBAAwB,CAAC;AAM1G,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAKnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AASnD,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAsDpF,MAAM,CAAC,OAAO,OAAO,IAAI;;IACrB,MAAM,CAAC,QAAQ,EAAE,cAAc,CAc7B;IAKI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1B;IAMD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGtC;IAMD,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAGxE;IASK,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAYzH;IAQD,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAE9C;IAUK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CA+ElF;IAEK,eAAe,CACjB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EACtC,GAAG,EAAE,mBAAmB,GACzB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAgG9D;IAmLK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAElF;IAEK,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAElF;IAEK,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CAEpF;IAEK,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAExG;IAEK,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAExF;CACJ"}
@@ -0,0 +1,510 @@
1
+ import { parsePath } from "@plurnk/plurnk-grammar";
2
+ import { Policy } from "@plurnk/plurnk-execs";
3
+ import SessionSettings from "../core/session-settings.js";
4
+ import EffectPolicy from "./EffectPolicy.js";
5
+ import EntryOps from "./_entry-ops.js";
6
+ import EntryCrud from "./_entry-crud.js";
7
+ import { foldAuthorityIntoPath } from "../core/plurnk-uri.js";
8
+ import EntryFind from "./_entry-find.js";
9
+ import ChannelWrite from "../core/ChannelWrite.js";
10
+ import ExecEnv from "./exec-env.js";
11
+ import ExecAbort from "./exec-abort.js";
12
+ import { writeFile, unlink } from "node:fs/promises";
13
+ import { tmpdir } from "node:os";
14
+ import { join } from "node:path";
15
+ // Executors are discovered + probed at boot into ExecutorRegistry and reach
16
+ // the scheme through ctx.executors (plurnk-service#181). Each runtime tag
17
+ // resolves to its sibling executor; the scheme itself stays runtime-agnostic.
18
+ // Per plurnk.md, EXEC's target slot is `cwd`. ParsedPath there means a
19
+ // bare local path or file:/// URL — both decode to a filesystem directory.
20
+ // Anything else is rejected at proposal time.
21
+ const cwdFromTarget = (target) => {
22
+ if (target === null)
23
+ return null;
24
+ if (target.kind === "local")
25
+ return target.raw;
26
+ if (target.kind === "url" && (target.scheme === null || target.scheme === "file")) {
27
+ return target.pathname;
28
+ }
29
+ return null;
30
+ };
31
+ // #201 — a plurnk-scheme target (known/exec/log/…), distinct from file/local
32
+ // (which cwdFromTarget handles as a path). Its content is resolved at apply-time;
33
+ // executors stay scheme-blind (SPEC §5), so the scheme — not the executor — reads it.
34
+ const schemeTargetOf = (target) => {
35
+ if (target === null || target.kind !== "url")
36
+ return null;
37
+ if (target.scheme === null || target.scheme === "file")
38
+ return null;
39
+ return { scheme: target.scheme, pathname: target.pathname, fragment: target.fragment };
40
+ };
41
+ // EXEC's pathname is <runtime>/<loop_seq>/<turn_seq>/<sequence> (stamped by
42
+ // Dispatcher.#writeLog). Exec owns this convention, so it — not the client — turns
43
+ // the pathname into the entry's coordinate, mirrored onto stream payloads so
44
+ // waterfall clients read fields instead of parsing the URI (#224). The
45
+ // coordinate is the trailing three segments (runtime-agnostic); a pathname that
46
+ // isn't a numeric triple yields undefined (no coordinate on the wire).
47
+ const coordinateFromPathname = (pathname) => {
48
+ const seg = pathname.split("/").filter(Boolean);
49
+ if (seg.length < 3)
50
+ return undefined;
51
+ const [loop_seq, turn_seq, sequence] = seg.slice(-3).map(Number);
52
+ if (![loop_seq, turn_seq, sequence].every(Number.isInteger))
53
+ return undefined;
54
+ return { loop_seq, turn_seq, sequence };
55
+ };
56
+ export default class Exec {
57
+ static manifest = {
58
+ name: "exec",
59
+ channels: { stdout: "text/stream", stderr: "text/stream" },
60
+ defaultChannel: "stdout",
61
+ category: "data",
62
+ scope: "session",
63
+ writableBy: ["model", "client"],
64
+ volatile: true,
65
+ modelVisible: true,
66
+ example: "<<EXEC[sqlite]:SELECT 22.0 / 7.0:EXEC",
67
+ documentation: "Runs a command in a runtime — `<<EXEC[runtime](cwd):command:EXEC` — output streams into the run's `<runtime>:///<loop>/<turn>/<seq>` entry on the runtime's own channels (a subprocess → stdout/stderr; a computational runtime like sqlite/jq → a JSON `results` channel). A host-effecting command proposes for review before it runs; a read-only/pure one runs ungated. Either way you never fetch the output: the engine surfaces each turn's new stream bytes to you automatically — folded while the command runs, opened when it finishes.",
68
+ flags: {
69
+ excludedInAsk: true,
70
+ },
71
+ };
72
+ #activeAborts = new Map();
73
+ #activeSpawns = new Map();
74
+ async idle() {
75
+ await Promise.allSettled([...this.#activeSpawns.values()]);
76
+ }
77
+ // Whether the run has an in-flight spawn (a background exec). The daemon
78
+ // reads this only for loop.cancel's cancelled=true/false answer — the
79
+ // teardown itself rides the run's cancellation scope (the spawn's
80
+ // ctx.signal), so even a spawn registering after the cancel self-aborts.
81
+ hasActiveSpawns(runId) {
82
+ for (const { runId: r } of this.#activeAborts.values())
83
+ if (r === runId)
84
+ return true;
85
+ return false;
86
+ }
87
+ // §exec-hold-until-concluded — does the run hold an in-flight spawn whose RUNTIME is in the
88
+ // operator's hold set? The turn-hold exception (owner ruling): for streams we know and
89
+ // control (the search family — one final JSON digest, seconds-bounded), the engine holds
90
+ // the next packet until conclusion instead of giving the model a turn it can only waste.
91
+ hasActiveHoldSpawns(runId, holdSet) {
92
+ for (const { runId: r, runtime } of this.#activeAborts.values())
93
+ if (r === runId && holdSet.has(runtime))
94
+ return true;
95
+ return false;
96
+ }
97
+ // Process-KILL (plurnk-service#203). A running (host/background) exec is
98
+ // addressable by its coordinate pathname; KILL aborts that spawn's controller with
99
+ // the model's signal — KILL[code] → exactly that signal once (KILL[9] = SIGKILL), a
100
+ // bare KILL → the executor's SIGHUP default. The model owns escalation, so there
101
+ // is no auto-escalation here. The full #203 status matrix: 200 killed (in-flight) · 410
102
+ // killed-earlier (a prior abort closed the stream 499) · 304 already-exited (closed
103
+ // with any other terminal status) · 404 unknown (no subscription for that coordinate).
104
+ async kill(pathname, signal, ctx) {
105
+ for (const entry of this.#activeAborts.values()) {
106
+ if (entry.pathname === pathname) {
107
+ entry.controller.abort(ExecAbort.killReason(signal));
108
+ return { status: 200 };
109
+ }
110
+ }
111
+ // Not running — settle the outcome from the closed subscription's status.
112
+ const terminal = await ChannelWrite.execTerminalStatus(ctx.db, { sessionId: ctx.sessionId, pathname });
113
+ if (terminal === null)
114
+ return { status: 404, error: `no exec at exec://${pathname}` };
115
+ if (terminal === 499)
116
+ return { status: 410, error: `exec://${pathname} was killed earlier` };
117
+ return { status: 304 };
118
+ }
119
+ // Registry-routed reap (§run-lifecycle-total-reap): the daemon's cancel iterates
120
+ // the run's open subscriptions and calls this per id, aborting the spawn's
121
+ // controller directly. Idempotent — a no-op if the spawn already finished or this
122
+ // id isn't ours. Distinct from kill (by pathname, the model's KILL op): this is by
123
+ // subscription id, the run-level reap that does not depend on the signal listener.
124
+ // Always a teardown — the bounded housekeeping reap, never the model's bare signal.
125
+ abortSubscription(subscriptionId) {
126
+ this.#activeAborts.get(subscriptionId)?.controller.abort(ExecAbort.teardownReason());
127
+ }
128
+ // EXEC op handler — the actual model-facing entry point per plurnk.md.
129
+ // `<<EXEC[runtime](cwd):command:EXEC` →
130
+ // signal=runtime, target=cwd (ParsedPath local/file or null), body=command.
131
+ //
132
+ // Proposes (status=202) with attrs={runtime, cwd, command, pathname}.
133
+ // applyResolution spawns the subprocess; output streams into the
134
+ // coordinate-stamped <runtime>:///<pathname> entry's stdout/stderr channels
135
+ // (e.g. sh:///1/1/2, §exec/#240). The model READs that entry on a subsequent turn.
136
+ async exec(statement, ctx) {
137
+ let command = statement.body ?? "";
138
+ // #201 — a plurnk-scheme target carries content the scheme resolves at
139
+ // apply-time; an empty body is then legal (the target IS the script).
140
+ const schemeTarget = schemeTargetOf(statement.target);
141
+ if (command.length === 0 && schemeTarget === null) {
142
+ return { status: 400, error: "EXEC requires a command body (or a scheme target to run)" };
143
+ }
144
+ const requested = typeof statement.signal === "string" ? statement.signal : "";
145
+ let runtime = requested === "" ? "sh" : requested; // empty signal = default shell
146
+ if (ctx.executors === undefined)
147
+ throw new Error("exec dispatched without an executor registry");
148
+ // §exec-runtime-fallthrough (#350, the execs architect's resolution to the go-501 saga):
149
+ // an UNREGISTERED tag falls through to the shell with the tag as the command word —
150
+ // EXEC[go]:test ./... runs as sh: `go test ./...`. Per-tool runtimes (go/cargo/make/npm)
151
+ // never earn tags (owner, execs#21); this automates the principle. The output entry lands
152
+ // under sh:// (it ran on sh), telemetry records what models reach FOR (the promotion
153
+ // signal is data, not guesswork), and a typo'd tag becomes the shell's own clear 127.
154
+ // No new surface: anything expressible as EXEC[foo]:bar was expressible as EXEC[sh]:foo bar.
155
+ let fellThroughFrom = null;
156
+ if (requested !== "" && ctx.executors.entry(runtime) === undefined && ctx.executors.entry("sh") !== undefined) {
157
+ fellThroughFrom = runtime;
158
+ command = command.length > 0 ? `${runtime} ${command}` : runtime;
159
+ runtime = "sh";
160
+ }
161
+ // #328 — per-session client policy narrows the boot-registered set (subtractive). A tag the
162
+ // session's client layer disables is ABSENT for this session — refused like an unavailable
163
+ // runtime. Checked on the EFFECTIVE runtime: a fall-through rides sh's gate, so a session
164
+ // that disabled sh gets the refusal, never a side door.
165
+ const sessionExecs = (await SessionSettings.read(ctx.db, ctx.sessionId)).execs;
166
+ if (sessionExecs !== null && !Policy.isEnabled(runtime, sessionExecs)) {
167
+ return { status: 501, error: `\`${runtime}\` is disabled for this session by client policy (PLURNK_EXECS_*)` };
168
+ }
169
+ const resolved = ctx.executors.entry(runtime); // registry resolves the runtime tag; unknown/unavailable → 501 — §exec-registry-resolves
170
+ if (resolved === undefined) {
171
+ return { status: 501, error: `\`${runtime}\` is not a configured runtime. available: ${ctx.executors.availableRuntimes().join(", ")}` };
172
+ }
173
+ if (fellThroughFrom !== null) {
174
+ ctx.pushTelemetry?.({ source: "exec:dispatch", kind: "exec_runtime_fallthrough", message: `EXEC[${fellThroughFrom}] fell through to sh`, requested: fellThroughFrom, level: "info" });
175
+ }
176
+ if (!resolved.available) {
177
+ const why = resolved.detail === undefined ? "" : `: ${resolved.detail}`;
178
+ return { status: 501, error: `\`${runtime}\` is unavailable${why}` };
179
+ }
180
+ // The parsed (target) slot — the executor's DATA SOURCE (jq input file / sqlite db / wasm
181
+ // module; ignored by subprocess). execs 0.4.26 (#15) carries it distinct from cwd.
182
+ const target = cwdFromTarget(statement.target);
183
+ // Effect classifies by the target only, never by parsing the command (#289): host → propose,
184
+ // read/pure → auto-run inline (plurnk-service#182).
185
+ const policy = EffectPolicy.decide(resolved.executor.effect(target, command));
186
+ // cwd is ALWAYS the session WORKSPACE (project_root) — the process working directory a relative
187
+ // target resolves against (execs 0.4.26 §2). The old overload (target-as-cwd) is gone: EXEC runs
188
+ // in the same directory the File scheme writes to, and a data-source runtime resolves its target
189
+ // against it (so EXEC[jq](data/x.json) finds the workspace file, not one at the daemon's cwd).
190
+ const sessionRow = await ctx.db.envelope_get_session.get({ id: ctx.sessionId });
191
+ const cwd = sessionRow?.project_root ?? null;
192
+ // Pathname is assigned by Dispatcher.#writeLog as <runtime>/<loop_seq>/
193
+ // <turn_seq>/<sequence> (executor-domain + coordinate, e.g. sh/1/1/2).
194
+ // `pathname` is stamped into attrs at log-write time; applyResolution
195
+ // reads it back here.
196
+ // EXEC repurposes the `<L>` slot as `<timeout, poll>` (seconds): mark[0] caps the spawn's
197
+ // lifetime, mark[1] sets the hibernation poll-wake cadence (§exec-poll). N>0 → deadline (504);
198
+ // -1 / absent → unbounded (loop-life bounded); 0 → turn-scoped (reaped at the next pre-turn,
199
+ // never surviving into the subsequent turn).
200
+ const marks = statement.lineMarker?.marks;
201
+ const timeoutSec = typeof marks?.[0] === "number" && marks[0] > 0 ? Math.floor(marks[0]) : undefined;
202
+ const turnScoped = typeof marks?.[0] === "number" && marks[0] === 0;
203
+ const pollSec = typeof marks?.[1] === "number" && marks[1] > 0 ? Math.floor(marks[1]) : undefined;
204
+ const attrs = {
205
+ runtime, cwd, command, target, pathname: "", inline: policy === "auto",
206
+ ...(schemeTarget !== null ? { schemeTarget } : {}),
207
+ ...(timeoutSec !== undefined ? { timeoutSec } : {}),
208
+ ...(turnScoped ? { turnScoped: true } : {}),
209
+ ...(pollSec !== undefined ? { pollSec } : {}),
210
+ };
211
+ // Body shown to client during proposal review — `$ command` is the
212
+ // most-readable summary regardless of runtime.
213
+ const preview = runtime !== "" ? `[${runtime}] ${command}` : `$ ${command}`;
214
+ return { status: 202, body: preview, attrs }; // host runtime proposes with 202 — §exec-host-proposes
215
+ }
216
+ async applyResolution(args, ctx) {
217
+ const attrs = args.attrs;
218
+ let command = typeof attrs.command === "string" ? attrs.command : "";
219
+ const pathname = attrs.pathname;
220
+ const runtime = (typeof attrs.runtime === "string" && attrs.runtime !== "") ? attrs.runtime : "sh";
221
+ const cwd = (typeof attrs.cwd === "string" && attrs.cwd.length > 0) ? attrs.cwd : null;
222
+ let target = (typeof attrs.target === "string" && attrs.target.length > 0) ? attrs.target : null;
223
+ if (typeof pathname !== "string" || pathname.length === 0) {
224
+ return { status: 500, outcome: "missing_pathname" };
225
+ }
226
+ // #201 — resolve a scheme-URI target to content (executors stay scheme-blind).
227
+ // Empty body → the resolved content IS the command (run a stored script).
228
+ // Non-empty body → materialize the content to a temp file whose path becomes
229
+ // the runtime's data-source TARGET (the input for filters/sqlite/wasm).
230
+ let tempPath = null;
231
+ if (attrs.schemeTarget !== undefined) {
232
+ const { scheme, pathname: tPath, fragment } = attrs.schemeTarget;
233
+ const read = await EntryCrud.readEntry(tPath, ctx, scheme);
234
+ if (read.entry === null)
235
+ return { status: 404, outcome: "scheme_target_not_found" };
236
+ const channels = read.entry.channels;
237
+ const channelName = fragment ?? (channels.body !== undefined ? "body" : Object.keys(channels)[0]);
238
+ const content = channelName === undefined ? undefined : channels[channelName]?.content;
239
+ if (content === undefined)
240
+ return { status: 404, outcome: "scheme_target_channel_not_found" };
241
+ if (command.length === 0) {
242
+ command = content;
243
+ }
244
+ else {
245
+ tempPath = join(tmpdir(), `plurnk-exec-${ctx.sessionId}-${pathname.replace(/[^a-zA-Z0-9]/g, "-")}`);
246
+ await writeFile(tempPath, content, "utf8");
247
+ target = tempPath;
248
+ }
249
+ }
250
+ if (command.length === 0) {
251
+ return { status: 500, outcome: "missing_command" };
252
+ }
253
+ // Resolve the runtime's executor from the boot registry, then seed
254
+ // channels from its declared topology (Q1(b) in plurnk-service#174 —
255
+ // executor declares, scheme honors). Each executor declares its own
256
+ // shape (subprocess → stdout/stderr; search → results; etc.).
257
+ if (ctx.executors === undefined)
258
+ return { status: 500, outcome: "no_executor_registry" };
259
+ const resolved = ctx.executors.entry(runtime);
260
+ if (resolved === undefined)
261
+ return { status: 500, outcome: "no_executor" };
262
+ const seedChannels = {};
263
+ for (const [name, decl] of Object.entries(resolved.executor.channels)) {
264
+ seedChannels[name] = {
265
+ content: "",
266
+ mimetype: decl.mimetype,
267
+ state: decl.defaultState ?? "active",
268
+ };
269
+ }
270
+ const seed = { channels: seedChannels, tags: [] };
271
+ // §exec — the stream entry's scheme IS the runtime tag (sh/node), so it addresses by
272
+ // tag authority (sh:///l/t/s). The engine registers each runtime tag → this handler.
273
+ const { entryId } = await EntryCrud.writeEntry(pathname, seed, ctx, runtime);
274
+ if (entryId === null)
275
+ return { status: 500, outcome: "entry_write_failed" };
276
+ const subscriptionId = await ChannelWrite.openSubscription(ctx.db, {
277
+ runId: ctx.runId, entryId, scheme: runtime,
278
+ handle: runtime !== "" ? `${runtime}: ${command}` : command,
279
+ pollSeconds: typeof attrs.pollSec === "number" ? attrs.pollSec : null, // §exec-poll — hibernation wake cadence
280
+ turnScoped: attrs.turnScoped === true, // §exec-poll — `<0>` reaped at the next pre-turn
281
+ });
282
+ const controller = new AbortController();
283
+ let unlink = () => { };
284
+ if (ctx.signal !== undefined) {
285
+ const parent = ctx.signal;
286
+ // The spawn's kill binds to its loop's cancellation epoch (ctx.signal —
287
+ // captured here, stable for the loop). The parent only aborts on FORCEFUL loop
288
+ // teardown — a 202-graceful loop lets its spawns outlive, never firing this — so
289
+ // the reason is always the bounded housekeeping reap. Attach the listener FIRST,
290
+ // then re-check `aborted`: a listener added to an already-aborted signal never
291
+ // fires, so a check-then-attach order LOSES an abort that lands in the gap (R1's
292
+ // TOCTOU leak). Attach-then-check closes it; controller.abort is idempotent, so a
293
+ // doubled fire is harmless. §exec-timeout
294
+ const onParentAbort = () => controller.abort(ExecAbort.teardownReason());
295
+ parent.addEventListener("abort", onParentAbort, { once: true });
296
+ unlink = () => parent.removeEventListener("abort", onParentAbort);
297
+ if (parent.aborted)
298
+ controller.abort(ExecAbort.teardownReason());
299
+ }
300
+ this.#activeAborts.set(subscriptionId, { runId: ctx.runId, pathname, runtime, controller, unlink });
301
+ const tail = this.#runExecutor({
302
+ executor: resolved.executor,
303
+ runtime, command, cwd, target, ctx, pathname,
304
+ entryId, subscriptionId, signal: controller.signal, controller, tempPath,
305
+ timeoutSec: typeof attrs.timeoutSec === "number" ? attrs.timeoutSec : null,
306
+ });
307
+ // Every exec backgrounds + streams (§exec-stream): no same-turn receipt — the output
308
+ // surfaces as the environment-observation injector's delta on the next turn (folded while
309
+ // it runs, opened when it finishes). Pure/read commands still auto-accept (attrs.inline =
310
+ // no human gate); they just resolve a turn later, uniformly with host streams.
311
+ this.#activeSpawns.set(subscriptionId, tail);
312
+ return { status: 200, outcome: "started" };
313
+ }
314
+ // Bridge the executor's sink-style contract (write/setState/emit)
315
+ // onto plurnk-service's storage primitives (appendToChannel,
316
+ // setChannelState, ctx.pushTelemetry). Per plurnk-service#174 Q3,
317
+ // executor TelemetryEvents flow through the same engine path as
318
+ // grammar parse_errors — emit → buffer → next packet + live notify.
319
+ //
320
+ // write() and setState() callbacks must run in emission order:
321
+ // appendToChannel reads channel state AFTER the append commits, so
322
+ // a setState("closed") that races a prior write() can flip the
323
+ // notify's reported state to "closed" before the chunk event fires
324
+ // as "active." Chain through a single promise queue to serialize.
325
+ async #runExecutor(opts) {
326
+ const { executor, runtime, command, cwd, target, ctx, pathname, entryId, subscriptionId, signal, controller, timeoutSec, tempPath } = opts;
327
+ const db = ctx.db;
328
+ const coordinate = coordinateFromPathname(pathname); // #224 — stamped on stream/event + stream/concluded
329
+ // grammar 0.74.20 EXEC `<T>` — kill the spawn after T seconds. unref'd so a pending timer never
330
+ // holds the process open; cleared in finally so a spawn that finishes first leaves no timer.
331
+ let timedOut = false;
332
+ const timeoutTimer = timeoutSec !== null
333
+ ? setTimeout(() => { timedOut = true; controller.abort(ExecAbort.timeoutReason()); }, timeoutSec * 1000)
334
+ : null;
335
+ timeoutTimer?.unref();
336
+ let queue = Promise.resolve();
337
+ const enqueue = (op) => {
338
+ queue = queue.then(op, op);
339
+ };
340
+ let closeStatus = 500;
341
+ let exitLabel = "spawn_failed";
342
+ let stdoutLength = 0;
343
+ let stderrLength = 0;
344
+ // §exec-entry-sink (#340) — the executor's entry() materialization request. The executor
345
+ // owns zero substrate: it hands us (path, content, {tags, mimetype}) and WE create/update
346
+ // the entry (writeEntry upsert; tags UNIONED — writeEntry alone replaces), then narrate ONE
347
+ // EDIT row in the reserved plurnk run's log (the fs-fiction pattern, source = the calling
348
+ // run) — the existing env-delta ambience folds it into every run's next packet. The row is a
349
+ // FULL fiction: tx carries the statement (body = the written content — the journal records
350
+ // the write, replay/fork-complete), rx carries the span (§edit-result-render, the whole
351
+ // content numbered — a wholesale write's span IS the content; no diff, which would be a
352
+ // pathological cost against a rewritten multi-MB page). Rendered folded by default, so no
353
+ // body rides a packet uninvited — the meta line carries the honest OPEN cost.
354
+ // Serialized: parallel entry() calls (allSettled) write in order; a rejection prunes that
355
+ // survivor executor-side without breaking the chain. Lazy narration context: one plurnk-run
356
+ // turn per spawn, not per entry.
357
+ let entryChain = Promise.resolve();
358
+ let narration = null;
359
+ const entrySink = (path, content, opts) => {
360
+ const op = async () => {
361
+ const parsed = parsePath(path);
362
+ if (parsed === null || parsed.kind !== "url" || parsed.scheme === null)
363
+ throw new Error(`entry(): '${path.slice(0, 80)}' is not a URL`);
364
+ const pathname = foldAuthorityIntoPath(parsed.hostname, parsed.pathname);
365
+ const prior = await EntryCrud.readEntry(pathname, ctx, parsed.scheme);
366
+ const tags = [...new Set([...(prior.entry?.tags ?? []), ...opts.tags])];
367
+ // The web-fetch entry point: a fetched html page stores the handler's readable
368
+ // projection as the decisive `body` (text/markdown — what READ serves, FIND matches,
369
+ // FTS indexes, every price reports) with the raw page under `html` (xpath + archive).
370
+ // Scoped HERE, not writeEntry: only auto-fetched web content projects; authored files
371
+ // stay verbatim (a `<user email=…>` roster's attribute data must survive a default READ).
372
+ let channels = { body: { content, mimetype: opts.mimetype } };
373
+ let decisive = content;
374
+ if (opts.mimetype === "text/html" && ctx.mimetypes !== undefined) {
375
+ const projected = (await ctx.mimetypes.process({ content, hint: "text/html" }, { channels: ["content"] })).content;
376
+ if (typeof projected === "string" && projected.length > 0) {
377
+ channels = { body: { content: projected, mimetype: "text/markdown" }, html: { content, mimetype: opts.mimetype } };
378
+ decisive = projected;
379
+ }
380
+ }
381
+ const written = await EntryCrud.writeEntry(pathname, { channels, tags }, ctx, parsed.scheme);
382
+ if (narration === null) {
383
+ const run = await db.envelope_get_run_by_name.get({ session_id: ctx.sessionId, name: "plurnk" })
384
+ ?? await db.envelope_insert_run.get({ session_id: ctx.sessionId, name: "plurnk", origin: "plurnk" });
385
+ if (run === undefined)
386
+ throw new Error("entry(): plurnk run resolution returned no row");
387
+ const loop = await db.envelope_insert_client_loop.get({ run_id: run.id });
388
+ if (loop === undefined)
389
+ throw new Error("entry(): loop insert returned no row");
390
+ const seqRow = await db.client_turn_next_sequence.get({ loop_id: loop.id });
391
+ const turn = await db.client_turn_insert.get({ loop_id: loop.id, sequence: seqRow?.next ?? 1, packet: "{}" });
392
+ if (turn === undefined)
393
+ throw new Error("entry(): turn insert returned no row");
394
+ narration = { runId: run.id, loopId: loop.id, turnId: turn.id, seq: 1 };
395
+ }
396
+ await db.engine_insert_log_entry.get({
397
+ run_id: narration.runId, loop_id: narration.loopId, turn_id: narration.turnId, sequence: narration.seq++,
398
+ // signal carries the tags — the SAME slot a model's EDIT[tags] uses, so the
399
+ // ambient row renders its tags natively everywhere (packet meta line, digest).
400
+ origin: "plurnk", source: String(ctx.runId), op: "EDIT", suffix: "", signal: JSON.stringify(tags),
401
+ scheme: parsed.scheme, username: null, password: null, hostname: null, port: null,
402
+ pathname, params: null, fragment: null, lineMarker: null,
403
+ tx: JSON.stringify({ op: "EDIT", body: content }), mimetype_tx: "application/json",
404
+ rx: JSON.stringify({
405
+ status: written.status, entryId: written.entryId, tags,
406
+ span: decisive.split("\n").map((l, n) => `${n + 1}:\t${l}`).join("\n"),
407
+ }), mimetype_rx: "application/json",
408
+ status_rx: written.status, tokens: ctx.tokenize?.(decisive) ?? 0, state: "resolved", outcome: null,
409
+ attrs: JSON.stringify({ tags }),
410
+ });
411
+ };
412
+ const run = entryChain.then(op, op);
413
+ entryChain = run.then(() => undefined, () => undefined);
414
+ return run;
415
+ };
416
+ try {
417
+ let result = null;
418
+ try {
419
+ result = await executor.run({
420
+ runtime, command, cwd, target, signal,
421
+ entry: entrySink,
422
+ env: ExecEnv.scoped(), // SPEC §exec {§exec-env-scoped} — never plurnk's own secrets
423
+ write: (channel, chunk) => enqueue(() => ChannelWrite.appendToChannel(db, {
424
+ entryId, channel, chunk, notify: ctx.streamEventNotify, coordinate,
425
+ })),
426
+ setState: (channel, state) => enqueue(() => ChannelWrite.setChannelState(db, {
427
+ entryId, channel, state, notify: ctx.streamEventNotify, coordinate,
428
+ })),
429
+ emit: (event) => {
430
+ // The executor daughter's TelemetryEvent predates grammar's required `level`;
431
+ // inject a default (forwarding the producer's own severity when it supplies one). #276
432
+ const level = event.level ?? "info";
433
+ ctx.pushTelemetry?.({ ...event, level });
434
+ },
435
+ });
436
+ // Drain the queue so the subscription doesn't close before
437
+ // final chunk events / state transitions have committed.
438
+ await queue;
439
+ }
440
+ catch (cause) {
441
+ // A rejecting driver must still CONCLUDE its stream — uncaught, the subscription sat
442
+ // open forever and the floating spawn promise was an unhandled rejection.
443
+ exitLabel = `driver_crashed: ${cause instanceof Error ? cause.message : String(cause)}`;
444
+ }
445
+ if (result !== null) {
446
+ const exitCode = result.exitCode ?? -1;
447
+ closeStatus = result.status;
448
+ // A timeout aborts the spawn → the executor reports 499; restamp it 504 so the model
449
+ // sees "ran out of time" distinct from a deliberate kill/cancel (§exec-timeout).
450
+ if (timedOut && closeStatus === 499)
451
+ closeStatus = 504;
452
+ // The service's own abort knowledge outranks a driver's claim: a spawn we reaped
453
+ // (teardown/kill/cancel) did not succeed, whatever status it resolved under abort.
454
+ if (signal.aborted && !timedOut && closeStatus < 400) {
455
+ closeStatus = 499;
456
+ exitLabel = "reaped";
457
+ }
458
+ else
459
+ exitLabel = closeStatus === 504 ? `timed out after ${timeoutSec}s`
460
+ : closeStatus === 499 ? "aborted"
461
+ : closeStatus === 500 && exitCode === -1 ? "spawn_failed"
462
+ : `exit ${exitCode}`;
463
+ }
464
+ await ChannelWrite.closeSubscription(db, { subscriptionId, status: closeStatus });
465
+ const stdoutMeta = await db.channel_meta.get({ entry_id: entryId, channel: "stdout" });
466
+ const stderrMeta = await db.channel_meta.get({ entry_id: entryId, channel: "stderr" });
467
+ stdoutLength = stdoutMeta?.contentLength ?? 0;
468
+ stderrLength = stderrMeta?.contentLength ?? 0;
469
+ }
470
+ finally {
471
+ if (timeoutTimer !== null)
472
+ clearTimeout(timeoutTimer); // a finished spawn leaves no pending timer
473
+ // #201 — a materialized data-source temp file outlives the spawn it fed;
474
+ // unlink it once the run settles (open-unlink is safe on Linux).
475
+ if (tempPath !== null)
476
+ await unlink(tempPath).catch(() => { });
477
+ this.#activeAborts.get(subscriptionId)?.unlink();
478
+ this.#activeAborts.delete(subscriptionId);
479
+ this.#activeSpawns.delete(subscriptionId);
480
+ // Every run backgrounds now (§exec-stream) — wake a parked loop on completion so the
481
+ // run resumes to the turn where the stream's terminal delta surfaces.
482
+ if (ctx.wakeRunNotify !== undefined) {
483
+ ctx.wakeRunNotify({
484
+ sessionId: ctx.sessionId, runId: ctx.runId,
485
+ entryId, target: `${runtime}://${pathname}`, subscriptionId, closeStatus,
486
+ scheme: runtime,
487
+ summary: `${runtime}://${pathname} completed (${exitLabel}); stdout=${stdoutLength} bytes, stderr=${stderrLength} bytes`,
488
+ ...coordinate,
489
+ });
490
+ }
491
+ }
492
+ return closeStatus;
493
+ }
494
+ async read(statement, ctx) {
495
+ return EntryOps.readSessionEntry(statement, ctx, Exec.manifest);
496
+ }
497
+ async find(statement, ctx) {
498
+ return EntryFind.findSessionEntries(statement, ctx, Exec.manifest);
499
+ }
500
+ async readEntry(pathname, ctx) {
501
+ return EntryCrud.readEntry(pathname, ctx, Exec.manifest.name);
502
+ }
503
+ async writeEntry(pathname, entry, ctx) {
504
+ return EntryCrud.writeEntry(pathname, entry, ctx, Exec.manifest.name);
505
+ }
506
+ async deleteEntry(pathname, ctx) {
507
+ return EntryCrud.deleteEntry(pathname, ctx, Exec.manifest.name);
508
+ }
509
+ }
510
+ //# sourceMappingURL=Exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Exec.js","sourceRoot":"","sources":["../../src/schemes/Exec.ts"],"names":[],"mappings":"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"}