@homeflare/alchemy 0.43.0 → 0.45.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 (612) hide show
  1. package/README.md +10 -1
  2. package/dist/caddy/index.js +35 -1
  3. package/dist/caddy/index.js.map +3 -3
  4. package/dist/launchd/index.js +35 -1
  5. package/dist/launchd/index.js.map +3 -3
  6. package/dist/linux/index.js +35 -1
  7. package/dist/linux/index.js.map +3 -3
  8. package/dist/litellm/access-group-form.d.ts +26 -0
  9. package/dist/litellm/access-group-form.d.ts.map +1 -0
  10. package/dist/litellm/access-group-operations.d.ts +37 -0
  11. package/dist/litellm/access-group-operations.d.ts.map +1 -0
  12. package/dist/litellm/access-group-types.d.ts +49 -0
  13. package/dist/litellm/access-group-types.d.ts.map +1 -0
  14. package/dist/litellm/access-group.d.ts +55 -0
  15. package/dist/litellm/access-group.d.ts.map +1 -0
  16. package/dist/litellm/credential-errors.d.ts +131 -0
  17. package/dist/litellm/credential-errors.d.ts.map +1 -0
  18. package/dist/litellm/credential-form.d.ts +79 -0
  19. package/dist/litellm/credential-form.d.ts.map +1 -0
  20. package/dist/litellm/credential-operations.d.ts +84 -0
  21. package/dist/litellm/credential-operations.d.ts.map +1 -0
  22. package/dist/litellm/credential-rewrite.d.ts +6 -0
  23. package/dist/litellm/credential-rewrite.d.ts.map +1 -0
  24. package/dist/litellm/credential-types.d.ts +87 -0
  25. package/dist/litellm/credential-types.d.ts.map +1 -0
  26. package/dist/litellm/credential-values.d.ts +53 -0
  27. package/dist/litellm/credential-values.d.ts.map +1 -0
  28. package/dist/litellm/credential.d.ts +83 -0
  29. package/dist/litellm/credential.d.ts.map +1 -0
  30. package/dist/litellm/fake-access-group-litellm.d.ts +34 -0
  31. package/dist/litellm/fake-access-group-litellm.d.ts.map +1 -0
  32. package/dist/litellm/fake-credential-litellm.d.ts +54 -0
  33. package/dist/litellm/fake-credential-litellm.d.ts.map +1 -0
  34. package/dist/litellm/fake-keys.d.ts +53 -0
  35. package/dist/litellm/fake-keys.d.ts.map +1 -0
  36. package/dist/litellm/fake-litellm.d.ts +4 -1
  37. package/dist/litellm/fake-litellm.d.ts.map +1 -1
  38. package/dist/litellm/fake-mcp-litellm.d.ts +67 -0
  39. package/dist/litellm/fake-mcp-litellm.d.ts.map +1 -0
  40. package/dist/litellm/fake-model-litellm-post-update.d.ts +49 -0
  41. package/dist/litellm/fake-model-litellm-post-update.d.ts.map +1 -0
  42. package/dist/litellm/fake-model-litellm.d.ts +48 -0
  43. package/dist/litellm/fake-model-litellm.d.ts.map +1 -0
  44. package/dist/litellm/fake-policy-attachment-litellm.d.ts +33 -0
  45. package/dist/litellm/fake-policy-attachment-litellm.d.ts.map +1 -0
  46. package/dist/litellm/fake-policy-litellm.d.ts +32 -0
  47. package/dist/litellm/fake-policy-litellm.d.ts.map +1 -0
  48. package/dist/litellm/fake-registry-base.d.ts +42 -0
  49. package/dist/litellm/fake-registry-base.d.ts.map +1 -0
  50. package/dist/litellm/fake-stack.d.ts +8 -1
  51. package/dist/litellm/fake-stack.d.ts.map +1 -1
  52. package/dist/litellm/fake-team-litellm.d.ts +47 -0
  53. package/dist/litellm/fake-team-litellm.d.ts.map +1 -0
  54. package/dist/litellm/fake-tool-litellm.d.ts +28 -0
  55. package/dist/litellm/fake-tool-litellm.d.ts.map +1 -0
  56. package/dist/litellm/fake-toolset-litellm.d.ts +29 -0
  57. package/dist/litellm/fake-toolset-litellm.d.ts.map +1 -0
  58. package/dist/litellm/index.d.ts +18 -0
  59. package/dist/litellm/index.d.ts.map +1 -1
  60. package/dist/litellm/index.js +3078 -2
  61. package/dist/litellm/index.js.map +65 -4
  62. package/dist/litellm/key-errors.d.ts +169 -0
  63. package/dist/litellm/key-errors.d.ts.map +1 -0
  64. package/dist/litellm/key-form.d.ts +119 -0
  65. package/dist/litellm/key-form.d.ts.map +1 -0
  66. package/dist/litellm/key-harness.d.ts +41 -0
  67. package/dist/litellm/key-harness.d.ts.map +1 -0
  68. package/dist/litellm/key-metadata-errors.d.ts +30 -0
  69. package/dist/litellm/key-metadata-errors.d.ts.map +1 -0
  70. package/dist/litellm/key-metadata.d.ts +22 -0
  71. package/dist/litellm/key-metadata.d.ts.map +1 -0
  72. package/dist/litellm/key-operations.d.ts +63 -0
  73. package/dist/litellm/key-operations.d.ts.map +1 -0
  74. package/dist/litellm/key-secret.d.ts +33 -0
  75. package/dist/litellm/key-secret.d.ts.map +1 -0
  76. package/dist/litellm/key.d.ts +78 -0
  77. package/dist/litellm/key.d.ts.map +1 -0
  78. package/dist/litellm/mcp-server-credential.d.ts +50 -0
  79. package/dist/litellm/mcp-server-credential.d.ts.map +1 -0
  80. package/dist/litellm/mcp-server-errors.d.ts +101 -0
  81. package/dist/litellm/mcp-server-errors.d.ts.map +1 -0
  82. package/dist/litellm/mcp-server-form.d.ts +56 -0
  83. package/dist/litellm/mcp-server-form.d.ts.map +1 -0
  84. package/dist/litellm/mcp-server-locate.d.ts +26 -0
  85. package/dist/litellm/mcp-server-locate.d.ts.map +1 -0
  86. package/dist/litellm/mcp-server-operations.d.ts +63 -0
  87. package/dist/litellm/mcp-server-operations.d.ts.map +1 -0
  88. package/dist/litellm/mcp-server-shadow.d.ts +24 -0
  89. package/dist/litellm/mcp-server-shadow.d.ts.map +1 -0
  90. package/dist/litellm/mcp-server-types.d.ts +118 -0
  91. package/dist/litellm/mcp-server-types.d.ts.map +1 -0
  92. package/dist/litellm/mcp-server-url.d.ts +11 -0
  93. package/dist/litellm/mcp-server-url.d.ts.map +1 -0
  94. package/dist/litellm/mcp-server.d.ts +95 -0
  95. package/dist/litellm/mcp-server.d.ts.map +1 -0
  96. package/dist/litellm/model-claim.d.ts +24 -0
  97. package/dist/litellm/model-claim.d.ts.map +1 -0
  98. package/dist/litellm/model-credential.d.ts +12 -0
  99. package/dist/litellm/model-credential.d.ts.map +1 -0
  100. package/dist/litellm/model-errors.d.ts +119 -0
  101. package/dist/litellm/model-errors.d.ts.map +1 -0
  102. package/dist/litellm/model-form.d.ts +78 -0
  103. package/dist/litellm/model-form.d.ts.map +1 -0
  104. package/dist/litellm/model-locate.d.ts +13 -0
  105. package/dist/litellm/model-locate.d.ts.map +1 -0
  106. package/dist/litellm/model-operations.d.ts +59 -0
  107. package/dist/litellm/model-operations.d.ts.map +1 -0
  108. package/dist/litellm/model-types.d.ts +91 -0
  109. package/dist/litellm/model-types.d.ts.map +1 -0
  110. package/dist/litellm/model.d.ts +88 -0
  111. package/dist/litellm/model.d.ts.map +1 -0
  112. package/dist/litellm/policy-attachment-form.d.ts +19 -0
  113. package/dist/litellm/policy-attachment-form.d.ts.map +1 -0
  114. package/dist/litellm/policy-attachment-operations.d.ts +31 -0
  115. package/dist/litellm/policy-attachment-operations.d.ts.map +1 -0
  116. package/dist/litellm/policy-attachment-types.d.ts +48 -0
  117. package/dist/litellm/policy-attachment-types.d.ts.map +1 -0
  118. package/dist/litellm/policy-attachment.d.ts +61 -0
  119. package/dist/litellm/policy-attachment.d.ts.map +1 -0
  120. package/dist/litellm/policy-form.d.ts +22 -0
  121. package/dist/litellm/policy-form.d.ts.map +1 -0
  122. package/dist/litellm/policy-operations.d.ts +42 -0
  123. package/dist/litellm/policy-operations.d.ts.map +1 -0
  124. package/dist/litellm/policy-types.d.ts +57 -0
  125. package/dist/litellm/policy-types.d.ts.map +1 -0
  126. package/dist/litellm/policy.d.ts +65 -0
  127. package/dist/litellm/policy.d.ts.map +1 -0
  128. package/dist/litellm/providers.d.ts +1 -1
  129. package/dist/litellm/providers.d.ts.map +1 -1
  130. package/dist/litellm/registry-errors.d.ts +62 -0
  131. package/dist/litellm/registry-errors.d.ts.map +1 -0
  132. package/dist/litellm/registry-support.d.ts +42 -0
  133. package/dist/litellm/registry-support.d.ts.map +1 -0
  134. package/dist/litellm/team-form.d.ts +26 -0
  135. package/dist/litellm/team-form.d.ts.map +1 -0
  136. package/dist/litellm/team-members.d.ts +10 -0
  137. package/dist/litellm/team-members.d.ts.map +1 -0
  138. package/dist/litellm/team-operations.d.ts +38 -0
  139. package/dist/litellm/team-operations.d.ts.map +1 -0
  140. package/dist/litellm/team-permission.d.ts +35 -0
  141. package/dist/litellm/team-permission.d.ts.map +1 -0
  142. package/dist/litellm/team-types.d.ts +101 -0
  143. package/dist/litellm/team-types.d.ts.map +1 -0
  144. package/dist/litellm/team.d.ts +67 -0
  145. package/dist/litellm/team.d.ts.map +1 -0
  146. package/dist/litellm/tool-policy-form.d.ts +21 -0
  147. package/dist/litellm/tool-policy-form.d.ts.map +1 -0
  148. package/dist/litellm/tool-policy-operations.d.ts +30 -0
  149. package/dist/litellm/tool-policy-operations.d.ts.map +1 -0
  150. package/dist/litellm/tool-policy-types.d.ts +46 -0
  151. package/dist/litellm/tool-policy-types.d.ts.map +1 -0
  152. package/dist/litellm/tool-policy.d.ts +62 -0
  153. package/dist/litellm/tool-policy.d.ts.map +1 -0
  154. package/dist/litellm/toolset-form.d.ts +20 -0
  155. package/dist/litellm/toolset-form.d.ts.map +1 -0
  156. package/dist/litellm/toolset-operations.d.ts +39 -0
  157. package/dist/litellm/toolset-operations.d.ts.map +1 -0
  158. package/dist/litellm/toolset-types.d.ts +46 -0
  159. package/dist/litellm/toolset-types.d.ts.map +1 -0
  160. package/dist/litellm/toolset.d.ts +55 -0
  161. package/dist/litellm/toolset.d.ts.map +1 -0
  162. package/dist/openbao/index.js +35 -1
  163. package/dist/openbao/index.js.map +3 -3
  164. package/dist/ownership/rows.d.ts +11 -0
  165. package/dist/ownership/rows.d.ts.map +1 -1
  166. package/dist/postgres/connection.d.ts +14 -2
  167. package/dist/postgres/connection.d.ts.map +1 -1
  168. package/dist/postgres/database-sql.d.ts +27 -8
  169. package/dist/postgres/database-sql.d.ts.map +1 -1
  170. package/dist/postgres/fake-grants-parse.d.ts +37 -0
  171. package/dist/postgres/fake-grants-parse.d.ts.map +1 -0
  172. package/dist/postgres/fake-grants-read.d.ts +61 -0
  173. package/dist/postgres/fake-grants-read.d.ts.map +1 -0
  174. package/dist/postgres/fake-grants-sql.d.ts +46 -0
  175. package/dist/postgres/fake-grants-sql.d.ts.map +1 -0
  176. package/dist/postgres/fake-grants-write.d.ts +29 -0
  177. package/dist/postgres/fake-grants-write.d.ts.map +1 -0
  178. package/dist/postgres/fake-role-sql.d.ts +41 -0
  179. package/dist/postgres/fake-role-sql.d.ts.map +1 -0
  180. package/dist/postgres/fake-schema-sql.d.ts +42 -0
  181. package/dist/postgres/fake-schema-sql.d.ts.map +1 -0
  182. package/dist/postgres/fake-sql-parse.d.ts +23 -0
  183. package/dist/postgres/fake-sql-parse.d.ts.map +1 -0
  184. package/dist/postgres/fake-sql-quote.d.ts +12 -0
  185. package/dist/postgres/fake-sql-quote.d.ts.map +1 -0
  186. package/dist/postgres/fake-sql.d.ts +42 -0
  187. package/dist/postgres/fake-sql.d.ts.map +1 -1
  188. package/dist/postgres/grants-attrs.d.ts +115 -0
  189. package/dist/postgres/grants-attrs.d.ts.map +1 -0
  190. package/dist/postgres/grants-declare.d.ts +88 -0
  191. package/dist/postgres/grants-declare.d.ts.map +1 -0
  192. package/dist/postgres/grants-diff.d.ts +25 -0
  193. package/dist/postgres/grants-diff.d.ts.map +1 -0
  194. package/dist/postgres/grants-errors.d.ts +137 -0
  195. package/dist/postgres/grants-errors.d.ts.map +1 -0
  196. package/dist/postgres/grants-existence.d.ts +14 -0
  197. package/dist/postgres/grants-existence.d.ts.map +1 -0
  198. package/dist/postgres/grants-ops.d.ts +65 -0
  199. package/dist/postgres/grants-ops.d.ts.map +1 -0
  200. package/dist/postgres/grants-ownership.d.ts +18 -0
  201. package/dist/postgres/grants-ownership.d.ts.map +1 -0
  202. package/dist/postgres/grants-plan-restore.d.ts +22 -0
  203. package/dist/postgres/grants-plan-restore.d.ts.map +1 -0
  204. package/dist/postgres/grants-plan.d.ts +65 -0
  205. package/dist/postgres/grants-plan.d.ts.map +1 -0
  206. package/dist/postgres/grants-read-defaults.d.ts +17 -0
  207. package/dist/postgres/grants-read-defaults.d.ts.map +1 -0
  208. package/dist/postgres/grants-read.d.ts +77 -0
  209. package/dist/postgres/grants-read.d.ts.map +1 -0
  210. package/dist/postgres/grants-refuse.d.ts +25 -0
  211. package/dist/postgres/grants-refuse.d.ts.map +1 -0
  212. package/dist/postgres/grants-sql.d.ts +42 -0
  213. package/dist/postgres/grants-sql.d.ts.map +1 -0
  214. package/dist/postgres/grants-words.d.ts +29 -0
  215. package/dist/postgres/grants-words.d.ts.map +1 -0
  216. package/dist/postgres/grants.d.ts +37 -0
  217. package/dist/postgres/grants.d.ts.map +1 -0
  218. package/dist/postgres/index.d.ts +31 -6
  219. package/dist/postgres/index.d.ts.map +1 -1
  220. package/dist/postgres/index.js +1998 -37
  221. package/dist/postgres/index.js.map +46 -7
  222. package/dist/postgres/installed-classifier.d.ts +13 -0
  223. package/dist/postgres/installed-classifier.d.ts.map +1 -0
  224. package/dist/postgres/providers.d.ts +16 -8
  225. package/dist/postgres/providers.d.ts.map +1 -1
  226. package/dist/postgres/psql-executor.d.ts +4 -0
  227. package/dist/postgres/psql-executor.d.ts.map +1 -1
  228. package/dist/postgres/role-attrs.d.ts +112 -0
  229. package/dist/postgres/role-attrs.d.ts.map +1 -0
  230. package/dist/postgres/role-diff.d.ts +22 -0
  231. package/dist/postgres/role-diff.d.ts.map +1 -0
  232. package/dist/postgres/role-errors.d.ts +132 -0
  233. package/dist/postgres/role-errors.d.ts.map +1 -0
  234. package/dist/postgres/role-membership-sql.d.ts +78 -0
  235. package/dist/postgres/role-membership-sql.d.ts.map +1 -0
  236. package/dist/postgres/role-provider.d.ts +11 -0
  237. package/dist/postgres/role-provider.d.ts.map +1 -0
  238. package/dist/postgres/role-scram.d.ts +8 -0
  239. package/dist/postgres/role-scram.d.ts.map +1 -0
  240. package/dist/postgres/role-secrets.d.ts +38 -0
  241. package/dist/postgres/role-secrets.d.ts.map +1 -0
  242. package/dist/postgres/role-sql.d.ts +68 -0
  243. package/dist/postgres/role-sql.d.ts.map +1 -0
  244. package/dist/postgres/role.d.ts +57 -0
  245. package/dist/postgres/role.d.ts.map +1 -0
  246. package/dist/postgres/schema-assert.d.ts +50 -0
  247. package/dist/postgres/schema-assert.d.ts.map +1 -0
  248. package/dist/postgres/schema-attrs.d.ts +51 -0
  249. package/dist/postgres/schema-attrs.d.ts.map +1 -0
  250. package/dist/postgres/schema-delete.d.ts +28 -0
  251. package/dist/postgres/schema-delete.d.ts.map +1 -0
  252. package/dist/postgres/schema-diff.d.ts +14 -0
  253. package/dist/postgres/schema-diff.d.ts.map +1 -0
  254. package/dist/postgres/schema-errors.d.ts +139 -0
  255. package/dist/postgres/schema-errors.d.ts.map +1 -0
  256. package/dist/postgres/schema-identity.d.ts +8 -0
  257. package/dist/postgres/schema-identity.d.ts.map +1 -0
  258. package/dist/postgres/schema-reconcile.d.ts +12 -0
  259. package/dist/postgres/schema-reconcile.d.ts.map +1 -0
  260. package/dist/postgres/schema-sql.d.ts +45 -0
  261. package/dist/postgres/schema-sql.d.ts.map +1 -0
  262. package/dist/postgres/schema-test-kit.d.ts +67 -0
  263. package/dist/postgres/schema-test-kit.d.ts.map +1 -0
  264. package/dist/postgres/schema.d.ts +54 -0
  265. package/dist/postgres/schema.d.ts.map +1 -0
  266. package/dist/proxmox/index.js +35 -1
  267. package/dist/proxmox/index.js.map +3 -3
  268. package/dist/release/fake-engine.d.ts +10 -0
  269. package/dist/release/fake-engine.d.ts.map +1 -1
  270. package/dist/release/index.js +35 -1
  271. package/dist/release/index.js.map +3 -3
  272. package/dist/valkey/acl-attrs.d.ts +94 -0
  273. package/dist/valkey/acl-attrs.d.ts.map +1 -0
  274. package/dist/valkey/acl-compare.d.ts +28 -0
  275. package/dist/valkey/acl-compare.d.ts.map +1 -0
  276. package/dist/valkey/acl-connection.d.ts +6 -0
  277. package/dist/valkey/acl-connection.d.ts.map +1 -0
  278. package/dist/valkey/acl-form.d.ts +62 -0
  279. package/dist/valkey/acl-form.d.ts.map +1 -0
  280. package/dist/valkey/acl-managed.d.ts +4 -0
  281. package/dist/valkey/acl-managed.d.ts.map +1 -0
  282. package/dist/valkey/acl-ops.d.ts +37 -0
  283. package/dist/valkey/acl-ops.d.ts.map +1 -0
  284. package/dist/valkey/acl-profiles.d.ts +53 -0
  285. package/dist/valkey/acl-profiles.d.ts.map +1 -0
  286. package/dist/valkey/acl-reconcile.d.ts +26 -0
  287. package/dist/valkey/acl-reconcile.d.ts.map +1 -0
  288. package/dist/valkey/acl.d.ts +24 -0
  289. package/dist/valkey/acl.d.ts.map +1 -0
  290. package/dist/valkey/connection-service.d.ts +22 -0
  291. package/dist/valkey/connection-service.d.ts.map +1 -0
  292. package/dist/valkey/connection.d.ts +59 -0
  293. package/dist/valkey/connection.d.ts.map +1 -0
  294. package/dist/valkey/errors.d.ts +165 -0
  295. package/dist/valkey/errors.d.ts.map +1 -0
  296. package/dist/valkey/fake-acl.d.ts +29 -0
  297. package/dist/valkey/fake-acl.d.ts.map +1 -0
  298. package/dist/valkey/fake-valkey.d.ts +35 -0
  299. package/dist/valkey/fake-valkey.d.ts.map +1 -0
  300. package/dist/valkey/handler-test-fixture.d.ts +20 -0
  301. package/dist/valkey/handler-test-fixture.d.ts.map +1 -0
  302. package/dist/valkey/index.d.ts +18 -0
  303. package/dist/valkey/index.d.ts.map +1 -0
  304. package/dist/valkey/index.js +964 -0
  305. package/dist/valkey/index.js.map +27 -0
  306. package/dist/valkey/instance-attrs.d.ts +46 -0
  307. package/dist/valkey/instance-attrs.d.ts.map +1 -0
  308. package/dist/valkey/instance-form.d.ts +22 -0
  309. package/dist/valkey/instance-form.d.ts.map +1 -0
  310. package/dist/valkey/instance.d.ts +48 -0
  311. package/dist/valkey/instance.d.ts.map +1 -0
  312. package/dist/valkey/provider-socket-fixture.d.ts +8 -0
  313. package/dist/valkey/provider-socket-fixture.d.ts.map +1 -0
  314. package/dist/valkey/providers.d.ts +16 -0
  315. package/dist/valkey/providers.d.ts.map +1 -0
  316. package/dist/valkey/resp.d.ts +38 -0
  317. package/dist/valkey/resp.d.ts.map +1 -0
  318. package/dist/valkey/transport-error.d.ts +36 -0
  319. package/dist/valkey/transport-error.d.ts.map +1 -0
  320. package/dist/valkey/transport.d.ts +50 -0
  321. package/dist/valkey/transport.d.ts.map +1 -0
  322. package/docs/litellm-access-group.md +105 -0
  323. package/docs/litellm-credential.md +60 -0
  324. package/docs/litellm-key-metadata.md +56 -0
  325. package/docs/litellm-key.md +194 -0
  326. package/docs/litellm-mcp.md +187 -0
  327. package/docs/litellm-model.md +111 -0
  328. package/docs/litellm-policy-attachment.md +86 -0
  329. package/docs/litellm-policy.md +103 -0
  330. package/docs/litellm-team.md +117 -0
  331. package/docs/litellm-tool-policy.md +90 -0
  332. package/docs/litellm-toolset.md +92 -0
  333. package/docs/litellm.md +16 -9
  334. package/docs/peers.md +15 -6
  335. package/docs/postgres-grants-example.md +55 -0
  336. package/docs/postgres-grants.md +157 -0
  337. package/docs/postgres-role.md +126 -0
  338. package/docs/postgres-schema.md +139 -0
  339. package/docs/postgres.md +20 -3
  340. package/docs/valkey-transport.md +29 -0
  341. package/docs/valkey.md +187 -0
  342. package/package.json +6 -2
  343. package/src/ceph/ceph-argv.test.ts +1 -1
  344. package/src/launchd/sudo-allowlist.test.ts +2 -2
  345. package/src/linux/sudo-allowlist.test.ts +3 -3
  346. package/src/linux/sudo-runner.test.ts +2 -2
  347. package/src/litellm/access-group-form.ts +105 -0
  348. package/src/litellm/access-group-operations.ts +92 -0
  349. package/src/litellm/access-group-types.ts +49 -0
  350. package/src/litellm/access-group.test.ts +197 -0
  351. package/src/litellm/access-group.ts +151 -0
  352. package/src/litellm/credential-errors.ts +183 -0
  353. package/src/litellm/credential-form.test.ts +151 -0
  354. package/src/litellm/credential-form.ts +211 -0
  355. package/src/litellm/credential-guards.test.ts +241 -0
  356. package/src/litellm/credential-operations.ts +208 -0
  357. package/src/litellm/credential-recovery.test.ts +93 -0
  358. package/src/litellm/credential-rewrite.test.ts +164 -0
  359. package/src/litellm/credential-rewrite.ts +50 -0
  360. package/src/litellm/credential-types.ts +117 -0
  361. package/src/litellm/credential-values.ts +94 -0
  362. package/src/litellm/credential.test.ts +218 -0
  363. package/src/litellm/credential.ts +227 -0
  364. package/src/litellm/fake-access-group-litellm.ts +127 -0
  365. package/src/litellm/fake-credential-litellm.ts +216 -0
  366. package/src/litellm/fake-keys.ts +190 -0
  367. package/src/litellm/fake-litellm.ts +19 -9
  368. package/src/litellm/fake-mcp-litellm.ts +214 -0
  369. package/src/litellm/fake-model-litellm-post-update.ts +103 -0
  370. package/src/litellm/fake-model-litellm.ts +233 -0
  371. package/src/litellm/fake-policy-attachment-litellm.ts +97 -0
  372. package/src/litellm/fake-policy-litellm.ts +186 -0
  373. package/src/litellm/fake-registry-base.ts +69 -0
  374. package/src/litellm/fake-stack.ts +17 -1
  375. package/src/litellm/fake-team-litellm.ts +229 -0
  376. package/src/litellm/fake-tool-litellm.ts +88 -0
  377. package/src/litellm/fake-toolset-litellm.ts +110 -0
  378. package/src/litellm/index.ts +140 -0
  379. package/src/litellm/key-delete.test.ts +212 -0
  380. package/src/litellm/key-errors.ts +241 -0
  381. package/src/litellm/key-form.ts +200 -0
  382. package/src/litellm/key-harness.ts +121 -0
  383. package/src/litellm/key-metadata-errors.ts +49 -0
  384. package/src/litellm/key-metadata.test.ts +156 -0
  385. package/src/litellm/key-metadata.ts +74 -0
  386. package/src/litellm/key-operations.ts +184 -0
  387. package/src/litellm/key-rotation.test.ts +110 -0
  388. package/src/litellm/key-scope.test.ts +135 -0
  389. package/src/litellm/key-secret.test.ts +248 -0
  390. package/src/litellm/key-secret.ts +137 -0
  391. package/src/litellm/key-transport.test.ts +166 -0
  392. package/src/litellm/key.test.ts +231 -0
  393. package/src/litellm/key.ts +213 -0
  394. package/src/litellm/mcp-server-adopt.test.ts +86 -0
  395. package/src/litellm/mcp-server-alias.test.ts +184 -0
  396. package/src/litellm/mcp-server-credential.ts +85 -0
  397. package/src/litellm/mcp-server-errors.ts +141 -0
  398. package/src/litellm/mcp-server-exports.test.ts +15 -0
  399. package/src/litellm/mcp-server-form.test.ts +241 -0
  400. package/src/litellm/mcp-server-form.ts +233 -0
  401. package/src/litellm/mcp-server-handlers.test.ts +150 -0
  402. package/src/litellm/mcp-server-locate.ts +66 -0
  403. package/src/litellm/mcp-server-operations.ts +111 -0
  404. package/src/litellm/mcp-server-registry.test.ts +146 -0
  405. package/src/litellm/mcp-server-retype.test.ts +114 -0
  406. package/src/litellm/mcp-server-shadow.test.ts +91 -0
  407. package/src/litellm/mcp-server-shadow.ts +45 -0
  408. package/src/litellm/mcp-server-tools.test.ts +85 -0
  409. package/src/litellm/mcp-server-types.ts +143 -0
  410. package/src/litellm/mcp-server-url.ts +66 -0
  411. package/src/litellm/mcp-server.test.ts +213 -0
  412. package/src/litellm/mcp-server.ts +225 -0
  413. package/src/litellm/model-claim.ts +69 -0
  414. package/src/litellm/model-credential.ts +45 -0
  415. package/src/litellm/model-errors.ts +168 -0
  416. package/src/litellm/model-foreign-row.test.ts +173 -0
  417. package/src/litellm/model-form.test.ts +228 -0
  418. package/src/litellm/model-form.ts +223 -0
  419. package/src/litellm/model-locate.test.ts +128 -0
  420. package/src/litellm/model-locate.ts +67 -0
  421. package/src/litellm/model-operations.test.ts +93 -0
  422. package/src/litellm/model-operations.ts +146 -0
  423. package/src/litellm/model-params-preserve.test.ts +119 -0
  424. package/src/litellm/model-recovery.test.ts +57 -0
  425. package/src/litellm/model-types.ts +112 -0
  426. package/src/litellm/model.test.ts +222 -0
  427. package/src/litellm/model.ts +237 -0
  428. package/src/litellm/policy-attachment-form.ts +103 -0
  429. package/src/litellm/policy-attachment-operations.ts +74 -0
  430. package/src/litellm/policy-attachment-types.ts +48 -0
  431. package/src/litellm/policy-attachment.test.ts +198 -0
  432. package/src/litellm/policy-attachment.ts +178 -0
  433. package/src/litellm/policy-form.ts +122 -0
  434. package/src/litellm/policy-operations.ts +112 -0
  435. package/src/litellm/policy-types.ts +58 -0
  436. package/src/litellm/policy.test.ts +214 -0
  437. package/src/litellm/policy.ts +146 -0
  438. package/src/litellm/providers.ts +24 -3
  439. package/src/litellm/registry-errors.ts +88 -0
  440. package/src/litellm/registry-exports.test.ts +66 -0
  441. package/src/litellm/registry-support.ts +109 -0
  442. package/src/litellm/team-form.ts +140 -0
  443. package/src/litellm/team-members.test.ts +150 -0
  444. package/src/litellm/team-members.ts +58 -0
  445. package/src/litellm/team-operations.ts +90 -0
  446. package/src/litellm/team-permission.ts +159 -0
  447. package/src/litellm/team-read.test.ts +89 -0
  448. package/src/litellm/team-types.ts +106 -0
  449. package/src/litellm/team.test.ts +206 -0
  450. package/src/litellm/team.ts +159 -0
  451. package/src/litellm/tool-policy-form.ts +94 -0
  452. package/src/litellm/tool-policy-operations.ts +58 -0
  453. package/src/litellm/tool-policy-types.ts +48 -0
  454. package/src/litellm/tool-policy.test.ts +172 -0
  455. package/src/litellm/tool-policy.ts +125 -0
  456. package/src/litellm/toolset-form.ts +104 -0
  457. package/src/litellm/toolset-operations.ts +90 -0
  458. package/src/litellm/toolset-types.ts +47 -0
  459. package/src/litellm/toolset.test.ts +198 -0
  460. package/src/litellm/toolset.ts +151 -0
  461. package/src/ownership/ownership.test.ts +33 -1
  462. package/src/ownership/rows.ts +53 -0
  463. package/src/postgres/connection.ts +42 -7
  464. package/src/postgres/database-bigint-serialization.test.ts +1 -0
  465. package/src/postgres/database-refusals.test.ts +2 -2
  466. package/src/postgres/database-sql.ts +36 -9
  467. package/src/postgres/fake-grants-parse.ts +189 -0
  468. package/src/postgres/fake-grants-read.ts +250 -0
  469. package/src/postgres/fake-grants-sql.ts +207 -0
  470. package/src/postgres/fake-grants-write.ts +90 -0
  471. package/src/postgres/fake-role-sql.ts +240 -0
  472. package/src/postgres/fake-schema-semantics.test.ts +36 -0
  473. package/src/postgres/fake-schema-sql.ts +146 -0
  474. package/src/postgres/fake-sql-parse.ts +86 -0
  475. package/src/postgres/fake-sql-quote.ts +36 -0
  476. package/src/postgres/fake-sql.ts +166 -46
  477. package/src/postgres/fixtures/pg-REL_18_6-acl.h.txt +147 -0
  478. package/src/postgres/fixtures/pg-REL_18_6-aclexplode-func.txt +31 -0
  479. package/src/postgres/fixtures/pg-REL_18_6-alter-default-privileges-synopsis.txt +82 -0
  480. package/src/postgres/fixtures/pg-REL_18_6-alter_role.sgml.txt +44 -0
  481. package/src/postgres/fixtures/pg-REL_18_6-create_role.sgml.txt +26 -0
  482. package/src/postgres/fixtures/pg-REL_18_6-grant-synopsis.txt +95 -0
  483. package/src/postgres/fixtures/pg-REL_18_6-pg_attribute.h.txt +24 -0
  484. package/src/postgres/fixtures/pg-REL_18_6-pg_auth_members.h.txt +62 -0
  485. package/src/postgres/fixtures/pg-REL_18_6-pg_authid.h.txt +70 -0
  486. package/src/postgres/fixtures/pg-REL_18_6-pg_class.h.txt +33 -0
  487. package/src/postgres/fixtures/pg-REL_18_6-pg_default_acl.h.txt +81 -0
  488. package/src/postgres/fixtures/pg-REL_18_6-pg_namespace.h.txt +28 -0
  489. package/src/postgres/fixtures/pg-REL_18_6-revoke-synopsis.txt +124 -0
  490. package/src/postgres/grants-acl.test.ts +61 -0
  491. package/src/postgres/grants-attrs.ts +185 -0
  492. package/src/postgres/grants-database.test.ts +158 -0
  493. package/src/postgres/grants-declare.ts +172 -0
  494. package/src/postgres/grants-delete-proof.test.ts +154 -0
  495. package/src/postgres/grants-diff.ts +101 -0
  496. package/src/postgres/grants-errors.ts +215 -0
  497. package/src/postgres/grants-existence-guards.test.ts +113 -0
  498. package/src/postgres/grants-existence.ts +101 -0
  499. package/src/postgres/grants-lifecycle-guards.test.ts +208 -0
  500. package/src/postgres/grants-lifecycle-repair.test.ts +208 -0
  501. package/src/postgres/grants-lifecycle.test.ts +181 -0
  502. package/src/postgres/grants-ops.ts +229 -0
  503. package/src/postgres/grants-owner-revoke.test.ts +121 -0
  504. package/src/postgres/grants-ownership.ts +49 -0
  505. package/src/postgres/grants-plan-collateral.test.ts +202 -0
  506. package/src/postgres/grants-plan-diff.test.ts +204 -0
  507. package/src/postgres/grants-plan-restore.ts +43 -0
  508. package/src/postgres/grants-plan-revocations.test.ts +69 -0
  509. package/src/postgres/grants-plan.test.ts +148 -0
  510. package/src/postgres/grants-plan.ts +245 -0
  511. package/src/postgres/grants-provenance.test.ts +134 -0
  512. package/src/postgres/grants-psql-lifecycle.test.ts +105 -0
  513. package/src/postgres/grants-read-absent.test.ts +91 -0
  514. package/src/postgres/grants-read-defaults.ts +51 -0
  515. package/src/postgres/grants-read.ts +250 -0
  516. package/src/postgres/grants-refusals.test.ts +136 -0
  517. package/src/postgres/grants-refuse.ts +119 -0
  518. package/src/postgres/grants-relkind-wire.test.ts +111 -0
  519. package/src/postgres/grants-repair-plan.test.ts +201 -0
  520. package/src/postgres/grants-sql.test.ts +128 -0
  521. package/src/postgres/grants-sql.ts +144 -0
  522. package/src/postgres/grants-words.ts +34 -0
  523. package/src/postgres/grants.ts +110 -0
  524. package/src/postgres/index.ts +129 -5
  525. package/src/postgres/installed-classifier.ts +36 -0
  526. package/src/postgres/providers.ts +33 -9
  527. package/src/postgres/psql-executor-escaping.test.ts +67 -0
  528. package/src/postgres/psql-executor.test.ts +63 -2
  529. package/src/postgres/psql-executor.ts +74 -34
  530. package/src/postgres/role-adopt.test.ts +98 -0
  531. package/src/postgres/role-attrs.ts +137 -0
  532. package/src/postgres/role-diff.ts +93 -0
  533. package/src/postgres/role-errors.ts +206 -0
  534. package/src/postgres/role-guard.test.ts +60 -0
  535. package/src/postgres/role-identity.test.ts +197 -0
  536. package/src/postgres/role-lifecycle.test.ts +228 -0
  537. package/src/postgres/role-membership-options.test.ts +73 -0
  538. package/src/postgres/role-membership-repair.test.ts +153 -0
  539. package/src/postgres/role-membership-sql.ts +223 -0
  540. package/src/postgres/role-password-ascii.test.ts +53 -0
  541. package/src/postgres/role-password-transports.test.ts +123 -0
  542. package/src/postgres/role-password.test.ts +158 -0
  543. package/src/postgres/role-privilege.test.ts +107 -0
  544. package/src/postgres/role-provenance.test.ts +200 -0
  545. package/src/postgres/role-provider.ts +105 -0
  546. package/src/postgres/role-refusals.test.ts +225 -0
  547. package/src/postgres/role-scram.test.ts +38 -0
  548. package/src/postgres/role-scram.ts +40 -0
  549. package/src/postgres/role-secrets.ts +61 -0
  550. package/src/postgres/role-sql.ts +213 -0
  551. package/src/postgres/role-valid-until.test.ts +68 -0
  552. package/src/postgres/role.ts +226 -0
  553. package/src/postgres/schema-assert.ts +139 -0
  554. package/src/postgres/schema-attrs.ts +71 -0
  555. package/src/postgres/schema-delete-proofs.test.ts +192 -0
  556. package/src/postgres/schema-delete.ts +96 -0
  557. package/src/postgres/schema-diff.ts +44 -0
  558. package/src/postgres/schema-drop-2bp01.test.ts +146 -0
  559. package/src/postgres/schema-errors.ts +209 -0
  560. package/src/postgres/schema-handlers.test.ts +193 -0
  561. package/src/postgres/schema-identity.ts +39 -0
  562. package/src/postgres/schema-lifecycle.test.ts +246 -0
  563. package/src/postgres/schema-race.test.ts +70 -0
  564. package/src/postgres/schema-reconcile.ts +100 -0
  565. package/src/postgres/schema-refusals.test.ts +144 -0
  566. package/src/postgres/schema-socket.test.ts +162 -0
  567. package/src/postgres/schema-sql.ts +130 -0
  568. package/src/postgres/schema-takeover.test.ts +149 -0
  569. package/src/postgres/schema-test-kit.ts +85 -0
  570. package/src/postgres/schema.ts +130 -0
  571. package/src/release/binary-alias.test.ts +3 -3
  572. package/src/release/binary-claims.test.ts +3 -3
  573. package/src/release/binary-directory-umask.test.ts +65 -0
  574. package/src/release/fake-engine.ts +15 -0
  575. package/src/valkey/acl-attrs.ts +98 -0
  576. package/src/valkey/acl-compare.ts +57 -0
  577. package/src/valkey/acl-connection.ts +13 -0
  578. package/src/valkey/acl-delete.test.ts +127 -0
  579. package/src/valkey/acl-form.ts +239 -0
  580. package/src/valkey/acl-managed.ts +13 -0
  581. package/src/valkey/acl-ops.ts +122 -0
  582. package/src/valkey/acl-ownership.test.ts +118 -0
  583. package/src/valkey/acl-prefix.test.ts +38 -0
  584. package/src/valkey/acl-profiles.ts +81 -0
  585. package/src/valkey/acl-reconcile.ts +180 -0
  586. package/src/valkey/acl-reserved.test.ts +69 -0
  587. package/src/valkey/acl-revocation.test.ts +94 -0
  588. package/src/valkey/acl-seat-prefix.test.ts +111 -0
  589. package/src/valkey/acl-validation.test.ts +54 -0
  590. package/src/valkey/acl.test.ts +215 -0
  591. package/src/valkey/acl.ts +169 -0
  592. package/src/valkey/connection-service.ts +46 -0
  593. package/src/valkey/connection.ts +180 -0
  594. package/src/valkey/errors.ts +239 -0
  595. package/src/valkey/fake-acl.ts +128 -0
  596. package/src/valkey/fake-valkey.ts +224 -0
  597. package/src/valkey/handler-test-fixture.ts +43 -0
  598. package/src/valkey/handlers.test.ts +205 -0
  599. package/src/valkey/index.ts +54 -0
  600. package/src/valkey/instance-attrs.ts +48 -0
  601. package/src/valkey/instance-form.ts +104 -0
  602. package/src/valkey/instance.test.ts +108 -0
  603. package/src/valkey/instance.ts +160 -0
  604. package/src/valkey/provider-socket-fixture.ts +71 -0
  605. package/src/valkey/providers.test.ts +129 -0
  606. package/src/valkey/providers.ts +21 -0
  607. package/src/valkey/resp.ts +212 -0
  608. package/src/valkey/transport-bounds.test.ts +150 -0
  609. package/src/valkey/transport-error.ts +37 -0
  610. package/src/valkey/transport.test.ts +158 -0
  611. package/src/valkey/transport.ts +109 -0
  612. package/src/valkey/upstream-bounds.test.ts +14 -0
