@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,58 @@
1
+ // #312 — the token gauge: derived token counts keyed on (content_hash, tokenizer_id), the
2
+ // deep_hash discipline applied to token arithmetic. The mimetypes Tokenizers seam (mimetypes#44)
3
+ // supplies the identity (tokenizer.json sha — NEVER the model id: deepseek pro↔flash share a
4
+ // vocab, so that swap recounts nothing; gemma↔deepseek recounts all) and the exact counter.
5
+ // When the seam resolves nothing exact for the active model, the provider's chars/2 upper bound
6
+ // is used AND SURFACED (`tokenizer_unavailable`, once per model) — an error-class signal, never
7
+ // a silent number. Resolutions are cached per model ref; derivation rows are shared session-wide.
8
+ import { createHash } from "node:crypto";
9
+ export default class TokenGauge {
10
+ static #resolutions = new Map();
11
+ static #warned = new Set();
12
+ static contentHash(content) {
13
+ return createHash("sha256").update(content).digest("hex");
14
+ }
15
+ // Resolve the active model's gauge: the seam's exact tokenizer, or the provider's surfaced
16
+ // upper bound labeled with a heuristic identity (so its rows never masquerade as exact ones).
17
+ // providers#37 (delivered, 0.35.0): Provider.servedModel is the backend's self-reported
18
+ // identity from the boot probe — an alias-fronted local backend ('turboderp' → the gguf name)
19
+ // resolves its exact tokenizer from turn 1. Absent (hosted/no-probe), the alias model tries;
20
+ // inexact runs as a SURFACED upper bound (#312 ask 3) — never a silent number.
21
+ static async resolve(mimetypes, provider, pushTelemetry) {
22
+ const key = provider.model;
23
+ const cached = TokenGauge.#resolutions.get(key);
24
+ if (cached !== undefined)
25
+ return cached;
26
+ let resolution;
27
+ try {
28
+ if (mimetypes === undefined)
29
+ throw new Error("no mimetypes seam");
30
+ const r = await mimetypes.tokenizer(provider.servedModel ?? provider.model);
31
+ resolution = { tokenizerId: r.exact ? r.tokenizerId : `heuristic:${r.tokenizerId}`, exact: r.exact, count: (text) => r.countTokens(text) };
32
+ if (!r.exact && !TokenGauge.#warned.has(key)) {
33
+ TokenGauge.#warned.add(key);
34
+ pushTelemetry?.({ source: "engine:tokens", kind: "tokenizer_unavailable", message: `no exact tokenizer for '${provider.model}' — counts are an upper bound (chars/2 class); budget refusals run conservative`, level: "warn" });
35
+ }
36
+ }
37
+ catch {
38
+ resolution = { tokenizerId: "heuristic:provider", exact: false, count: async (text) => provider.countTokens(text) };
39
+ if (!TokenGauge.#warned.has(key)) {
40
+ TokenGauge.#warned.add(key);
41
+ pushTelemetry?.({ source: "engine:tokens", kind: "tokenizer_unavailable", message: `tokenizer seam resolved nothing for '${provider.model}' — provider upper bound in use`, level: "warn" });
42
+ }
43
+ }
44
+ TokenGauge.#resolutions.set(key, resolution);
45
+ return resolution;
46
+ }
47
+ // The keyed lookup: (content_hash, tokenizer_id) → tokens; miss → count + upsert. The row is
48
+ // shared by every entry carrying identical content, across models sharing a vocabulary.
49
+ static async tokensFor(db, gauge, contentHash, content) {
50
+ const hit = await db.token_count_get.get({ content_hash: contentHash, tokenizer_id: gauge.tokenizerId });
51
+ if (hit !== undefined)
52
+ return hit.tokens;
53
+ const tokens = await gauge.count(content);
54
+ await db.token_count_upsert.run({ content_hash: contentHash, tokenizer_id: gauge.tokenizerId, tokens });
55
+ return tokens;
56
+ }
57
+ }
58
+ //# sourceMappingURL=TokenGauge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenGauge.js","sourceRoot":"","sources":["../../src/core/TokenGauge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { PlurnkSchemeContext } from "../scheme-types.ts";
2
+ export default class CapsResolve {
3
+ static entryId(ctx: PlurnkSchemeContext, scheme: string | null, pathname: string): Promise<number | null>;
4
+ }
5
+ //# sourceMappingURL=CapsResolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CapsResolve.d.ts","sourceRoot":"","sources":["../../../src/core/caps/CapsResolve.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,MAAM,CAAC,OAAO,OAAO,WAAW;IAC5B,OAAa,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAK9G;CACJ"}
@@ -0,0 +1,13 @@
1
+ // Shared pathname→entryId resolution for the db-backed capability impls.
2
+ // channels/tags/notify operate on entry-id-keyed statements; entries goes
3
+ // through EntryCrud (which resolves internally). Static delegation, not a base
4
+ // class — the caps call it, they don't inherit it.
5
+ export default class CapsResolve {
6
+ static async entryId(ctx, scheme, pathname) {
7
+ const row = await ctx.db.crud_find_session_entry.get({
8
+ session_id: ctx.sessionId, scheme, pathname,
9
+ });
10
+ return row?.id ?? null;
11
+ }
12
+ }
13
+ //# sourceMappingURL=CapsResolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CapsResolve.js","sourceRoot":"","sources":["../../../src/core/caps/CapsResolve.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,0EAA0E;AAC1E,+EAA+E;AAC/E,mDAAmD;AAKnD,MAAM,CAAC,OAAO,OAAO,WAAW;IAC5B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAwB,EAAE,MAAqB,EAAE,QAAgB;QAClF,MAAM,GAAG,GAAG,MAAO,GAAG,CAAC,EAAE,CAAC,uBAAsC,CAAC,GAAG,CAAiB;YACjF,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ;SAC9C,CAAC,CAAC;QACH,OAAO,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC;IAC3B,CAAC;CACJ"}
@@ -0,0 +1,16 @@
1
+ import type { ChannelCaps, ChannelState } from "@plurnk/plurnk-schemes";
2
+ import type { PlurnkSchemeContext } from "../scheme-types.ts";
3
+ export default class DbChannelCaps implements ChannelCaps {
4
+ #private;
5
+ constructor(ctx: PlurnkSchemeContext, scheme: string | null);
6
+ append(pathname: string, channel: string, content: string): Promise<{
7
+ status: number;
8
+ }>;
9
+ replace(pathname: string, channel: string, content: string): Promise<{
10
+ status: number;
11
+ }>;
12
+ setState(pathname: string, channel: string, state: ChannelState): Promise<{
13
+ status: number;
14
+ }>;
15
+ }
16
+ //# sourceMappingURL=DbChannelCaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbChannelCaps.d.ts","sourceRoot":"","sources":["../../../src/core/caps/DbChannelCaps.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAI9D,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,WAAW;;IAIrD,YAAY,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAG1D;IAEK,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAK5F;IAEK,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAS7F;IAEK,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAKlG;CACJ"}
@@ -0,0 +1,41 @@
1
+ // db-backed ChannelCaps (@plurnk/plurnk-schemes) — keystone PR-2 seam (#180).
2
+ // append/replace/setState over a single channel, addressed by pathname. Resolves
3
+ // pathname→entryId, then drives the ChannelWrite SQL. append grows existing
4
+ // content (token re-count deferred to render, per §tokenomics); replace swaps content
5
+ // and re-tokenizes at write. Absent entry or channel → 404.
6
+ import CapsResolve from "./CapsResolve.js";
7
+ export default class DbChannelCaps {
8
+ #ctx;
9
+ #scheme;
10
+ constructor(ctx, scheme) {
11
+ this.#ctx = ctx;
12
+ this.#scheme = scheme;
13
+ }
14
+ async append(pathname, channel, content) {
15
+ const entryId = await CapsResolve.entryId(this.#ctx, this.#scheme, pathname);
16
+ if (entryId === null)
17
+ return { status: 404 };
18
+ const r = await this.#ctx.db.append_to_channel.run({ chunk: content, entry_id: entryId, channel });
19
+ return { status: r.changes > 0 ? 200 : 404 };
20
+ }
21
+ async replace(pathname, channel, content) {
22
+ const { tokenize } = this.#ctx;
23
+ if (tokenize === undefined)
24
+ throw new Error("DbChannelCaps.replace: ctx.tokenize is required for token accounting");
25
+ const entryId = await CapsResolve.entryId(this.#ctx, this.#scheme, pathname);
26
+ if (entryId === null)
27
+ return { status: 404 };
28
+ const r = await this.#ctx.db.replace_channel_content.run({
29
+ content, tokens: tokenize(content), entry_id: entryId, channel,
30
+ });
31
+ return { status: r.changes > 0 ? 200 : 404 };
32
+ }
33
+ async setState(pathname, channel, state) {
34
+ const entryId = await CapsResolve.entryId(this.#ctx, this.#scheme, pathname);
35
+ if (entryId === null)
36
+ return { status: 404 };
37
+ const r = await this.#ctx.db.set_channel_state.run({ state, entry_id: entryId, channel });
38
+ return { status: r.changes > 0 ? 200 : 404 };
39
+ }
40
+ }
41
+ //# sourceMappingURL=DbChannelCaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbChannelCaps.js","sourceRoot":"","sources":["../../../src/core/caps/DbChannelCaps.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,iFAAiF;AACjF,4EAA4E;AAC5E,sFAAsF;AACtF,4DAA4D;AAK5D,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAE3C,MAAM,CAAC,OAAO,OAAO,aAAa;IACrB,IAAI,CAAsB;IAC1B,OAAO,CAAgB;IAEhC,YAAY,GAAwB,EAAE,MAAqB;QACvD,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,OAAe,EAAE,OAAe;QAC3D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7E,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,MAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAgC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACnH,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,OAAe,EAAE,OAAe;QAC5D,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAC/B,IAAI,QAAQ,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;QACpH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7E,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,MAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,uBAAsC,CAAC,GAAG,CAAC;YACrE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO;SACjE,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,OAAe,EAAE,KAAmB;QACjE,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7E,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,MAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAgC,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1G,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACjD,CAAC;CACJ"}
@@ -0,0 +1,19 @@
1
+ import type { EntryCaps, EntryData } from "@plurnk/plurnk-schemes";
2
+ import type { PlurnkSchemeContext } from "../scheme-types.ts";
3
+ export default class DbEntryCaps implements EntryCaps {
4
+ #private;
5
+ constructor(ctx: PlurnkSchemeContext, scheme: string | null);
6
+ read(pathname: string): Promise<{
7
+ status: number;
8
+ entry: EntryData | null;
9
+ }>;
10
+ write(pathname: string, entry: EntryData): Promise<{
11
+ status: number;
12
+ created: boolean;
13
+ entryId: number | null;
14
+ }>;
15
+ delete(pathname: string): Promise<{
16
+ status: number;
17
+ }>;
18
+ }
19
+ //# sourceMappingURL=DbEntryCaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbEntryCaps.d.ts","sourceRoot":"","sources":["../../../src/core/caps/DbEntryCaps.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,MAAM,CAAC,OAAO,OAAO,WAAY,YAAW,SAAS;;IAIjD,YAAY,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAG1D;IAEK,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;KAAE,CAAC,CAEjF;IAEK,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAIrH;IAEK,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAE1D;CACJ"}
@@ -0,0 +1,28 @@
1
+ // db-backed EntryCaps (@plurnk/plurnk-schemes) — the keystone PR-2 seam (#180).
2
+ // schemes exports the capability interfaces; plurnk-service injects this
3
+ // db-backed impl so a third-party `@plurnk/plurnk-schemes-*` sibling reaches
4
+ // entries through intent (read/write/delete) instead of the forbidden raw
5
+ // `ctx.db` (schemes SPEC §channels). Binds a PlurnkSchemeContext + the scheme name and
6
+ // delegates 1:1 to EntryCrud — the same path the in-tree schemes use during
7
+ // transition, so the adapter is zero-behavior-change over a proven primitive.
8
+ import EntryCrud from "../../schemes/_entry-crud.js";
9
+ export default class DbEntryCaps {
10
+ #ctx;
11
+ #scheme;
12
+ constructor(ctx, scheme) {
13
+ this.#ctx = ctx;
14
+ this.#scheme = scheme;
15
+ }
16
+ async read(pathname) {
17
+ return EntryCrud.readEntry(pathname, this.#ctx, this.#scheme);
18
+ }
19
+ async write(pathname, entry) {
20
+ // schemes' EntryData carries `tags` as ReadonlyArray; EntryCrud writes a
21
+ // mutable array — copy at the boundary.
22
+ return EntryCrud.writeEntry(pathname, { channels: entry.channels, tags: [...entry.tags] }, this.#ctx, this.#scheme);
23
+ }
24
+ async delete(pathname) {
25
+ return EntryCrud.deleteEntry(pathname, this.#ctx, this.#scheme);
26
+ }
27
+ }
28
+ //# sourceMappingURL=DbEntryCaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbEntryCaps.js","sourceRoot":"","sources":["../../../src/core/caps/DbEntryCaps.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,yEAAyE;AACzE,6EAA6E;AAC7E,0EAA0E;AAC1E,uFAAuF;AACvF,4EAA4E;AAC5E,8EAA8E;AAI9E,OAAO,SAAS,MAAM,8BAA8B,CAAC;AAErD,MAAM,CAAC,OAAO,OAAO,WAAW;IACnB,IAAI,CAAsB;IAC1B,OAAO,CAAgB;IAEhC,YAAY,GAAwB,EAAE,MAAqB;QACvD,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB;QACvB,OAAO,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,KAAgB;QAC1C,yEAAyE;QACzE,wCAAwC;QACxC,OAAO,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACxH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB;QACzB,OAAO,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACpE,CAAC;CACJ"}
@@ -0,0 +1,8 @@
1
+ import type { NotifyCaps, ChannelState } from "@plurnk/plurnk-schemes";
2
+ import type { PlurnkSchemeContext } from "../scheme-types.ts";
3
+ export default class DbNotifyCaps implements NotifyCaps {
4
+ #private;
5
+ constructor(ctx: PlurnkSchemeContext, scheme: string | null);
6
+ streamEvent(pathname: string, channel: string, state: ChannelState, contentLength: number): void;
7
+ }
8
+ //# sourceMappingURL=DbNotifyCaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbNotifyCaps.d.ts","sourceRoot":"","sources":["../../../src/core/caps/DbNotifyCaps.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAI9D,MAAM,CAAC,OAAO,OAAO,YAAa,YAAW,UAAU;;IAInD,YAAY,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAG1D;IAED,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAO/F;CAQJ"}
@@ -0,0 +1,35 @@
1
+ // db-backed NotifyCaps (@plurnk/plurnk-schemes 0.4.3) — keystone PR-2 seam (#180).
2
+ // streamEvent fires a stream/event notification for a channel transition.
3
+ // (wakeRun was dropped in 0.4.3 — the rich run-wake lives on subscriptions.close,
4
+ // the only place with the close context to populate it.)
5
+ //
6
+ // streamEvent is sync per the cap contract, but the StreamEventPayload's entryId
7
+ // needs an async pathname→entryId lookup. The event is advisory (not a state
8
+ // change), so we emit best-effort: no notifier wired (standalone/test) → no-op;
9
+ // a vanished entry → no event.
10
+ import CapsResolve from "./CapsResolve.js";
11
+ export default class DbNotifyCaps {
12
+ #ctx;
13
+ #scheme;
14
+ constructor(ctx, scheme) {
15
+ this.#ctx = ctx;
16
+ this.#scheme = scheme;
17
+ }
18
+ streamEvent(pathname, channel, state, contentLength) {
19
+ const notify = this.#ctx.streamEventNotify;
20
+ if (notify === undefined)
21
+ return;
22
+ // Advisory best-effort emit (sync contract, async entryId lookup): a resolve/notify
23
+ // failure — e.g. the db closing under a late emit — is silently no-event per the cap
24
+ // contract, never an unhandled rejection on the fire-and-forget.
25
+ this.#emit(notify, pathname, channel, state, contentLength).catch(() => { });
26
+ }
27
+ async #emit(notify, pathname, channel, state, contentLength) {
28
+ const entryId = await CapsResolve.entryId(this.#ctx, this.#scheme, pathname);
29
+ if (entryId === null)
30
+ return;
31
+ const target = this.#scheme === null ? `file://${pathname}` : `${this.#scheme}://${pathname}`;
32
+ notify(this.#ctx.sessionId, { entryId, target, channel, state, contentLength });
33
+ }
34
+ }
35
+ //# sourceMappingURL=DbNotifyCaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbNotifyCaps.js","sourceRoot":"","sources":["../../../src/core/caps/DbNotifyCaps.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,0EAA0E;AAC1E,kFAAkF;AAClF,yDAAyD;AACzD,EAAE;AACF,iFAAiF;AACjF,6EAA6E;AAC7E,gFAAgF;AAChF,+BAA+B;AAK/B,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAE3C,MAAM,CAAC,OAAO,OAAO,YAAY;IACpB,IAAI,CAAsB;IAC1B,OAAO,CAAgB;IAEhC,YAAY,GAAwB,EAAE,MAAqB;QACvD,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,QAAgB,EAAE,OAAe,EAAE,KAAmB,EAAE,aAAqB;QACrF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAC3C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO;QACjC,oFAAoF;QACpF,qFAAqF;QACrF,iEAAiE;QACjE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAyB,EAAE,QAAgB,EAAE,OAAe,EAAE,KAAmB,EAAE,aAAqB;QAChH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7E,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,MAAM,QAAQ,EAAE,CAAC;QAC9F,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IACpF,CAAC;CACJ"}
@@ -0,0 +1,10 @@
1
+ import type { SubscriptionCaps, SubscriptionHandle } from "@plurnk/plurnk-schemes";
2
+ import type { PlurnkSchemeContext } from "../scheme-types.ts";
3
+ export default class DbSubscriptionCaps implements SubscriptionCaps {
4
+ #private;
5
+ constructor(ctx: PlurnkSchemeContext, scheme: string | null);
6
+ open(pathname: string, handle: SubscriptionHandle): Promise<AbortSignal>;
7
+ notifyChunk(channel: string, chunk: string, mimetype?: string): Promise<void>;
8
+ close(reason: "done" | "error", outcome?: string): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=DbSubscriptionCaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbSubscriptionCaps.d.ts","sourceRoot":"","sources":["../../../src/core/caps/DbSubscriptionCaps.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAgB,MAAM,wBAAwB,CAAC;AACjG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAK9D,MAAM,CAAC,OAAO,OAAO,kBAAmB,YAAW,gBAAgB;;IAQ/D,YAAY,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAG1D;IAEK,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAsB7E;IAEK,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlF;IAEK,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBrE;CACJ"}
@@ -0,0 +1,86 @@
1
+ // db-backed SubscriptionCaps (@plurnk/plurnk-schemes) — keystone PR-2 seam (#180).
2
+ // The streaming lifecycle a sibling drives:
3
+ // open(pathname, handle) → registers the subscription and hands back a
4
+ // run+teardown-composed AbortSignal; a run abort also force-cancels the
5
+ // sibling's handle (mirrors the exec scheme's #activeAborts).
6
+ // notifyChunk(channel, chunk) → FUSED append-to-channel + stream/event.
7
+ // close(reason, outcome?) → composites every channel's terminal state, the
8
+ // registry close, and the rich run-wake (the only place with the close
9
+ // context to populate it — which is why NotifyCaps dropped wakeRun, #180).
10
+ // Stateful: open() binds the entry + subscription that notifyChunk()/close()
11
+ // operate on. Models src/schemes/Exec.ts over the same ChannelWrite primitives.
12
+ import ChannelWrite from "../ChannelWrite.js";
13
+ import CapsResolve from "./CapsResolve.js";
14
+ export default class DbSubscriptionCaps {
15
+ #ctx;
16
+ #scheme;
17
+ #pathname = null;
18
+ #entryId = null;
19
+ #subscriptionId = null;
20
+ #unlink = () => { };
21
+ constructor(ctx, scheme) {
22
+ this.#ctx = ctx;
23
+ this.#scheme = scheme;
24
+ }
25
+ async open(pathname, handle) {
26
+ const entryId = await CapsResolve.entryId(this.#ctx, this.#scheme, pathname);
27
+ if (entryId === null)
28
+ throw new Error(`subscriptions.open: no entry at ${pathname}`);
29
+ const subscriptionId = await ChannelWrite.openSubscription(this.#ctx.db, {
30
+ runId: this.#ctx.runId, entryId, scheme: this.#scheme ?? "file", handle: pathname,
31
+ });
32
+ // Compose the run signal with a fresh controller; a run abort also
33
+ // force-cancels the sibling's handle.
34
+ const controller = new AbortController();
35
+ const parent = this.#ctx.signal;
36
+ if (parent !== undefined) {
37
+ if (parent.aborted) {
38
+ void handle.cancel();
39
+ controller.abort(parent.reason);
40
+ }
41
+ else {
42
+ const onAbort = () => { void handle.cancel(); controller.abort(parent.reason); };
43
+ parent.addEventListener("abort", onAbort, { once: true });
44
+ this.#unlink = () => parent.removeEventListener("abort", onAbort);
45
+ }
46
+ }
47
+ this.#pathname = pathname;
48
+ this.#entryId = entryId;
49
+ this.#subscriptionId = subscriptionId;
50
+ return controller.signal;
51
+ }
52
+ async notifyChunk(channel, chunk, mimetype) {
53
+ if (this.#entryId === null)
54
+ throw new Error("subscriptions.notifyChunk: no open subscription");
55
+ await ChannelWrite.appendToChannel(this.#ctx.db, {
56
+ entryId: this.#entryId, channel, chunk, notify: this.#ctx.streamEventNotify, mimetype,
57
+ });
58
+ }
59
+ async close(reason, outcome) {
60
+ const entryId = this.#entryId;
61
+ const subscriptionId = this.#subscriptionId;
62
+ if (entryId === null || subscriptionId === null)
63
+ throw new Error("subscriptions.close: no open subscription");
64
+ const state = reason === "error" ? "errored" : "closed";
65
+ const closeStatus = reason === "error" ? 500 : 200;
66
+ // Every channel of the entry → terminal state, then the registry row
67
+ // closes, then the run wakes with the scheme's summary.
68
+ const channels = await this.#ctx.db.crud_read_channels.all({ entry_id: entryId });
69
+ for (const { name } of channels) {
70
+ await ChannelWrite.setChannelState(this.#ctx.db, { entryId, channel: name, state, notify: this.#ctx.streamEventNotify });
71
+ }
72
+ await ChannelWrite.closeSubscription(this.#ctx.db, { subscriptionId, status: closeStatus });
73
+ this.#unlink();
74
+ const target = this.#scheme === null ? `file://${this.#pathname}` : `${this.#scheme}://${this.#pathname}`;
75
+ this.#ctx.wakeRunNotify?.({
76
+ sessionId: this.#ctx.sessionId, runId: this.#ctx.runId,
77
+ entryId, target, subscriptionId, closeStatus,
78
+ scheme: this.#scheme ?? "file", summary: outcome ?? "",
79
+ });
80
+ this.#pathname = null;
81
+ this.#entryId = null;
82
+ this.#subscriptionId = null;
83
+ this.#unlink = () => { };
84
+ }
85
+ }
86
+ //# sourceMappingURL=DbSubscriptionCaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbSubscriptionCaps.js","sourceRoot":"","sources":["../../../src/core/caps/DbSubscriptionCaps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { TagCaps } from "@plurnk/plurnk-schemes";
2
+ import type { PlurnkSchemeContext } from "../scheme-types.ts";
3
+ export default class DbTagCaps implements TagCaps {
4
+ #private;
5
+ constructor(ctx: PlurnkSchemeContext, scheme: string | null);
6
+ add(pathname: string, tags: ReadonlyArray<string>): Promise<{
7
+ status: number;
8
+ }>;
9
+ remove(pathname: string, tags: ReadonlyArray<string>): Promise<{
10
+ status: number;
11
+ }>;
12
+ list(pathname: string): Promise<{
13
+ status: number;
14
+ tags: ReadonlyArray<string>;
15
+ }>;
16
+ }
17
+ //# sourceMappingURL=DbTagCaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbTagCaps.d.ts","sourceRoot":"","sources":["../../../src/core/caps/DbTagCaps.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAI9D,MAAM,CAAC,OAAO,OAAO,SAAU,YAAW,OAAO;;IAI7C,YAAY,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAG1D;IAEK,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAKpF;IAEK,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAKvF;IAEK,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC,CAKrF;CACJ"}
@@ -0,0 +1,37 @@
1
+ // db-backed TagCaps (@plurnk/plurnk-schemes) — keystone PR-2 seam (#180).
2
+ // add/remove/list folksonomic tags on an entry, addressed by pathname. add is
3
+ // INSERT OR IGNORE (idempotent — re-adding a tag is a no-op); list returns them
4
+ // tag-sorted; remove drops the named tags. Absent entry → 404.
5
+ import CapsResolve from "./CapsResolve.js";
6
+ export default class DbTagCaps {
7
+ #ctx;
8
+ #scheme;
9
+ constructor(ctx, scheme) {
10
+ this.#ctx = ctx;
11
+ this.#scheme = scheme;
12
+ }
13
+ async add(pathname, tags) {
14
+ const entryId = await CapsResolve.entryId(this.#ctx, this.#scheme, pathname);
15
+ if (entryId === null)
16
+ return { status: 404 };
17
+ for (const tag of tags)
18
+ await this.#ctx.db.crud_write_tag.run({ entry_id: entryId, tag });
19
+ return { status: 200 };
20
+ }
21
+ async remove(pathname, tags) {
22
+ const entryId = await CapsResolve.entryId(this.#ctx, this.#scheme, pathname);
23
+ if (entryId === null)
24
+ return { status: 404 };
25
+ for (const tag of tags)
26
+ await this.#ctx.db.crud_delete_tag.run({ entry_id: entryId, tag });
27
+ return { status: 200 };
28
+ }
29
+ async list(pathname) {
30
+ const entryId = await CapsResolve.entryId(this.#ctx, this.#scheme, pathname);
31
+ if (entryId === null)
32
+ return { status: 404, tags: [] };
33
+ const rows = await this.#ctx.db.crud_read_tags.all({ entry_id: entryId });
34
+ return { status: 200, tags: rows.map((r) => r.tag) };
35
+ }
36
+ }
37
+ //# sourceMappingURL=DbTagCaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbTagCaps.js","sourceRoot":"","sources":["../../../src/core/caps/DbTagCaps.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8EAA8E;AAC9E,gFAAgF;AAChF,+DAA+D;AAK/D,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAE3C,MAAM,CAAC,OAAO,OAAO,SAAS;IACjB,IAAI,CAAsB;IAC1B,OAAO,CAAgB;IAEhC,YAAY,GAAwB,EAAE,MAAqB;QACvD,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,QAAgB,EAAE,IAA2B;QACnD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7E,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC7C,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,MAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,cAA6B,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1G,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,IAA2B;QACtD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7E,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC7C,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,MAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,eAA8B,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3G,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB;QACvB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7E,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,MAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,cAA6B,CAAC,GAAG,CAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3G,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IACzD,CAAC;CACJ"}
@@ -0,0 +1,18 @@
1
+ import type { SchemeCtx, EntryCaps, ChannelCaps, TagCaps, NotifyCaps, SubscriptionCaps, CrossSchemeCaps, WriterTier } from "@plurnk/plurnk-schemes";
2
+ import type { PlurnkSchemeContext } from "../scheme-types.ts";
3
+ export default class SchemeCtxImpl implements SchemeCtx {
4
+ readonly sessionId: number;
5
+ readonly runId: number;
6
+ readonly loopId: number;
7
+ readonly turnId: number;
8
+ readonly writer: WriterTier;
9
+ readonly signal: AbortSignal | undefined;
10
+ readonly entries: EntryCaps;
11
+ readonly channels: ChannelCaps;
12
+ readonly tags: TagCaps;
13
+ readonly notify: NotifyCaps;
14
+ readonly subscriptions: SubscriptionCaps;
15
+ readonly crossScheme: CrossSchemeCaps;
16
+ constructor(ctx: PlurnkSchemeContext, scheme: string | null);
17
+ }
18
+ //# sourceMappingURL=SchemeCtxImpl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemeCtxImpl.d.ts","sourceRoot":"","sources":["../../../src/core/caps/SchemeCtxImpl.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,UAAU,EACxG,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAW9D,MAAM,CAAC,OAAO,OAAO,aAAc,YAAW,SAAS;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,gBAAgB,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAqB;IAE1D,YAAY,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAY1D;CACJ"}
@@ -0,0 +1,42 @@
1
+ // db-backed SchemeCtx (@plurnk/plurnk-schemes) — keystone PR-2 (#180). Assembles
2
+ // the capability surface a third-party @plurnk/plurnk-schemes-* sibling receives:
3
+ // identity fields lifted off the PlurnkSchemeContext, the five db-backed caps,
4
+ // and the deferred crossScheme stub. A sibling reaches the substrate ONLY through
5
+ // this — never the raw ctx.db (schemes SPEC §channels). `visibility` is absent: entry
6
+ // visibility is gone post-teardown, so schemes dropped the cap (0.4.3).
7
+ import DbEntryCaps from "./DbEntryCaps.js";
8
+ import DbChannelCaps from "./DbChannelCaps.js";
9
+ import DbTagCaps from "./DbTagCaps.js";
10
+ import DbNotifyCaps from "./DbNotifyCaps.js";
11
+ import DbSubscriptionCaps from "./DbSubscriptionCaps.js";
12
+ const CROSS_SCHEME_STUB = {
13
+ _deferred: "see plurnk-service#180 — designed when first cross-scheme COPY/MOVE forces the FROM/TO shape",
14
+ };
15
+ export default class SchemeCtxImpl {
16
+ sessionId;
17
+ runId;
18
+ loopId;
19
+ turnId;
20
+ writer;
21
+ signal;
22
+ entries;
23
+ channels;
24
+ tags;
25
+ notify;
26
+ subscriptions;
27
+ crossScheme = CROSS_SCHEME_STUB;
28
+ constructor(ctx, scheme) {
29
+ this.sessionId = ctx.sessionId;
30
+ this.runId = ctx.runId;
31
+ this.loopId = ctx.loopId;
32
+ this.turnId = ctx.turnId;
33
+ this.writer = ctx.writer;
34
+ this.signal = ctx.signal;
35
+ this.entries = new DbEntryCaps(ctx, scheme);
36
+ this.channels = new DbChannelCaps(ctx, scheme);
37
+ this.tags = new DbTagCaps(ctx, scheme);
38
+ this.notify = new DbNotifyCaps(ctx, scheme);
39
+ this.subscriptions = new DbSubscriptionCaps(ctx, scheme);
40
+ }
41
+ }
42
+ //# sourceMappingURL=SchemeCtxImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemeCtxImpl.js","sourceRoot":"","sources":["../../../src/core/caps/SchemeCtxImpl.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,kFAAkF;AAClF,+EAA+E;AAC/E,kFAAkF;AAClF,sFAAsF;AACtF,wEAAwE;AAMxE,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAEzD,MAAM,iBAAiB,GAAoB;IACvC,SAAS,EAAE,8FAA8F;CAC5G,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,aAAa;IACrB,SAAS,CAAS;IAClB,KAAK,CAAS;IACd,MAAM,CAAS;IACf,MAAM,CAAS;IACf,MAAM,CAAa;IACnB,MAAM,CAA0B;IAChC,OAAO,CAAY;IACnB,QAAQ,CAAc;IACtB,IAAI,CAAU;IACd,MAAM,CAAa;IACnB,aAAa,CAAmB;IAChC,WAAW,GAAoB,iBAAiB,CAAC;IAE1D,YAAY,GAAwB,EAAE,MAAqB;QACvD,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAC/B,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,aAAa,GAAG,IAAI,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;CACJ"}
@@ -0,0 +1,19 @@
1
+ export type EnvDefaultsFile = {
2
+ owner: string;
3
+ text: string;
4
+ parsed: Record<string, string>;
5
+ };
6
+ export default class EnvDefaults {
7
+ #private;
8
+ static collect(serviceRoot: string, nodeModules: string): Promise<EnvDefaultsFile[]>;
9
+ static merge(files: readonly EnvDefaultsFile[]): Map<string, {
10
+ value: string;
11
+ owner: string;
12
+ }>;
13
+ static apply(merged: ReadonlyMap<string, {
14
+ value: string;
15
+ owner: string;
16
+ }>): void;
17
+ static renderCatalog(files: readonly EnvDefaultsFile[]): string;
18
+ }
19
+ //# sourceMappingURL=env-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-defaults.d.ts","sourceRoot":"","sources":["../../src/core/env-defaults.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,WAAW;;IAqC5B,OAAa,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAKzF;IAID,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAU7F;IAGD,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAEhF;IAID,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAQ9D;CACJ"}