@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,97 @@
1
+ // Plugin discovery + loading for the daemon. SPEC §plugin-discovery.
2
+ //
3
+ // Boot-time scope-agnostic scan of node_modules — every scoped and unscoped
4
+ // package with a `plurnk` manifest field is a candidate, gated by the shared
5
+ // ecosystem trust rule (PLURNK_PLUGINS_TRUSTED_ONLY); dynamic-import them,
6
+ // register with the matching registry by kind. Alphabetical load order;
7
+ // collisions on (kind, name) fail-hard at registration time.
8
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
9
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
10
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
11
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
12
+ });
13
+ }
14
+ return path;
15
+ };
16
+ import { readFile } from "node:fs/promises";
17
+ import { resolve } from "node:path";
18
+ import Meta from "@plurnk/plurnk-meta";
19
+ export default class PluginLoader {
20
+ static #isValidKind(kind) {
21
+ return kind === "provider" || kind === "scheme" || kind === "mimetype";
22
+ }
23
+ static async discoverPlugins(nodeModulesDir) {
24
+ const candidates = await Meta.packageDirs(nodeModulesDir);
25
+ const discovered = [];
26
+ for (const { dir: packagePath, name } of candidates) {
27
+ if (!Meta.isTrusted(name))
28
+ continue;
29
+ let pkg;
30
+ try {
31
+ const content = await readFile(resolve(packagePath, "package.json"), "utf8");
32
+ pkg = JSON.parse(content);
33
+ }
34
+ catch {
35
+ continue;
36
+ }
37
+ if (typeof pkg.name !== "string")
38
+ continue;
39
+ if (pkg.plurnk === undefined || pkg.plurnk === null || typeof pkg.plurnk !== "object")
40
+ continue;
41
+ const candidate = pkg.plurnk;
42
+ if (!PluginLoader.#isValidKind(candidate.kind))
43
+ continue;
44
+ if (typeof candidate.name !== "string" || candidate.name.length === 0)
45
+ continue;
46
+ discovered.push({
47
+ packageName: pkg.name,
48
+ packagePath,
49
+ manifest: { kind: candidate.kind, name: candidate.name },
50
+ });
51
+ }
52
+ return discovered.toSorted((a, b) => a.packageName.localeCompare(b.packageName));
53
+ }
54
+ // Dynamic-import a discovered plugin's default export and instantiate it.
55
+ // Default export MUST be a constructable class with a zero-arg constructor.
56
+ // Identity-match enforcement per plurnk-mimetypes / plurnk-schemes manifests:
57
+ // the instance's claimed identity MUST match the package manifest's `plurnk.name`.
58
+ // Providers skip this check — manifest.name is a vendor identifier; the
59
+ // instance's `model` is per-config (plurnk-providers#1, identity getters).
60
+ static async loadPlugin(plugin) {
61
+ const mod = await import(__rewriteRelativeImportExtension(plugin.packageName));
62
+ const PluginClass = mod.default;
63
+ if (typeof PluginClass !== "function") {
64
+ throw new Error(`${plugin.packageName}: default export is not a constructor`);
65
+ }
66
+ const instance = new PluginClass();
67
+ PluginLoader.assertIdentityMatch(plugin, instance);
68
+ return instance;
69
+ }
70
+ static assertIdentityMatch(plugin, instance) {
71
+ if (plugin.manifest.kind === "mimetype") {
72
+ const declared = instance.mimetype;
73
+ if (typeof declared !== "string") {
74
+ throw new Error(`${plugin.packageName}: mimetype handler instance must declare a string \`mimetype\` field`);
75
+ }
76
+ if (declared !== plugin.manifest.name) {
77
+ throw new Error(`${plugin.packageName}: identity mismatch — package manifest declares mimetype '${plugin.manifest.name}', instance declares '${declared}'`);
78
+ }
79
+ return;
80
+ }
81
+ if (plugin.manifest.kind === "scheme") {
82
+ // Schemes carry a static `manifest` on the class (plurnk-schemes contract).
83
+ // Transitional: bundled schemes don't yet have it (task #32 wires
84
+ // manifest registration). When the static manifest is absent, accept
85
+ // the package manifest name as the source of truth and trust the caller.
86
+ const classManifest = instance.constructor;
87
+ const declared = classManifest?.manifest?.name;
88
+ if (declared !== undefined && declared !== plugin.manifest.name) {
89
+ throw new Error(`${plugin.packageName}: identity mismatch — package manifest declares scheme '${plugin.manifest.name}', class manifest declares '${String(declared)}'`);
90
+ }
91
+ return;
92
+ }
93
+ // Providers: no identity-match at this layer. Package manifest `name` is
94
+ // the vendor family; instance `model` is per-config (plurnk-providers#1).
95
+ }
96
+ }
97
+ //# sourceMappingURL=PluginLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginLoader.js","sourceRoot":"","sources":["../../src/core/PluginLoader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { PlurnkStatement } from "@plurnk/plurnk-grammar";
2
+ import type { Db } from "./Db.ts";
3
+ import type SchemeRegistry from "./SchemeRegistry.ts";
4
+ import type ExecutorRegistry from "./ExecutorRegistry.ts";
5
+ import type TelemetryChannel from "./TelemetryChannel.ts";
6
+ import type { Mimetypes } from "@plurnk/plurnk-mimetypes";
7
+ import type { StreamEventNotify, WakeRunNotify } from "./ChannelWrite.ts";
8
+ import type { LoopFlags } from "./scheme-types.ts";
9
+ import type { DispatchResult } from "./Dispatcher.ts";
10
+ export type ProposalDecision = "accept" | "reject" | "cancel";
11
+ export interface ProposalResolution {
12
+ decision: ProposalDecision;
13
+ body?: string;
14
+ outcome?: string;
15
+ }
16
+ export interface ProposalPendingEvent {
17
+ logEntryId: number;
18
+ sessionId: number;
19
+ runId: number;
20
+ loopId: number;
21
+ turnId: number;
22
+ op: string;
23
+ target: {
24
+ scheme: string | null;
25
+ pathname: string | null;
26
+ };
27
+ body: string;
28
+ attrs: object;
29
+ flags: LoopFlags;
30
+ staleClobberRisk: boolean;
31
+ }
32
+ export default class ProposalLifecycle {
33
+ #private;
34
+ constructor({ db, schemes, telemetry, streamEventNotify, wakeRunNotify, tokenize, mimetypes, executors, loopSignal }: {
35
+ db: Db;
36
+ schemes: SchemeRegistry;
37
+ telemetry: TelemetryChannel;
38
+ streamEventNotify?: StreamEventNotify;
39
+ wakeRunNotify?: WakeRunNotify;
40
+ tokenize: (text: string) => number;
41
+ mimetypes?: Mimetypes;
42
+ executors: () => ExecutorRegistry | undefined;
43
+ loopSignal: (loopId: number) => AbortSignal | undefined;
44
+ });
45
+ resolve(logEntryId: number, resolution: ProposalResolution): void;
46
+ pendingIds(): number[];
47
+ cancelAll(outcome: string): void;
48
+ onPending(listener: (event: ProposalPendingEvent) => void): void;
49
+ notifyPending(event: ProposalPendingEvent): void;
50
+ awaitResolution(logEntryId: number): Promise<ProposalResolution>;
51
+ runApply(statement: PlurnkStatement, originalResult: DispatchResult, resolution: ProposalResolution, ids: {
52
+ sessionId: number;
53
+ runId: number;
54
+ loopId: number;
55
+ turnId: number;
56
+ }): Promise<ProposalResolution>;
57
+ applyResolution(logEntryId: number, resolution: ProposalResolution): Promise<DispatchResult>;
58
+ }
59
+ //# sourceMappingURL=ProposalLifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProposalLifecycle.d.ts","sourceRoot":"","sources":["../../src/core/ProposalLifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,215 @@
1
+ import { schemeNameOf } from "./plurnk-uri.js";
2
+ // Resolution timeout — OFF by default (owner ruling, the AG-UI migration's first surfaced
3
+ // decision): a stopped world awaiting a human WAITS — the human's absence is not an answer,
4
+ // and a silent five-minute cancel is the machine deciding it was. The [102]<-1> doctrine's
5
+ // sibling: waiting is a mode of continuing. An operator whose deployment needs a bound sets
6
+ // PLURNK_SERVICE_PROPOSAL_TIMEOUT_MS explicitly (the decision table); empty = indefinite.
7
+ const readProposalTimeoutMs = () => {
8
+ const raw = process.env.PLURNK_SERVICE_PROPOSAL_TIMEOUT_MS;
9
+ if (raw === undefined || raw.length === 0)
10
+ return null;
11
+ const n = Number(raw);
12
+ if (!Number.isFinite(n) || n <= 0)
13
+ return null;
14
+ return n;
15
+ };
16
+ // The proposal lifecycle (SPEC.md §engine-rails + §methods loop.resolve): a
17
+ // side-effecting op that returns 202 pauses in dispatch until a resolution
18
+ // arrives — from the loop/resolve RPC, the in-tree YOLO listener, or the
19
+ // timeout — then the scheme's applyResolution hook applies the accept.
20
+ export default class ProposalLifecycle {
21
+ #db;
22
+ #schemes;
23
+ #telemetry;
24
+ #streamEventNotify;
25
+ #wakeRunNotify;
26
+ #tokenize;
27
+ #mimetypes;
28
+ // Boot-discovered runtime executors, late-injected on Engine — thunked.
29
+ #executors;
30
+ // Per-loop abort signal, owned by Engine.runLoop — thunked.
31
+ #loopSignal;
32
+ // Proposal lifecycle: pending dispatch pauses waiting for resolution.
33
+ // Dispatch awaits the promise when a scheme returns status 202;
34
+ // Engine.resolveProposal feeds the resolution back in. Map is per-log-
35
+ // entry-id; entries clear on resolution. SPEC.md §engine-rails + §methods (loop.resolve).
36
+ #pending = new Map();
37
+ // External observers of proposal lifecycle events. Daemon subscribes
38
+ // here to push `loop/proposal` notifications when an entry enters
39
+ // pending state. YOLO listener (Phase E.3) subscribes here too. Lean
40
+ // event emitter — no priority, no veto chain at this layer; filter
41
+ // chains come later if a real consumer needs them.
42
+ #listeners = [];
43
+ constructor({ db, schemes, telemetry, streamEventNotify, wakeRunNotify, tokenize, mimetypes, executors, loopSignal }) {
44
+ this.#db = db;
45
+ this.#schemes = schemes;
46
+ this.#telemetry = telemetry;
47
+ this.#streamEventNotify = streamEventNotify;
48
+ this.#wakeRunNotify = wakeRunNotify;
49
+ this.#tokenize = tokenize;
50
+ this.#mimetypes = mimetypes;
51
+ this.#executors = executors;
52
+ this.#loopSignal = loopSignal;
53
+ }
54
+ // External API to feed a resolution into a pending proposal. Called by
55
+ // the loop/resolve RPC handler (Phase E.2), the in-tree YOLO listener
56
+ // (Phase E.3), or the timeout watcher. Throws when the logEntryId has no
57
+ // pending waiter — duplicate resolutions, IDs for non-proposed entries,
58
+ // or entries already-resolved are caller errors.
59
+ resolve(logEntryId, resolution) {
60
+ const waiter = this.#pending.get(logEntryId);
61
+ if (waiter === undefined) {
62
+ throw new Error(`Engine.resolveProposal: no pending proposal for log_entry ${logEntryId}`);
63
+ }
64
+ if (waiter.timeoutHandle !== null)
65
+ clearTimeout(waiter.timeoutHandle);
66
+ this.#pending.delete(logEntryId);
67
+ waiter.resolve(resolution);
68
+ }
69
+ // Snapshot of pending proposals (for diagnostic / RPC listings). Returns
70
+ // the log entry IDs currently awaiting resolution.
71
+ pendingIds() {
72
+ return [...this.#pending.keys()];
73
+ }
74
+ // Daemon shutdown: settle EVERY pending waiter with a cancel so the stopped world can't
75
+ // deadlock the stop — a drain paused inside dispatch awaiting a resolution that will never
76
+ // come held Promise.allSettled(drains) open forever (a daemon with a pending HITL proposal
77
+ // could not shut down; the #344 wedge class). §proposal-cancel-aborts — same cancel lane as
78
+ // a timeout, outcome names the cause.
79
+ cancelAll(outcome) {
80
+ for (const [logEntryId, waiter] of [...this.#pending.entries()]) {
81
+ if (waiter.timeoutHandle !== null)
82
+ clearTimeout(waiter.timeoutHandle);
83
+ this.#pending.delete(logEntryId);
84
+ waiter.resolve({ decision: "cancel", outcome });
85
+ }
86
+ }
87
+ // Subscribe to proposal-pending events. Daemon registers a listener
88
+ // that broadcasts the loop/proposal WS notification; YOLO listener
89
+ // (Phase E.3) registers one that auto-resolves. Listeners fire BEFORE
90
+ // dispatch awaits resolution, so synchronous (or fast-async) handlers
91
+ // can resolve inline.
92
+ onPending(listener) {
93
+ this.#listeners.push(listener);
94
+ }
95
+ notifyPending(event) {
96
+ for (const listener of this.#listeners) {
97
+ try {
98
+ listener(event);
99
+ }
100
+ catch (_) { /* listener errors don't break dispatch */ }
101
+ }
102
+ }
103
+ awaitResolution(logEntryId) {
104
+ const timeoutMs = readProposalTimeoutMs();
105
+ return new Promise((resolve) => {
106
+ const timeoutHandle = timeoutMs === null ? null : setTimeout(() => {
107
+ // Operator-bounded lane only: synthesize a cancel resolution through the same
108
+ // path as any other. State transitions to cancelled with outcome='timeout'.
109
+ if (this.#pending.has(logEntryId)) {
110
+ this.#pending.delete(logEntryId);
111
+ resolve({ decision: "cancel", outcome: "timeout" }); // §proposal-timeout-cancels
112
+ }
113
+ }, timeoutMs);
114
+ this.#pending.set(logEntryId, { resolve, timeoutHandle });
115
+ });
116
+ }
117
+ // On accept, run the scheme's applyResolution — File writes disk, Exec spawns. §proposal-accept-applies
118
+ async runApply(statement, originalResult, resolution, ids) {
119
+ const { sessionId, runId, loopId, turnId } = ids;
120
+ if (resolution.decision !== "accept")
121
+ return resolution;
122
+ // EXEC routes to the exec scheme regardless of target (cwd, not
123
+ // a scheme address). All other ops resolve their handler from
124
+ // statement.target's scheme.
125
+ // COPY/MOVE write the DEST (statement.body), not the source (target): the
126
+ // accept must reach the dest scheme's applyResolution (File writes disk).
127
+ const schemeName = statement.op === "EXEC" ? "exec"
128
+ : (statement.op === "COPY" || statement.op === "MOVE") ? schemeNameOf(statement.body)
129
+ : schemeNameOf(statement.target);
130
+ if (schemeName === null)
131
+ return resolution;
132
+ const handler = this.#schemes.get(schemeName);
133
+ if (handler === undefined || typeof handler.applyResolution !== "function")
134
+ return resolution;
135
+ try {
136
+ // Build a ctx for the scheme's applyResolution. The proposal
137
+ // was raised inside a specific (session, run, loop, turn);
138
+ // the scheme uses ctx to write the entry that makes the
139
+ // operation's artifact visible in the next packet's index.
140
+ const applyCtx = {
141
+ db: this.#db, sessionId, runId, loopId, turnId,
142
+ writer: "model", signal: this.#loopSignal(loopId),
143
+ streamEventNotify: this.#streamEventNotify,
144
+ wakeRunNotify: this.#wakeRunNotify,
145
+ tokenize: this.#tokenize,
146
+ mimetypes: this.#mimetypes,
147
+ pushTelemetry: (event) => this.#telemetry.push(sessionId, loopId, event),
148
+ executors: this.#executors(),
149
+ };
150
+ const applyResult = await handler.applyResolution({
151
+ attrs: (originalResult.attrs ?? {}),
152
+ body: resolution.body,
153
+ }, applyCtx);
154
+ if (applyResult.status >= 400) {
155
+ return {
156
+ decision: "reject",
157
+ outcome: applyResult.outcome ?? "apply_failed",
158
+ body: applyResult.body,
159
+ };
160
+ }
161
+ // Propagate applyResolution.outcome onto the accepted resolution
162
+ // (operational metadata, e.g. exec's "started") AND its body — the applied result the
163
+ // model must see THIS turn: a file EDIT's line-numbered diff, a [300] answer. EXEC
164
+ // never uses the body rail — its output streams uniformly (§exec-stream, NO same-turn
165
+ // in-body exception; inline only skips the review pause) and is READ next turn.
166
+ const withOutcome = applyResult.outcome !== undefined && resolution.outcome === undefined
167
+ ? { ...resolution, outcome: applyResult.outcome }
168
+ : resolution;
169
+ return applyResult.body === undefined ? withOutcome : { ...withOutcome, body: applyResult.body };
170
+ }
171
+ catch (err) {
172
+ return {
173
+ decision: "reject",
174
+ outcome: "apply_threw",
175
+ body: err instanceof Error ? err.message : String(err),
176
+ };
177
+ }
178
+ }
179
+ async applyResolution(logEntryId, resolution) {
180
+ // Map decision → terminal state + HTTP-aligned status:
181
+ // accept → state='resolved', status=200
182
+ // reject → state='failed', status=400, outcome='rejected' (default) §proposal-reject-fails
183
+ // cancel → state='cancelled',status=499, outcome='loop_aborted' (default) §proposal-cancel-aborts
184
+ // resolution.outcome wins over the default when supplied; this is how
185
+ // veto filters (Phase E.2 proposal.accepting) can specify a more
186
+ // precise outcome string like 'policy_veto' or 'timeout'.
187
+ const decision = resolution.decision;
188
+ const state = decision === "accept" ? "resolved"
189
+ : decision === "reject" ? "failed"
190
+ : "cancelled";
191
+ const status = decision === "accept" ? 200
192
+ : decision === "reject" ? 400
193
+ : 499;
194
+ const defaultOutcome = decision === "accept" ? null
195
+ : decision === "reject" ? "rejected"
196
+ : "loop_aborted";
197
+ const outcome = resolution.outcome ?? defaultOutcome;
198
+ // rx is the model-facing operation result. Status always. Body is normally dropped —
199
+ // the propose preview was an input echo — EXCEPT an inline auto-run (read/pure) carries
200
+ // its run output AS the body, the "what happened" the model needs this turn. A non-accept
201
+ // carries the outcome TOKEN as its terse error (write_failed / rejected / timeout — one
202
+ // word, never prose): a bare {"status":400} left the model blind to a mechanically failed
203
+ // apply and parking on a phantom worker (the fan-out digest).
204
+ const rx = (decision === "accept" && resolution.body !== undefined)
205
+ ? JSON.stringify({ status, body: resolution.body })
206
+ : decision === "accept"
207
+ ? JSON.stringify({ status })
208
+ : JSON.stringify({ status, error: outcome });
209
+ await this.#db.engine_resolve_log_entry.run({
210
+ id: logEntryId, state, outcome, status_rx: status, rx,
211
+ });
212
+ return { status, outcome, body: resolution.body };
213
+ }
214
+ }
215
+ //# sourceMappingURL=ProposalLifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProposalLifecycle.js","sourceRoot":"","sources":["../../src/core/ProposalLifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Provider, ProviderAlias } from "@plurnk/plurnk-providers";
2
+ export default class ProviderInstantiate {
3
+ #private;
4
+ static aliasOf(provider: Provider): string | undefined;
5
+ static instantiateProvider(alias: ProviderAlias, env?: NodeJS.ProcessEnv): Promise<Provider>;
6
+ static loadActiveProvider(env?: NodeJS.ProcessEnv): Promise<Provider | null>;
7
+ static verifyGrammarEnforcement(provider: Provider, env?: NodeJS.ProcessEnv): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=ProviderInstantiate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderInstantiate.d.ts","sourceRoot":"","sources":["../../src/core/ProviderInstantiate.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAmB,MAAM,0BAA0B,CAAC;AAEzF,MAAM,CAAC,OAAO,OAAO,mBAAmB;;IAcpC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAErD;IAED,OAAa,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAY9G;IA2CD,OAAa,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAM9F;IAWD,OAAa,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyD7G;CACJ"}
@@ -0,0 +1,156 @@
1
+ // Dynamic provider instantiation. Lives in plurnk-service (the consumer)
2
+ // because Node's `import()` resolves package specifiers relative to the
3
+ // calling module's location; this is the package that actually has the
4
+ // `@plurnk/plurnk-providers-*` siblings installed in its node_modules.
5
+ //
6
+ // The pure helpers (parseAliasesFromEnv, resolveActiveAlias) live in
7
+ // @plurnk/plurnk-providers as framework-grade env parsing.
8
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
9
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
10
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
11
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
12
+ });
13
+ }
14
+ return path;
15
+ };
16
+ import { resolveActiveAlias, scopeEnvToAlias, isStandardProvider, standardProviderFromEnv } from "@plurnk/plurnk-providers";
17
+ export default class ProviderInstantiate {
18
+ // One provider per (provider, model, baseUrl) for the process lifetime: a provider is
19
+ // stateless per the contract, and loop.run instantiating fresh per aliased call re-probed
20
+ // the backend (latency) and re-fired providers' construction warnings on every loop (the
21
+ // owner's boot log: one heuristic warning per loop.run). Cache keyed on the wire identity;
22
+ // env is process-stable for these fields.
23
+ static #instances = new Map();
24
+ // #352 — provider handle → the alias name that produced it, so the service scopes its OWN
25
+ // per-alias partition knobs (PLURNK_SERVICE_*_<alias>) by the provider it's building a packet
26
+ // for. Service-owned metadata about handles WE created; never a provider-contract field.
27
+ static #aliasByProvider = new WeakMap();
28
+ // The alias name a provider was built under, or undefined (a test Mock, a hand-built handle).
29
+ // PacketBuilder falls back to resolveActiveAlias for the boot-global case.
30
+ static aliasOf(provider) {
31
+ return ProviderInstantiate.#aliasByProvider.get(provider);
32
+ }
33
+ static async instantiateProvider(alias, env = process.env) {
34
+ if (env === process.env) {
35
+ const key = `${alias.provider}|${alias.model}|${alias.baseUrl ?? ""}`;
36
+ let cached = ProviderInstantiate.#instances.get(key);
37
+ if (cached === undefined) {
38
+ cached = ProviderInstantiate.#instantiate(alias, env);
39
+ ProviderInstantiate.#instances.set(key, cached);
40
+ cached.catch(() => ProviderInstantiate.#instances.delete(key)); // a failed construct never poisons the cache
41
+ }
42
+ return cached;
43
+ }
44
+ return ProviderInstantiate.#instantiate(alias, env); // custom env (tests) — never cached
45
+ }
46
+ static async #instantiate(alias, env) {
47
+ const provider = await ProviderInstantiate.#construct(alias, env);
48
+ ProviderInstantiate.#aliasByProvider.set(provider, alias.alias);
49
+ return provider;
50
+ }
51
+ static async #construct(alias, env) {
52
+ // Standard providers (openai-compat + groq/deepinfra/...) construct via
53
+ // the framework's factory — it carries probeNctx (auto-detect the
54
+ // endpoint's n_ctx, so a local llama-server isn't a no-window black box
55
+ // that disables the budget grinder + tokensFree) and the shared
56
+ // OpenAICompat transport. `openai` here replaces the former
57
+ // @plurnk/plurnk-providers-openai sibling verbatim.
58
+ if (isStandardProvider(alias.provider)) {
59
+ // alias.baseUrl MUST thread through — it's the per-alias PLURNK_BASEURL_<alias>
60
+ // override. Drop it and every openai-compat alias silently collapses to a shared
61
+ // OPENAI_BASE_URL (or fails hard), so a multi-endpoint setup runs the wrong box.
62
+ const provider = await standardProviderFromEnv(alias.provider, env, alias.model, alias.baseUrl);
63
+ if (provider === null)
64
+ throw new Error(`standard provider '${alias.provider}' returned null for model '${alias.model}'`);
65
+ return provider;
66
+ }
67
+ // Bespoke siblings (ollama/openrouter/google/xai/cloudflare): dynamic-
68
+ // import the package's own fromEnv factory.
69
+ const packageName = `@plurnk/plurnk-providers-${alias.provider}`;
70
+ let mod;
71
+ try {
72
+ mod = await import(__rewriteRelativeImportExtension(packageName));
73
+ }
74
+ catch (cause) {
75
+ throw new Error(`provider package ${packageName} not installed (alias '${alias.alias}' requires it)`, { cause });
76
+ }
77
+ const factory = mod.default;
78
+ if (typeof factory?.fromEnv !== "function") {
79
+ throw new Error(`${packageName}: default export must have a static \`fromEnv(env, model)\` factory`);
80
+ }
81
+ return await factory.fromEnv(env, alias.model, alias.baseUrl !== undefined ? { baseUrl: alias.baseUrl } : undefined);
82
+ }
83
+ // Convenience: resolve + instantiate in one call. Returns null when no
84
+ // PLURNK_MODEL is set (caller decides what 'no provider' means).
85
+ static async loadActiveProvider(env = process.env) {
86
+ const alias = resolveActiveAlias(env); // the active provider alias resolves from PLURNK_MODEL — §provider-instantiation-alias-resolution
87
+ if (alias === null)
88
+ return null;
89
+ const provider = await ProviderInstantiate.instantiateProvider(alias, env);
90
+ await ProviderInstantiate.verifyGrammarEnforcement(provider, env);
91
+ return provider;
92
+ }
93
+ // §grammar-enforcement-verified-at-boot — the rails are useless if silently OFF. The openai
94
+ // provider only transports the grammar when its boot probe DETECTS llama-server (grammarStyle
95
+ // 'llamacpp'); any probe hiccup silently falls back to 'none' — unconstrained generation, no
96
+ // signal, and the whole grammar contract dark (weeks of "gemma strokes" were unconstrained
97
+ // gemma). The Provider interface exposes no capability to introspect this, so we VERIFY the
98
+ // contract end to end: when the operator requested a grammar, force a trivial one and confirm
99
+ // the backend actually constrained the output. Anything else FAILS HARD at boot — a legible
100
+ // refusal to run beats silent garbage that reads as model failure. No-op when GBNF is off.
101
+ static #VERIFY_TOKEN = "PLURNK-RAILS-LIVE";
102
+ static async verifyGrammarEnforcement(provider, env = process.env) {
103
+ // #353 — resolve GBNF PER ALIAS, exactly as Engine.#grammarConstraint does. The per-alias
104
+ // move (#352) left this reading the BARE knob (now empty by default), so the boot verify
105
+ // was SILENTLY SKIPPED for every alias whose grammar rides a suffix (turboderp) — the rails
106
+ // ran UNVERIFIED, the #34 hole this method exists to close reopened. The alias is the one
107
+ // that built this provider (the side-table), falling back to the active alias.
108
+ const alias = ProviderInstantiate.aliasOf(provider) ?? resolveActiveAlias(env)?.alias ?? "";
109
+ const gbnf = scopeEnvToAlias(env, alias, ["PLURNK_PROVIDERS_GBNF"]).PLURNK_PROVIDERS_GBNF;
110
+ if (gbnf === undefined || gbnf === "" || gbnf === "0")
111
+ return; // rails not requested — nothing to verify
112
+ // #336 — gate on the provider's own claim: a grammarStyle-'none' provider DROPS the grammar
113
+ // cleanly (never on the wire, constrainsOutput:false), so a global GBNF default must not
114
+ // refuse boot against it — the rails are simply not in play for this backend. The #34 hole
115
+ // stays closed: wherever the provider CLAIMS constrainsOutput, the end-to-end verify below
116
+ // still fails hard; and a llama-server whose /v1/models probe raced to 'none' is cured
117
+ // deterministically by PLURNK_PROVIDERS_LLAMA_SERVER_<alias>=1, which the notice names.
118
+ if (provider.constrainsOutput === false) {
119
+ process.stderr.write(`plurnk-service: PLURNK_PROVIDERS_GBNF=${gbnf} is configured, but '${provider.model}' does not enforce grammars — running UNCONSTRAINED on this alias. `
120
+ + `If this backend is a llama-server, pin PLURNK_PROVIDERS_LLAMA_SERVER_<alias>=1 so detection never races.\n`);
121
+ return;
122
+ }
123
+ const forcing = `root ::= "${ProviderInstantiate.#VERIFY_TOKEN}"`;
124
+ let content;
125
+ try {
126
+ const res = await provider.generate({
127
+ messages: [{ role: "user", content: "ok" }],
128
+ runId: "gbnf-enforcement-verify", grammar: forcing, maxTokens: 16,
129
+ });
130
+ // llama-server sometimes renders the end-of-sequence token as literal text after the
131
+ // forced string ("PLURNK-RAILS-LIVE<eos>") — that IS proof of enforcement (the grammar
132
+ // matched exactly, then the sampler stopped); strip one trailing eos-ish marker.
133
+ content = res.assistant.content.trim().replace(/(<eos>|<\/s>|<\|eot_id\|>|<\|endoftext\|>|<end_of_turn>)\s*$/, "").trim();
134
+ }
135
+ catch (cause) {
136
+ // The probe REQUEST was rejected (not "rails came back unconstrained"). This is loud, not
137
+ // the silent-off failure the verify guards against — and it will recur on every real turn,
138
+ // so refuse legibly and name the likely cause. The classic one: the provider sends a
139
+ // reasoning parameter the model rejects (a non-reasoning model + PLURNK_PROVIDERS_THINKING
140
+ // defaulting on → OpenAI 400 "does not support parameter reasoningEffort").
141
+ const detail = cause instanceof Error ? cause.message : String(cause);
142
+ throw new Error(`grammar enforcement verification could not COMPLETE its probe against '${provider.model}' (PLURNK_PROVIDERS_GBNF=${gbnf}) — the model REJECTED the probe request. `
143
+ + `This is a request/config incompatibility, NOT proof the rails are dark (and it would fail every real turn too). `
144
+ + `Most common cause: the model does not accept a parameter the provider sends — e.g. a reasoning param on a non-reasoning model; set PLURNK_PROVIDERS_THINKING=off (or the model-appropriate posture). `
145
+ + `Refusing to boot until the request the daemon sends is one the model accepts. Probe error: ${detail}`, { cause });
146
+ }
147
+ if (content !== ProviderInstantiate.#VERIFY_TOKEN) {
148
+ throw new Error(`grammar enforcement is OFF: PLURNK_PROVIDERS_GBNF=${gbnf} requests constrained sampling, but '${provider.model}' returned UNCONSTRAINED output to a forcing grammar `
149
+ + `(expected ${JSON.stringify(ProviderInstantiate.#VERIFY_TOKEN)}, got ${JSON.stringify(content.slice(0, 40))}). `
150
+ + `The provider likely failed to detect the llama-server backend (grammarStyle 'none') — the grammar was never transported. `
151
+ + `Refusing to boot: unconstrained generation reads as model failure and hides that the rails are dark. `
152
+ + `Check the backend is a live llama-server (/v1/models must carry a per-model 'meta'), or unset PLURNK_PROVIDERS_GBNF to run unconstrained deliberately.`);
153
+ }
154
+ }
155
+ }
156
+ //# sourceMappingURL=ProviderInstantiate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderInstantiate.js","sourceRoot":"","sources":["../../src/core/ProviderInstantiate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { LoopFlags } from "./types.ts";
2
+ import type { PacketSection } from "./packet-wire.ts";
3
+ import type ExecutorRegistry from "./ExecutorRegistry.ts";
4
+ import type { Executor } from "./ExecutorRegistry.ts";
5
+ export default class SchemeRegistry {
6
+ #private;
7
+ constructor();
8
+ register(name: string, handler: object): void;
9
+ registerRuntimeSchemes(executors: ExecutorRegistry): void;
10
+ registerRuntimeScheme(tag: string, executor: Executor): void;
11
+ get(name: string): object | undefined;
12
+ has(name: string): boolean;
13
+ isExternal(name: string): boolean;
14
+ list(): string[];
15
+ defaultChannelFor(scheme: string | null): string;
16
+ teach(): string;
17
+ docs(): Array<{
18
+ name: string;
19
+ content: string;
20
+ }>;
21
+ transformSections(sections: PacketSection[]): Promise<PacketSection[]>;
22
+ discoverExternal(cwd?: string): Promise<void>;
23
+ attributions(): string[];
24
+ resolveForLoop(flags: LoopFlags): Set<string>;
25
+ }
26
+ //# sourceMappingURL=SchemeRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemeRegistry.d.ts","sourceRoot":"","sources":["../../src/core/SchemeRegistry.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAItD,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAkBtD,MAAM,CAAC,OAAO,OAAO,cAAc;;IAc/B,cAaC;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAG5C;IAOD,sBAAsB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAMxD;IAOD,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAQ3D;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAqC;IAE1E,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAqC;IAI/D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAqC;IAEtE,IAAI,IAAI,MAAM,EAAE,CAAkD;IAIlE,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAI/C;IAWD,KAAK,IAAI,MAAM,CAYd;IAID,IAAI,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAW/C;IAOK,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAO3E;IAUK,gBAAgB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAajE;IAID,YAAY,IAAI,MAAM,EAAE,CAAoC;IAI5D,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAE5C;CACJ"}