@@ -0,0 +1,62 @@
1
+ import * as Effect from 'effect/Effect';
2
+ import type { ValkeyAclUser } from './acl-attrs.ts';
3
+ import { ValkeyAclChannelPatterns, ValkeyAclMonitorKeyPrefix, ValkeyAclNameGlob, ValkeyAclReservedUser, ValkeyAclSeatKeyPrefix, ValkeyAclUserNameMismatch } from './errors.ts';
4
+ import { type Environment } from '../secrets/write-only.ts';
5
+ /** The `#<sha256>` token `ACL SETUSER` accepts in place of `>plaintext`. */
6
+ export declare const passwordToken: (password: string) => Effect.Effect<string>;
7
+ /**
8
+ * The exact `ACL SETUSER` argument list the family issues for one user: reset the blank user,
9
+ * enable it, one password hash, channels reset to the profile's scope, the declared key pattern,
10
+ * then the profile's rules. `password` is the RESOLVED value (already checked present by the
11
+ * caller), never stored, never returned; only its sha256 crosses the wire.
12
+ */
13
+ export declare const buildSetUserArgs: (user: ValkeyAclUser, password: string) => Effect.Effect<ReadonlyArray<string>>;
14
+ /** One `ACL LIST` line, parsed. `rules` holds the `+`/`-` tokens the server echoes (normalised,
15
+ * see the header); `keyPatterns`/`channelPatterns` keep their `~`/`&`; flags are booleans. */
16
+ export interface ParsedAclUser {
17
+ readonly name: string;
18
+ readonly on: boolean;
19
+ readonly nopass: boolean;
20
+ /** Any password token (`#<hash>`, `>pw`, `<pw`) present. */
21
+ readonly hasPassword: boolean;
22
+ readonly keyPatterns: ReadonlyArray<string>;
23
+ readonly channelPatterns: ReadonlyArray<string>;
24
+ readonly rules: ReadonlyArray<string>;
25
+ }
26
+ /** Parse one `ACL LIST` line into `ParsedAclUser`. Throws `ValkeyAclParseError` on a malformed
27
+ * line. */
28
+ export declare const parseAclLine: (line: string) => ParsedAclUser;
29
+ /** Whether a seat-profile user's key prefix escapes its own keyspace. `keyPrefix` goes on the
30
+ * wire as `~<keyPrefix>`, so read-back compares the declaration to itself: `*`, `grok:*` or
31
+ * `claude:grok:*` would converge and grant keys the seat does not own. CT100's template renders
32
+ * exactly `~${user}:*`. A service user is exempt: owning the whole instance is what that
33
+ * profile is for (LiteLLM's cache user, `*`). A monitor user is keyless and may not carry a
34
+ * prefix at all. */
35
+ export declare const seatKeyPrefixEscapes: (user: ValkeyAclUser) => boolean;
36
+ /** Refusals must run before any `ACL SETUSER`. A mismatched record key would split one user into
37
+ * two records; a reserved name would reset the credential this kit authenticates with; a glob in
38
+ * a name would widen the patterns the profile fixes; a seat prefix or monitor key prefix
39
+ * contradicts the profile's fixed shape. */
40
+ export declare const refusalBeforeWrite: (instance: string, users: Readonly<Record<string, ValkeyAclUser>>, self?: string) => ValkeyAclUserNameMismatch | ValkeyAclReservedUser | ValkeyAclSeatKeyPrefix | ValkeyAclMonitorKeyPrefix | ValkeyAclNameGlob | ValkeyAclChannelPatterns | undefined;
41
+ /** How the environment compares to what the family last wrote for one user, by seal.
42
+ * `unknown` — the variable is unset here, so the plan cannot tell (never drift: a plan-only
43
+ * environment must not report every user as rotated). `stale` — no seal yet (an adopted user) or
44
+ * the seal disagrees with the current value. `match` — the seal was made from this value. */
45
+ export type PasswordState = 'unknown' | 'stale' | 'match';
46
+ export declare const passwordState: (sealed: string, value: string | undefined) => PasswordState;
47
+ /** The password value of one user in `env`, or undefined when the reference is missing. */
48
+ export declare const resolvedPassword: (user: ValkeyAclUser, env: Environment) => string | undefined;
49
+ /** The plan reconcile walks: `create` (absent live), `update` (present but not exactly as
50
+ * declared — see `matchesDeclared`), `remove` (previously managed users removed from the
51
+ * declaration, plus all undeclared users under `exclusive: true`) and `undeclared` (all live
52
+ * names outside the current declaration, reported with their deletion/preservation decision). */
53
+ export interface AclUserPlan {
54
+ readonly create: ReadonlyArray<ValkeyAclUser>;
55
+ readonly update: ReadonlyArray<ValkeyAclUser>;
56
+ readonly remove: ReadonlyArray<string>;
57
+ readonly undeclared: ReadonlyArray<string>;
58
+ }
59
+ export declare const planAclUsers: (declared: Readonly<Record<string, ValkeyAclUser>>, live: Readonly<Record<string, ParsedAclUser>>, exclusive?: boolean, managed?: ReadonlyArray<string>) => AclUserPlan;
60
+ /** The exact `ACL DELUSER` argument list. */
61
+ export declare const buildDelUserArgs: (users: ReadonlyArray<string>) => ReadonlyArray<string>;
62
+ //# sourceMappingURL=acl-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acl-form.d.ts","sourceRoot":"","sources":["../../src/valkey/acl-form.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,iBAAiB,EAEjB,qBAAqB,EACrB,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,WAAW,EAAyC,MAAM,0BAA0B,CAAC;AAMnG,4EAA4E;AAC5E,eAAO,MAAM,aAAa,aAAc,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CACjB,CAAC;AAErD;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,SACrB,aAAa,YACT,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAYlC,CAAC;AAEL;8FAC8F;AAC9F,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACvC;AAKD;WACW;AACX,eAAO,MAAM,YAAY,SAAU,MAAM,KAAG,aAsB3C,CAAC;AAEF;;;;;oBAKoB;AACpB,eAAO,MAAM,oBAAoB,SAAU,aAAa,KAAG,OAC2B,CAAC;AAEvF;;;4CAG4C;AAC5C,eAAO,MAAM,kBAAkB,aACnB,MAAM,SACT,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,SACvC,MAAM,KAEX,yBAAyB,GACzB,qBAAqB,GACrB,sBAAsB,GACtB,yBAAyB,GACzB,iBAAiB,GACjB,wBAAwB,GACxB,SAmCH,CAAC;AAEF;;;6FAG6F;AAC7F,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1D,eAAO,MAAM,aAAa,WAAY,MAAM,SAAS,MAAM,GAAG,SAAS,KAAG,aAIzE,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,gBAAgB,SAAU,aAAa,OAAO,WAAW,KAAG,MAAM,GAAG,SAKjF,CAAC;AAEF;;;iGAGiG;AACjG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC5C;AAED,eAAO,MAAM,YAAY,aACb,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,QAC3C,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,iCAEpC,aAAa,CAAC,MAAM,CAAC,KAC7B,WAsBF,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,gBAAgB,UAAW,aAAa,CAAC,MAAM,CAAC,KAAG,aAAa,CAAC,MAAM,CAInF,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Observed users are not ownership: remember the declaration independently of ACL LIST. */
2
+ import type { ValkeyAclFileAttributes, ValkeyAclFileProps } from './acl-attrs.ts';
3
+ export declare const managedUserNames: (stored: ValkeyAclFileAttributes | undefined, previous?: ValkeyAclFileProps) => ReadonlyArray<string>;
4
+ //# sourceMappingURL=acl-managed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acl-managed.d.ts","sourceRoot":"","sources":["../../src/valkey/acl-managed.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,OAAO,KAAK,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAElF,eAAO,MAAM,gBAAgB,WACnB,uBAAuB,GAAG,SAAS,aAChC,kBAAkB,KAC5B,aAAa,CAAC,MAAM,CAMW,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * `Valkey.AclFile` READ operations, engine-independent: reading the live ACL into attributes,
3
+ * and the aclfile probe the write path gates on. Extracted from `acl.ts` (the Resource and its
4
+ * handlers) to keep files under the cap; `acl.test.ts` drives these against `fake-valkey.ts`.
5
+ *
6
+ * ⛔ PASSWORD BY REFERENCE. Each `user.password` is a `{ fromEnv }` reference; state stores a
7
+ * scrypt seal so the next plan can tell whether the value changed without holding the value.
8
+ * See `secrets/write-only.ts` and `acl-attrs.ts`.
9
+ * ★ NO OWNERSHIP MARK (H1). `read` answers `Unowned` for a match (the same rule as
10
+ * `Postgres.Database`), so an adopted instance's ACL needs `adopt(true)`.
11
+ * ★ THE SEALS THREAD THROUGH `output` THE WAY `LiteLLM.MCPServer`'s `credentialSeal` DOES
12
+ * (`mcp-server.ts`): `read` never re-seals — it keeps the seal the store already holds. The
13
+ * write path (`acl-reconcile.ts`) mints a fresh one only for a user it actually wrote.
14
+ */
15
+ import * as Effect from 'effect/Effect';
16
+ import type { ValkeyAclFileAttributes, ValkeyAclUserAttributes } from './acl-attrs.ts';
17
+ import { type ParsedAclUser } from './acl-form.ts';
18
+ import { ValkeyAclParseError } from './errors.ts';
19
+ import { type ValkeyExecutor, type ValkeyTransportError } from './transport.ts';
20
+ /** Parse the live `ACL LIST` into its user lines, keyed by username. `self` is the username the
21
+ * stack's own connection authenticates as (the instance's admin user) — never this family's to
22
+ * manage: removing it would lock the kit out of the instance, and a `service` user cannot carry
23
+ * ACL commands anyway, so it is skipped exactly like `default`. A line that does not parse fails
24
+ * the whole read: a user this family cannot see is a user it cannot converge. */
25
+ export declare const readParsedUsers: (executor: ValkeyExecutor, self?: string) => Effect.Effect<Readonly<Record<string, ParsedAclUser>>, ValkeyAclParseError | ValkeyTransportError>;
26
+ /** One user's live attributes from its parsed line. Passwords are never read (Valkey returns only
27
+ * hashes, and this family stores seals, not values), so the seal starts empty and `read` threads
28
+ * the stored one through `output`. */
29
+ export declare const toUserAttributes: (line: ParsedAclUser) => ValkeyAclUserAttributes;
30
+ /** Read the live ACL users into attributes, against any executor. `self` (the connection's own
31
+ * username) is skipped along with `default` — see `readParsedUsers`. */
32
+ export declare const readWithExecutor: (executor: ValkeyExecutor, instance: string, self?: string) => Effect.Effect<ValkeyAclFileAttributes, ValkeyAclParseError | ValkeyTransportError>;
33
+ /** Probe `CONFIG GET aclfile`: empty means the kit owns ACL state (runtime SETUSER/DELUSER only —
34
+ * never `ACL SAVE`, which errors without a configured aclfile); non-empty means a rendered file
35
+ * is the source of truth and the write path refuses (see `ValkeyAclFileRendered`). */
36
+ export declare const readAclFileConfig: (executor: ValkeyExecutor) => Effect.Effect<string, ValkeyTransportError>;
37
+ //# sourceMappingURL=acl-ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acl-ops.d.ts","sourceRoot":"","sources":["../../src/valkey/acl-ops.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,KAAK,aAAa,EAAgB,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,oBAAoB,EAE1B,MAAM,gBAAgB,CAAC;AAExB;;;;iFAIiF;AACjF,eAAO,MAAM,eAAe,aAChB,cAAc,SACjB,MAAM,KACZ,MAAM,CAAC,MAAM,CACd,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,EACvC,mBAAmB,GAAG,oBAAoB,CAuBxC,CAAC;AAEL;;sCAEsC;AACtC,eAAO,MAAM,gBAAgB,SAAU,aAAa,KAAG,uBAUrD,CAAC;AAgBH;wEACwE;AACxE,eAAO,MAAM,gBAAgB,aACjB,cAAc,YACd,MAAM,SACT,MAAM,KACZ,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,mBAAmB,GAAG,oBAAoB,CACK,CAAC;AAE1F;;sFAEsF;AACtF,eAAO,MAAM,iBAAiB,aAClB,cAAc,KACvB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAiBzC,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * The fixed ACL profiles this family can express, as the exact rule tokens the wire carries.
3
+ *
4
+ * ⛔ THE COMMAND ALLOW-LIST IS A FIXED PROFILE, NOT A PROP (see `acl-attrs.ts`). Every rule set
5
+ * here mirrors `homeflare-ct100/src/valkey-acl.ts` (ct100#117) token for token, measured on the
6
+ * 9.1.1 scratch; a free-form rules prop would let a declaration widen itself and request
7
+ * `FLUSHALL` or `ACL SETUSER`, defeating the isolation the resource exists to enforce.
8
+ *
9
+ * ★ THE `monitor` PROFILE EXISTS BECAUSE CT100 CARRIES A KEY-LESS `monitor` USER FOR
10
+ * `redis_exporter` (ct100#117). Before it existed, `seat` and `service` were the only profiles,
11
+ * so `monitor` was undeclared on every CT100-style instance and reconcile DELETED it —
12
+ * exporter's connection closed (measured 2026-09-30). `MONITOR_COMMANDS` is exactly what
13
+ * `redis_exporter` v1.92.1 issues, measured: `client|setname`, `info`, `command|info`,
14
+ * `commandlog|len` (Valkey 8.1+), `config|get`, `latency|latest`, `latency|histogram`,
15
+ * `slowlog|get`, `slowlog|len`, plus `ping`. No keys (`resetkeys`), no channels
16
+ * (`resetchannels`), no `client|list` (this exporter version never sends it, so it is not
17
+ * granted).
18
+ */
19
+ import type { ValkeyAclProfile, ValkeyAclUser } from './acl-attrs.ts';
20
+ /** The seat command allow-list — fixed, mirrored from `homeflare-ct100/src/valkey-acl.ts`. */
21
+ export declare const SEAT_COMMANDS: string;
22
+ /** What `redis_exporter` v1.92.1 needs and nothing else (ct100#117's `monitor` note). */
23
+ export declare const MONITOR_COMMANDS: string;
24
+ /** The fixed rule sets, as the exact tokens sent after `reset`. */
25
+ export declare const SEAT_RULES: ReadonlyArray<string>;
26
+ export declare const SERVICE_RULES: ReadonlyArray<string>;
27
+ export declare const MONITOR_RULES: ReadonlyArray<string>;
28
+ /** The rule set one profile carries. */
29
+ export declare const profileRules: (profile: ValkeyAclProfile) => ReadonlyArray<string>;
30
+ /**
31
+ * The effective key prefix of one declared user.
32
+ *
33
+ * - `monitor` is key-less (ct100#117's `resetkeys`): it has no prefix, and a declaration that
34
+ * gives it one is refused (`ValkeyAclMonitorKeyPrefix`).
35
+ * - `seat` is pinned to `<name>:*` — the CT100 template's `~${user}:*`; anything else is refused
36
+ * (`ValkeyAclSeatKeyPrefix`). The optional prop defaults to the pin.
37
+ * - `service` owns the instance's declared prefix, `*` by default (LiteLLM's cache user on CT100
38
+ * declares `hf-litellm:*`).
39
+ */
40
+ export declare const effectiveKeyPrefix: (user: ValkeyAclUser) => string;
41
+ /** The key patterns the declaration expects for one user, in the server's own echo form. */
42
+ export declare const declaredKeyPatterns: (user: ValkeyAclUser) => ReadonlyArray<string>;
43
+ /**
44
+ * The channel patterns the declaration expects for one user, in the server's own echo form.
45
+ *
46
+ * ★ CHANNELS COME FROM THE DECLARATION, NEVER `allchannels` (round-3 finding 2). `seat` gets
47
+ * `&<name>:*`, `service` gets `&<keyPrefix>` (ct100#117's litellm line: `&${namespace}:*`),
48
+ * `monitor` gets none. The old unconditional `allchannels` on `service` widened LiteLLM from
49
+ * `&hf-litellm:*` to every channel; the "mirrors the CT100 template" comment next to it was
50
+ * never true. A server normalises `&*` back to `allchannels` internally and echoes `&*`.
51
+ */
52
+ export declare const declaredChannels: (user: ValkeyAclUser) => ReadonlyArray<string>;
53
+ //# sourceMappingURL=acl-profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acl-profiles.d.ts","sourceRoot":"","sources":["../../src/valkey/acl-profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEtE,8FAA8F;AAC9F,eAAO,MAAM,aAAa,QAGN,CAAC;AAMrB,yFAAyF;AACzF,eAAO,MAAM,gBAAgB,QAEmC,CAAC;AAEjE,mEAAmE;AACnE,eAAO,MAAM,UAAU,EAAE,aAAa,CAAC,MAAM,CAAqD,CAAC;AACnG,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,MAAM,CAAgD,CAAC;AACjG,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,MAAM,CAA+B,CAAC;AAEhF,wCAAwC;AACxC,eAAO,MAAM,YAAY,YAAa,gBAAgB,KAAG,aAAa,CAAC,MAAM,CACY,CAAC;AAE1F;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,SAAU,aAAa,KAAG,MAK1B,CAAC;AAEhC,4FAA4F;AAC5F,eAAO,MAAM,mBAAmB,SAAU,aAAa,KAAG,aAAa,CAAC,MAAM,CAG7E,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,SAAU,aAAa,KAAG,aAAa,CAAC,MAAM,CAI1E,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `Valkey.AclFile` reconcile core, against any executor. Extracted from the old single-file
3
+ * `acl.ts` and reworked for the round-3 findings:
4
+ *
5
+ * ★ GATE FIRST (F3). `CONFIG GET aclfile` non-empty → `ValkeyAclFileRendered`, BEFORE any write.
6
+ * The rendered file is the source of truth (CT100: openbao-agent renders it and a runtime
7
+ * write reverts — the measured WRONGPASS seat). `delete` runs the same gate (`acl.ts`).
8
+ * ★ RUNTIME-ONLY WRITES, NO `ACL SAVE` (F3). In kit-owned mode (empty aclfile) `ACL SAVE`
9
+ * measurably errors on 8.1.10 — "This instance is not configured to use an ACL file" — so the
10
+ * kit-owned family never calls it. ACL state is runtime state, not data: it does not survive
11
+ * a restart even with appendonly (measured), so this family re-asserts on every reconcile.
12
+ * ★ NEVER-MANAGED USERS ARE PRESERVED BY DEFAULT (F1). `planAclUsers` only DELUSERs those
13
+ * under `exclusive: true`; removing a previously declared user always revokes it.
14
+ */
15
+ import * as Effect from 'effect/Effect';
16
+ import { type Environment } from '../secrets/write-only.ts';
17
+ import type { ValkeyAclFileAttributes, ValkeyAclFileProps } from './acl-attrs.ts';
18
+ import { type ValkeyError } from './errors.ts';
19
+ import { type ValkeyExecutor, type ValkeyTransportError } from './transport.ts';
20
+ /** The reconcile core: gate on the rendered aclfile, refuse bad declarations, resolve every
21
+ * password ONCE, plan against the live ACL, write, then re-read and verify (S10: never trust
22
+ * the write). `stored` is the state this stack already holds (`output`); it is what adoption
23
+ * lacks, and its absence is what makes the first plan a write. `self` is the connection's own
24
+ * username — never managed, like `default`. */
25
+ export declare const reconcileWithExecutor: (executor: ValkeyExecutor, props: ValkeyAclFileProps, stored: ValkeyAclFileAttributes | undefined, env?: Environment, self?: string, previous?: ValkeyAclFileProps) => Effect.Effect<ValkeyAclFileAttributes, ValkeyError | ValkeyTransportError>;
26
+ //# sourceMappingURL=acl-reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acl-reconcile.d.ts","sourceRoot":"","sources":["../../src/valkey/acl-reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,KAAK,WAAW,EAAkC,MAAM,0BAA0B,CAAC;AAC5F,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAGnB,MAAM,gBAAgB,CAAC;AAWxB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,cAAc,EAAqB,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEnG;;;;+CAI+C;AAC/C,eAAO,MAAM,qBAAqB,aACtB,cAAc,SACjB,kBAAkB,UACjB,uBAAuB,GAAG,SAAS,QACtC,WAAW,SACT,MAAM,aACF,kBAAkB,KAC5B,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,WAAW,GAAG,oBAAoB,CA+HxE,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `Valkey.AclFile` — the per-instance ACL users, each limited to a key prefix and a fixed command
3
+ * profile, with passwords by reference (never in state). The operations live in `acl-ops.ts`
4
+ * (extracted to keep both files under the cap); this file is the Resource and its handlers.
5
+ *
6
+ * ⛔ ONE ACL FILE PER INSTANCE, SEAT USERS ONLY. A shared file would let a seat user exist on the
7
+ * LiteLLM cache (:6380) and `litellm` on the seat store (:6381) — every seat could poison the
8
+ * response cache. The consuming stack declares one `Valkey.AclFile` per instance, holding only
9
+ * that instance's users.
10
+ * ★ NO OWNERSHIP MARK (H1). `read` answers `Unowned` for a match (the same rule as
11
+ * `Postgres.Database`), so an adopted instance's ACL needs `adopt(true)`.
12
+ */
13
+ import { Resource } from 'alchemy';
14
+ import * as Provider from 'alchemy/Provider';
15
+ import type { ValkeyAclFileAttributes, ValkeyAclFileProps } from './acl-attrs.ts';
16
+ import { type ValkeyConnection, withValkey } from './connection.ts';
17
+ export interface ValkeyAclFile extends Resource<'Valkey.AclFile', ValkeyAclFileProps, ValkeyAclFileAttributes> {
18
+ }
19
+ export declare const ValkeyAclFile: import("alchemy").ResourceClass<ValkeyAclFile>;
20
+ export declare const isValkeyAclFile: (value: unknown) => value is ValkeyAclFile;
21
+ export declare const makeValkeyAclFileHandlers: (connect?: typeof withValkey) => Provider.ProviderService<ValkeyAclFile, ValkeyConnection, never, never, ValkeyConnection, ValkeyConnection>;
22
+ export declare const valkeyAclFileHandlers: Provider.ProviderService<ValkeyAclFile, ValkeyConnection, never, never, ValkeyConnection, ValkeyConnection, never, never, never>;
23
+ export declare const ValkeyAclFileProvider: () => import("effect/Layer").Layer<Provider.Provider<ValkeyAclFile>, never, ValkeyConnection>;
24
+ //# sourceMappingURL=acl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acl.d.ts","sourceRoot":"","sources":["../../src/valkey/acl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAEnB,MAAM,gBAAgB,CAAC;AAQxB,OAAO,EAAE,KAAK,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKpE,MAAM,WAAW,aAAc,SAAQ,QAAQ,CAC7C,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,CACxB;CAAG;AAEJ,eAAO,MAAM,aAAa,gDAExB,CAAC;AAEH,eAAO,MAAM,eAAe,UAAW,OAAO,KAAG,KAAK,IAAI,aAGD,CAAC;AAE1D,eAAO,MAAM,yBAAyB,aAC3B,OAAO,UAAU,KACzB,QAAQ,CAAC,eAAe,CACzB,aAAa,EACb,gBAAgB,EAChB,KAAK,EACL,KAAK,EACL,gBAAgB,EAChB,gBAAgB,CA2Gd,CAAC;AAEL,eAAO,MAAM,qBAAqB,kIAA8B,CAAC;AAEjE,eAAO,MAAM,qBAAqB,+FAA+D,CAAC"}
@@ -0,0 +1,22 @@
1
+ /** Named connections keep each resource on its own server when provider layers are combined. */
2
+ import * as Context from 'effect/Context';
3
+ import * as Effect from 'effect/Effect';
4
+ import * as Layer from 'effect/Layer';
5
+ import type { ValkeyConnectionConfig } from './connection.ts';
6
+ declare const ValkeyConnectionMissing_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
7
+ readonly _tag: "ValkeyConnectionMissing";
8
+ } & Readonly<A>;
9
+ export declare class ValkeyConnectionMissing extends ValkeyConnectionMissing_base<{
10
+ readonly instance: string;
11
+ }> {
12
+ get message(): string;
13
+ }
14
+ declare const ValkeyConnection_base: Context.ServiceClass<ValkeyConnection, "Valkey.Connection", Effect.Effect<ValkeyConnectionConfig, never, never>>;
15
+ /** The unnamed service is only for direct transport calls; resources always select a name. */
16
+ export declare class ValkeyConnection extends ValkeyConnection_base {
17
+ }
18
+ /** Use `Layer.provideMerge` on providers: their handlers resolve this service later. */
19
+ export declare const valkeyConnection: (config: ValkeyConnectionConfig) => Layer.Layer<ValkeyConnection>;
20
+ export declare const resolveValkeyConnection: (instance?: string) => Effect.Effect<ValkeyConnectionConfig, ValkeyConnectionMissing, ValkeyConnection>;
21
+ export {};
22
+ //# sourceMappingURL=connection-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-service.d.ts","sourceRoot":"","sources":["../../src/valkey/connection-service.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAE1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;;;;AAE9D,qBAAa,uBAAwB,SAAQ,6BAA4C;IACvF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;;AAED,8FAA8F;AAC9F,qBAAa,gBAAiB,SAAQ,qBAGd;CAAG;AAW3B,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,WAAY,sBAAsB,KAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CACnB,CAAC;AAE5E,eAAO,MAAM,uBAAuB,cACvB,MAAM,KAChB,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,uBAAuB,EAAE,gBAAgB,CAQ9E,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Where a Valkey instance's socket comes from, and how each lifecycle operation gets an executor.
3
+ *
4
+ * ⛔ NO ESTATE VALUE LIVES HERE. The kit is PUBLIC; CT100's host, the two ports (6380/6381) and the
5
+ * ACL user a seat authenticates as are the CONSUMING stack's values, passed to
6
+ * `valkeyConnection(...)` in a house stack — never a default, never a fallback. The mini's own
7
+ * Valkey, or any later host, is a different `valkeyConnection` call, not a constant.
8
+ * ★ A LAZY `Context.Service` WHOSE VALUE IS AN `Effect` (S24) — the same shape `PostgresConnection`
9
+ * uses. `host` and `port` carry no secret; the ACL user's PASSWORD is not a prop here (S25): the
10
+ * `Valkey.AclFile` resource seals passwords by reference, and the connection itself authenticates
11
+ * with `AUTH` only when a stack supplies a password through `valkeyConnection`'s `password`
12
+ * reference — resolved at call time, never stored.
13
+ * ★ ONE SOCKET PER OPERATION, OPENED AND CLOSED IN A SCOPE. `withValkey` opens a `node:net` socket
14
+ * for the operation, runs it, and closes the socket when it finishes — one connection per
15
+ * `reconcile`, never held across a whole plan.
16
+ */
17
+ import * as Effect from 'effect/Effect';
18
+ import { type ValkeyConnection, type ValkeyConnectionMissing } from './connection-service.ts';
19
+ export { ValkeyConnection, ValkeyConnectionMissing, valkeyConnection, } from './connection-service.ts';
20
+ import { type Environment, type FromEnv } from '../secrets/write-only.ts';
21
+ import { ValkeyAuthPasswordMissing } from './errors.ts';
22
+ import { type ValkeyExecutor, type ValkeyTransportError } from './transport.ts';
23
+ /** What a stack passes to reach one instance. `host`/`port` are the TCP endpoint; the ACL
24
+ * `username` and optional `password` (a `FromEnv` reference, never a value) are the credentials a
25
+ * stack authenticates with. Omitting both sends no `AUTH` — a bare `default` connection, which is
26
+ * correct only for a scratch instance a test owns.
27
+ *
28
+ * ⛔ A USERNAME REQUIRES A PASSWORD. The discriminated union makes `username` without `password`
29
+ * unrepresentable: on an instance whose `default` user is off (CT100's ACL files ship `user
30
+ * default off`), a username-only connection cannot authenticate at all, and silently skipping
31
+ * `AUTH` would surface much later as a confusing `NOAUTH` from the first command. The bare
32
+ * branch carries `username?: undefined` — a type marker, not a prop — so `config.username`
33
+ * reads on the whole union without narrowing first.
34
+ *
35
+ * `timeoutMs` bounds connect, each read, and the socket idle timer (default 10s). A blackholed
36
+ * host must stall a plan no longer than that deadline. */
37
+ export type ValkeyConnectionConfig = {
38
+ /** Resource routing key: required by valkeyProviders; omit only for direct transport calls. */
39
+ readonly instance?: string;
40
+ readonly host: string;
41
+ readonly port: number;
42
+ /** Per-connect/per-read deadline in ms. */
43
+ readonly timeoutMs?: number;
44
+ } & ({
45
+ readonly username?: undefined;
46
+ } | {
47
+ readonly username?: string;
48
+ readonly password: FromEnv;
49
+ });
50
+ /** `AUTH` when the config carries a password, resolved at call time; a missing or empty variable
51
+ * is the typed `ValkeyAuthPasswordMissing` (S21: a fact this family checked, not a sniffed server
52
+ * reply). A password without a username authenticates as `default`. */
53
+ export declare const auth: (executor: ValkeyExecutor, config: ValkeyConnectionConfig, env: Environment) => Effect.Effect<void, ValkeyTransportError | ValkeyAuthPasswordMissing>;
54
+ /**
55
+ * Run one operation against a freshly opened, freshly closed socket. Every `read` and `reconcile`
56
+ * in this family calls this once for the whole operation, never once per command.
57
+ */
58
+ export declare const withValkey: <A, E>(build: (executor: ValkeyExecutor, config: ValkeyConnectionConfig) => Effect.Effect<A, E | ValkeyTransportError>, instance?: string) => Effect.Effect<A, E | ValkeyTransportError | ValkeyAuthPasswordMissing | ValkeyConnectionMissing, ValkeyConnection>;
59
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/valkey/connection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAE7B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,OAAO,EAAc,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAEL,KAAK,cAAc,EAGnB,KAAK,oBAAoB,EAE1B,MAAM,gBAAgB,CAAC;AAExB;;;;;;;;;;;;;0DAa0D;AAC1D,MAAM,MAAM,sBAAsB,GAAG;IACnC,+FAA+F;IAC/F,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,CACA;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,GACjC;IACE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,CACJ,CAAC;AAiDF;;uEAEuE;AACvE,eAAO,MAAM,IAAI,aACL,cAAc,UAChB,sBAAsB,OACzB,WAAW,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,yBAAyB,CAiBtE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,CAAC,SACtB,CACL,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,sBAAsB,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,oBAAoB,CAAC,aACpC,MAAM,KAChB,MAAM,CAAC,MAAM,CACd,CAAC,EACD,CAAC,GAAG,oBAAoB,GAAG,yBAAyB,GAAG,uBAAuB,EAC9E,gBAAgB,CAyBd,CAAC"}
@@ -0,0 +1,165 @@
1
+ declare const ValkeyInstanceDrift_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
2
+ readonly _tag: "ValkeyInstanceDrift";
3
+ } & Readonly<A>;
4
+ /** The live instance does not match an asserted property. Like `Postgres.DatabaseDrift`, this
5
+ * family asserts properties at create and refuses drift rather than silently issuing a
6
+ * reconfiguration that could drop state. */
7
+ export declare class ValkeyInstanceDrift extends ValkeyInstanceDrift_base<{
8
+ readonly instance: string;
9
+ readonly prop: string;
10
+ readonly declared: unknown;
11
+ readonly live: unknown;
12
+ }> {
13
+ get message(): string;
14
+ }
15
+ declare const ValkeyInstanceUnreachable_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
16
+ readonly _tag: "ValkeyInstanceUnreachable";
17
+ } & Readonly<A>;
18
+ /** `Valkey.Instance` found the instance unreachable or refused authentication when reading it.
19
+ * `host` is optional because it is the connection layer's value (`connection.ts`), never a prop
20
+ * this resource holds — a reconcile that only knows its own declaration names the port. */
21
+ export declare class ValkeyInstanceUnreachable extends ValkeyInstanceUnreachable_base<{
22
+ readonly instance: string;
23
+ readonly host?: string;
24
+ readonly port: number;
25
+ }> {
26
+ get message(): string;
27
+ }
28
+ declare const ValkeyAclParseError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
29
+ readonly _tag: "ValkeyAclParseError";
30
+ } & Readonly<A>;
31
+ /** An ACL LIST line could not be parsed. Neither the message nor error data retain the
32
+ * raw line: error serialization must not expose its password hash. */
33
+ export declare class ValkeyAclParseError extends ValkeyAclParseError_base<{}> {
34
+ get message(): string;
35
+ }
36
+ declare const ValkeyAclPasswordMissing_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
37
+ readonly _tag: "ValkeyAclPasswordMissing";
38
+ } & Readonly<A>;
39
+ /** A declared ACL user is missing a referenced password; a user with no password can authenticate
40
+ * as nobody, which would bypass isolation. */
41
+ export declare class ValkeyAclPasswordMissing extends ValkeyAclPasswordMissing_base<{
42
+ readonly instance: string;
43
+ readonly user: string;
44
+ readonly variable: string;
45
+ }> {
46
+ get message(): string;
47
+ }
48
+ declare const ValkeyAuthPasswordMissing_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
49
+ readonly _tag: "ValkeyAuthPasswordMissing";
50
+ } & Readonly<A>;
51
+ /** The stack's own connection password is a `{ fromEnv }` reference that resolved to nothing at
52
+ * call time. Distinct from `ValkeyInstanceUnreachable` (nothing answered on the wire) and from
53
+ * `ValkeyAclPasswordMissing` (a DECLARED ACL user's password): this one is the credential the
54
+ * stack itself authenticates with to reach an instance. */
55
+ export declare class ValkeyAuthPasswordMissing extends ValkeyAuthPasswordMissing_base<{
56
+ readonly username: string | undefined;
57
+ readonly variable: string;
58
+ }> {
59
+ get message(): string;
60
+ }
61
+ declare const ValkeyAclReadbackFailed_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
62
+ readonly _tag: "ValkeyAclReadbackFailed";
63
+ } & Readonly<A>;
64
+ /** The live ACL after a reconcile does not match the declaration on read-back — the write was lost
65
+ * or a concurrent mutator changed it before we could verify. */
66
+ export declare class ValkeyAclReadbackFailed extends ValkeyAclReadbackFailed_base<{
67
+ readonly instance: string;
68
+ readonly user: string;
69
+ }> {
70
+ get message(): string;
71
+ }
72
+ declare const ValkeyAclSeatKeyPrefix_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
73
+ readonly _tag: "ValkeyAclSeatKeyPrefix";
74
+ } & Readonly<A>;
75
+ /** A `seat`-profile user's key prefix escapes its own keyspace. The seat profile exists to pin
76
+ * each seat to keys beginning with its own name (`~<name>:…`); `keyPrefix` goes on the wire as
77
+ * `~<keyPrefix>`, so `*` is every key and `grok:*` is another seat's. Refused before any write —
78
+ * a `service` user is the profile that owns a whole instance. */
79
+ export declare class ValkeyAclSeatKeyPrefix extends ValkeyAclSeatKeyPrefix_base<{
80
+ readonly instance: string;
81
+ readonly user: string;
82
+ readonly keyPrefix: string;
83
+ }> {
84
+ get message(): string;
85
+ }
86
+ declare const ValkeyAclReservedUser_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
87
+ readonly _tag: "ValkeyAclReservedUser";
88
+ } & Readonly<A>;
89
+ /** A declaration names `default` or the connection username. `ACL SETUSER` `reset` would replace
90
+ * the credential this kit authenticates with (`~* +@all`) with a profile that cannot run `ACL`,
91
+ * and the next `ACL LIST` answers `NOPERM`. Refused before any write. */
92
+ export declare class ValkeyAclReservedUser extends ValkeyAclReservedUser_base<{
93
+ readonly instance: string;
94
+ readonly user: string;
95
+ }> {
96
+ get message(): string;
97
+ }
98
+ declare const ValkeyAclUserNameMismatch_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
99
+ readonly _tag: "ValkeyAclUserNameMismatch";
100
+ } & Readonly<A>;
101
+ /** A live or stored ACL user is keyed under one name but its line carries another — the parsed
102
+ * `user` name disagrees with the record key this family stores it under. The record key is this
103
+ * family's identity, so the mismatch means the ACL was changed by something else. */
104
+ export declare class ValkeyAclUserNameMismatch extends ValkeyAclUserNameMismatch_base<{
105
+ readonly instance: string;
106
+ readonly recordKey: string;
107
+ readonly user: string;
108
+ }> {
109
+ get message(): string;
110
+ }
111
+ export type ValkeyError = ValkeyInstanceDrift | ValkeyInstanceUnreachable | ValkeyAclParseError | ValkeyAclPasswordMissing | ValkeyAclReadbackFailed | ValkeyAclUserNameMismatch | ValkeyAclReservedUser | ValkeyAclSeatKeyPrefix | ValkeyAclMonitorKeyPrefix | ValkeyAclNameGlob | ValkeyAclChannelPatterns | ValkeyAclFileRendered | ValkeyAuthPasswordMissing;
112
+ declare const ValkeyAclMonitorKeyPrefix_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
113
+ readonly _tag: "ValkeyAclMonitorKeyPrefix";
114
+ } & Readonly<A>;
115
+ /** A `monitor`-profile user was declared with a key prefix. The monitor profile exists for the
116
+ * key-less `redis_exporter` identity (ct100#117): its rules carry `resetkeys`, and a `~` pattern
117
+ * next to them would contradict the key-less shape the profile is fixed to. Refused before any
118
+ * write. */
119
+ export declare class ValkeyAclMonitorKeyPrefix extends ValkeyAclMonitorKeyPrefix_base<{
120
+ readonly instance: string;
121
+ readonly user: string;
122
+ readonly keyPrefix: string;
123
+ }> {
124
+ get message(): string;
125
+ }
126
+ declare const ValkeyAclNameGlob_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
127
+ readonly _tag: "ValkeyAclNameGlob";
128
+ } & Readonly<A>;
129
+ /** A username carries glob characters (`*`, `?`, `[`, `]`). Names are interpolated into key and
130
+ * channel patterns (`~<name>:*`, `&<name>:*`), so a glob in the name would widen the patterns
131
+ * the profile is fixed to — `seat*` would reach `seat2:*`. Refused before any write. */
132
+ export declare class ValkeyAclNameGlob extends ValkeyAclNameGlob_base<{
133
+ readonly instance: string;
134
+ readonly user: string;
135
+ readonly chars: string;
136
+ }> {
137
+ get message(): string;
138
+ }
139
+ declare const ValkeyAclFileRendered_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
140
+ readonly _tag: "ValkeyAclFileRendered";
141
+ } & Readonly<A>;
142
+ /** The instance renders its ACL from a file (`--aclfile`, answered by `CONFIG GET aclfile`), so
143
+ * the FILE is the source of truth and this family cannot manage it: the kit speaks RESP only, it
144
+ * can neither write the file nor outlast the renderer that owns it (CT100: openbao-agent renders
145
+ * `/etc/valkey/*-acl.conf` and mounts it read-only — a runtime `ACL SETUSER` there is reverted by
146
+ * the next render/restart, measured 2026-09-30 as a WRONGPASS seat). Declare those users in the
147
+ * rendering template instead, or use kit-owned runtime ACL management without a configured ACL file. */
148
+ export declare class ValkeyAclFileRendered extends ValkeyAclFileRendered_base<{
149
+ readonly instance: string;
150
+ readonly path: string;
151
+ }> {
152
+ get message(): string;
153
+ }
154
+ declare const ValkeyAclChannelPatterns_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
155
+ readonly _tag: "ValkeyAclChannelPatterns";
156
+ } & Readonly<A>;
157
+ /** A fixed profile cannot widen its channel boundary by declaration. */
158
+ export declare class ValkeyAclChannelPatterns extends ValkeyAclChannelPatterns_base<{
159
+ readonly instance: string;
160
+ readonly user: string;
161
+ }> {
162
+ get message(): string;
163
+ }
164
+ export {};
165
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/valkey/errors.ts"],"names":[],"mappings":";;;AAUA;;4CAE4C;AAC5C,qBAAa,mBAAoB,SAAQ,yBAAwC;IAC/E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;;;;AAED;;2FAE2F;AAC3F,qBAAa,yBAA0B,SAAQ,+BAA8C;IAC3F,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;;;;AAED;sEACsE;AACtE,qBAAa,mBAAoB,SAAQ,yBAAwC,EAEhF,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAK7B;CACF;;;;AAED;8CAC8C;AAC9C,qBAAa,wBAAyB,SAAQ,8BAA6C;IACzF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAK7B;CACF;;;;AAED;;;2DAG2D;AAC3D,qBAAa,yBAA0B,SAAQ,+BAA8C;IAC3F,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;;;;AAED;gEACgE;AAChE,qBAAa,uBAAwB,SAAQ,6BAA4C;IACvF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAK7B;CACF;;;;AAED;;;iEAGiE;AACjE,qBAAa,sBAAuB,SAAQ,4BAA2C;IACrF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;;;;AAED;;yEAEyE;AACzE,qBAAa,qBAAsB,SAAQ,2BAA0C;IACnF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;;;;AAED;;qFAEqF;AACrF,qBAAa,yBAA0B,SAAQ,+BAA8C;IAC3F,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;AAED,MAAM,MAAM,WAAW,GACnB,mBAAmB,GACnB,yBAAyB,GACzB,mBAAmB,GACnB,wBAAwB,GACxB,uBAAuB,GACvB,yBAAyB,GACzB,qBAAqB,GACrB,sBAAsB,GACtB,yBAAyB,GACzB,iBAAiB,GACjB,wBAAwB,GACxB,qBAAqB,GACrB,yBAAyB,CAAC;;;;AAE9B;;;YAGY;AACZ,qBAAa,yBAA0B,SAAQ,+BAA8C;IAC3F,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;;;;AAED;;wFAEwF;AACxF,qBAAa,iBAAkB,SAAQ,uBAAsC;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAM7B;CACF;;;;AAED;;;;;wGAKwG;AACxG,qBAAa,qBAAsB,SAAQ,2BAA0C;IACnF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAS7B;CACF;;;;AAED,wEAAwE;AACxE,qBAAa,wBAAyB,SAAQ,8BAA6C;IACzF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAK7B;CACF"}
@@ -0,0 +1,29 @@
1
+ /** One user's ACL state — the fake's parsed mirror of what a real server keeps per user. */
2
+ export interface FakeAclUser {
3
+ on: boolean;
4
+ nopass: boolean;
5
+ /** The stored `#<sha256>` tokens, empty when the user has no passwords. */
6
+ passwords: ReadonlyArray<string>;
7
+ /** Key patterns with their `~`, e.g. `['~claude:*']`. */
8
+ keys: ReadonlyArray<string>;
9
+ /** Channel patterns with their `&`; `['&*']` is what `allchannels` echoes as. */
10
+ channels: ReadonlyArray<string>;
11
+ /** The `+`/`-` rule tokens, with the `-@all` baseline the echo keeps. */
12
+ rules: ReadonlyArray<string>;
13
+ }
14
+ export declare const sha256: (value: string) => string;
15
+ /** A user straight out of `reset`: off, no password, no patterns, the `-@all` baseline. */
16
+ export declare const freshUser: () => FakeAclUser;
17
+ /** Apply one `ACL SETUSER` rule token, in order — the fake's model of the server's own
18
+ * incremental semantics (`reset` resets, `+@all` cancels the `-@all` baseline, and so on). */
19
+ export declare const applyToken: (user: FakeAclUser, token: string) => void;
20
+ /** The `ACL LIST` echo for one user — the MEASURED shape: flags, password hash, key patterns,
21
+ * the bare `resetchannels` marker before the channel patterns, then the rule tokens. */
22
+ export declare const renderUser: (name: string, user: FakeAclUser) => string;
23
+ /** Tokenize a seeded `ACL LIST` line the way the fake would have stored the SETUSER that made
24
+ * it, so a seed and a write land in the same shape. */
25
+ export declare const seedUser: (line: string) => FakeAclUser;
26
+ /** Does `channel` match one of the session user's `&` patterns? Glob, the way the server's
27
+ * `&pat:*` works for PUBLISH. */
28
+ export declare const channelAllowed: (user: FakeAclUser, channel: string) => boolean;
29
+ //# sourceMappingURL=fake-acl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-acl.d.ts","sourceRoot":"","sources":["../../src/valkey/fake-acl.ts"],"names":[],"mappings":"AAGA,4FAA4F;AAC5F,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACjC,yDAAyD;IACzD,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,iFAAiF;IACjF,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAChC,yEAAyE;IACzE,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,eAAO,MAAM,MAAM,UAAW,MAAM,KAAG,MAA0D,CAAC;AAElG,2FAA2F;AAC3F,eAAO,MAAM,SAAS,QAAO,WAO3B,CAAC;AAEH;8FAC8F;AAC9F,eAAO,MAAM,UAAU,SAAU,WAAW,SAAS,MAAM,KAAG,IA0D7D,CAAC;AAEF;wFACwF;AACxF,eAAO,MAAM,UAAU,SAAU,MAAM,QAAQ,WAAW,KAAG,MAa/C,CAAC;AAEf;uDACuD;AACvD,eAAO,MAAM,QAAQ,SAAU,MAAM,KAAG,WAMvC,CAAC;AAEF;iCACiC;AACjC,eAAO,MAAM,cAAc,SAAU,WAAW,WAAW,MAAM,KAAG,OAOhE,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { ValkeyExecutor } from './transport.ts';
2
+ export interface RecordedCommand {
3
+ readonly args: ReadonlyArray<string>;
4
+ }
5
+ export interface FakeValkey extends ValkeyExecutor {
6
+ readonly commands: ReadonlyArray<RecordedCommand>;
7
+ /** Mutable on purpose: a test seeds a value a "competing" write would have produced before
8
+ * the fake ever sees it. The `aclfile` entry is what `CONFIG GET aclfile` answers. */
9
+ readonly config: Map<string, string>;
10
+ /** The live ACL as `ACL LIST` echoes it, keyed by username — the fake's own report, not the
11
+ * command list (S28). */
12
+ readonly acl: Map<string, string>;
13
+ /** Which usernames the fake accepts an `AUTH` for, and at which plaintext (test fixtures). */
14
+ readonly passwords: Map<string, string>;
15
+ }
16
+ export interface FakeValkeyOptions {
17
+ readonly config?: Readonly<Record<string, string>>;
18
+ /** Seed users as `ACL LIST` lines, parsed with the same tokenizer as SETUSER. */
19
+ readonly acl?: Readonly<Record<string, string>>;
20
+ readonly passwords?: Readonly<Record<string, string>>;
21
+ /** Fail the NEXT write (`ACL SETUSER`/`ACL DELUSER`) once, the way a concurrent mutator would. */
22
+ readonly raceNextWrite?: boolean;
23
+ /** Re-add this user after EVERY successful ACL write — a concurrent mutator that survives the
24
+ * reconcile's writes, so the read-back (never the write reply) is what catches it. */
25
+ readonly reAddAfterWrite?: {
26
+ readonly name: string;
27
+ readonly line: string;
28
+ };
29
+ /** The version `INFO` reports as `valkey_version` (with a `redis_version` fallback line). */
30
+ readonly version?: string;
31
+ /** `INFO` `tcp_port`. Defaults to 0, the reply a server that omitted the line would give. */
32
+ readonly port?: number;
33
+ }
34
+ export declare const makeFakeValkey: (options?: FakeValkeyOptions) => FakeValkey;
35
+ //# sourceMappingURL=fake-valkey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-valkey.d.ts","sourceRoot":"","sources":["../../src/valkey/fake-valkey.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,cAAc,EAAkC,MAAM,gBAAgB,CAAC;AAErF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAClD;0FACsF;IACtF,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC;6BACyB;IACzB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,8FAA8F;IAC9F,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,iFAAiF;IACjF,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,kGAAkG;IAClG,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;0FACsF;IACtF,QAAQ,CAAC,eAAe,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5E,6FAA6F;IAC7F,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,6FAA6F;IAC7F,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,cAAc,aAAa,iBAAiB,KAAQ,UAgKhE,CAAC"}
@@ -0,0 +1,20 @@
1
+ /** Test-only connection injection: no listener, module mock or live endpoint. */
2
+ import * as Effect from 'effect/Effect';
3
+ import { type ValkeyConnection, type ValkeyConnectionConfig, type withValkey } from './connection.ts';
4
+ import type { Environment } from '../secrets/write-only.ts';
5
+ import type { ValkeyExecutor } from './transport.ts';
6
+ export declare const config: ValkeyConnectionConfig;
7
+ export declare const env: Environment;
8
+ export declare const connection: (executor: ValkeyExecutor, credentials?: Environment) => typeof withValkey;
9
+ export declare const run: <A, E>(effect: Effect.Effect<A, E, ValkeyConnection>) => Promise<A>;
10
+ export declare const context: {
11
+ id: string;
12
+ fqn: string;
13
+ instanceId: string;
14
+ session: never;
15
+ bindings: never[];
16
+ oldBindings: never[];
17
+ newBindings: never[];
18
+ };
19
+ export declare const required: <T>(value: T | undefined) => T;
20
+ //# sourceMappingURL=handler-test-fixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler-test-fixture.d.ts","sourceRoot":"","sources":["../../src/valkey/handler-test-fixture.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAE3B,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,eAAO,MAAM,MAAM,EAAE,sBAMpB,CAAC;AACF,eAAO,MAAM,GAAG,EAAE,WAAoD,CAAC;AACvE,eAAO,MAAM,UAAU,aACV,cAAc,gBAAe,WAAW,KAAS,OAAO,UAK/D,CAAC;AACP,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,KAAG,OAAO,CAAC,CAAC,CACT,CAAC;AAC3E,eAAO,MAAM,OAAO;IAClB,EAAE;IACF,GAAG;IACH,UAAU;IACV,OAAO,EAAe,KAAK;IAC3B,QAAQ;IACR,WAAW;IACX,WAAW;CACZ,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,CAAC,GAAG,SAAS,KAAG,CAGlD,CAAC"}