lorenz 0.1.5 → 0.1.6

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 (247) hide show
  1. package/README.md +83 -20
  2. package/RELEASE-MANIFEST.json +6 -1
  3. package/node_modules/@lorenz/agent-sdk/dist/index.d.ts +1 -0
  4. package/node_modules/@lorenz/agent-sdk/dist/index.d.ts.map +1 -1
  5. package/node_modules/@lorenz/agent-sdk/dist/index.js +1 -0
  6. package/node_modules/@lorenz/agent-sdk/dist/index.js.map +1 -1
  7. package/node_modules/@lorenz/agent-sdk/dist/module.d.ts +38 -0
  8. package/node_modules/@lorenz/agent-sdk/dist/module.d.ts.map +1 -0
  9. package/node_modules/@lorenz/agent-sdk/dist/module.js +41 -0
  10. package/node_modules/@lorenz/agent-sdk/dist/module.js.map +1 -0
  11. package/node_modules/@lorenz/cli/dist/agentExecutorLoader.d.ts +30 -0
  12. package/node_modules/@lorenz/cli/dist/agentExecutorLoader.d.ts.map +1 -0
  13. package/node_modules/@lorenz/cli/dist/agentExecutorLoader.js +63 -0
  14. package/node_modules/@lorenz/cli/dist/agentExecutorLoader.js.map +1 -0
  15. package/node_modules/@lorenz/cli/dist/daemon.d.ts +42 -19
  16. package/node_modules/@lorenz/cli/dist/daemon.d.ts.map +1 -1
  17. package/node_modules/@lorenz/cli/dist/daemon.js +72 -23
  18. package/node_modules/@lorenz/cli/dist/daemon.js.map +1 -1
  19. package/node_modules/@lorenz/cli/dist/daemonLock.d.ts +59 -0
  20. package/node_modules/@lorenz/cli/dist/daemonLock.d.ts.map +1 -0
  21. package/node_modules/@lorenz/cli/dist/daemonLock.js +304 -0
  22. package/node_modules/@lorenz/cli/dist/daemonLock.js.map +1 -0
  23. package/node_modules/@lorenz/cli/dist/daemonStatus.d.ts +16 -0
  24. package/node_modules/@lorenz/cli/dist/daemonStatus.d.ts.map +1 -0
  25. package/node_modules/@lorenz/cli/dist/daemonStatus.js +21 -0
  26. package/node_modules/@lorenz/cli/dist/daemonStatus.js.map +1 -0
  27. package/node_modules/@lorenz/cli/dist/doctor.d.ts +6 -0
  28. package/node_modules/@lorenz/cli/dist/doctor.d.ts.map +1 -1
  29. package/node_modules/@lorenz/cli/dist/doctor.js +38 -1
  30. package/node_modules/@lorenz/cli/dist/doctor.js.map +1 -1
  31. package/node_modules/@lorenz/cli/dist/extensionLoader.d.ts +126 -0
  32. package/node_modules/@lorenz/cli/dist/extensionLoader.d.ts.map +1 -0
  33. package/node_modules/@lorenz/cli/dist/extensionLoader.js +187 -0
  34. package/node_modules/@lorenz/cli/dist/extensionLoader.js.map +1 -0
  35. package/node_modules/@lorenz/cli/dist/flags-manifest.d.ts +42 -0
  36. package/node_modules/@lorenz/cli/dist/flags-manifest.d.ts.map +1 -0
  37. package/node_modules/@lorenz/cli/dist/flags-manifest.js +67 -0
  38. package/node_modules/@lorenz/cli/dist/flags-manifest.js.map +1 -0
  39. package/node_modules/@lorenz/cli/dist/index.d.ts +6 -0
  40. package/node_modules/@lorenz/cli/dist/index.d.ts.map +1 -1
  41. package/node_modules/@lorenz/cli/dist/index.js +4 -0
  42. package/node_modules/@lorenz/cli/dist/index.js.map +1 -1
  43. package/node_modules/@lorenz/cli/dist/leadershipStore.d.ts +42 -0
  44. package/node_modules/@lorenz/cli/dist/leadershipStore.d.ts.map +1 -0
  45. package/node_modules/@lorenz/cli/dist/leadershipStore.js +2 -0
  46. package/node_modules/@lorenz/cli/dist/leadershipStore.js.map +1 -0
  47. package/node_modules/@lorenz/cli/dist/main.d.ts +11 -7
  48. package/node_modules/@lorenz/cli/dist/main.d.ts.map +1 -1
  49. package/node_modules/@lorenz/cli/dist/main.js +58 -8
  50. package/node_modules/@lorenz/cli/dist/main.js.map +1 -1
  51. package/node_modules/@lorenz/cli/dist/toolLoader.d.ts +28 -0
  52. package/node_modules/@lorenz/cli/dist/toolLoader.d.ts.map +1 -0
  53. package/node_modules/@lorenz/cli/dist/toolLoader.js +62 -0
  54. package/node_modules/@lorenz/cli/dist/toolLoader.js.map +1 -0
  55. package/node_modules/@lorenz/cli/dist/trackerLoader.d.ts +24 -0
  56. package/node_modules/@lorenz/cli/dist/trackerLoader.d.ts.map +1 -0
  57. package/node_modules/@lorenz/cli/dist/trackerLoader.js +34 -0
  58. package/node_modules/@lorenz/cli/dist/trackerLoader.js.map +1 -0
  59. package/node_modules/@lorenz/cli/dist/workerDriverLoader.d.ts +15 -55
  60. package/node_modules/@lorenz/cli/dist/workerDriverLoader.d.ts.map +1 -1
  61. package/node_modules/@lorenz/cli/dist/workerDriverLoader.js +26 -203
  62. package/node_modules/@lorenz/cli/dist/workerDriverLoader.js.map +1 -1
  63. package/node_modules/@lorenz/cli/package.json +1 -0
  64. package/node_modules/@lorenz/config/dist/index.d.ts +1 -1
  65. package/node_modules/@lorenz/config/dist/index.d.ts.map +1 -1
  66. package/node_modules/@lorenz/config/dist/index.js +1 -1
  67. package/node_modules/@lorenz/config/dist/index.js.map +1 -1
  68. package/node_modules/@lorenz/config/dist/parse.d.ts +17 -0
  69. package/node_modules/@lorenz/config/dist/parse.d.ts.map +1 -1
  70. package/node_modules/@lorenz/config/dist/parse.js +107 -11
  71. package/node_modules/@lorenz/config/dist/parse.js.map +1 -1
  72. package/node_modules/@lorenz/config/dist/schemas.d.ts +0 -2
  73. package/node_modules/@lorenz/config/dist/schemas.d.ts.map +1 -1
  74. package/node_modules/@lorenz/config/dist/schemas.js +5 -1
  75. package/node_modules/@lorenz/config/dist/schemas.js.map +1 -1
  76. package/node_modules/@lorenz/dispatch-coordinator/dist/coordinator.d.ts +55 -21
  77. package/node_modules/@lorenz/dispatch-coordinator/dist/coordinator.d.ts.map +1 -1
  78. package/node_modules/@lorenz/dispatch-coordinator/dist/coordinator.js +187 -82
  79. package/node_modules/@lorenz/dispatch-coordinator/dist/coordinator.js.map +1 -1
  80. package/node_modules/@lorenz/dispatch-coordinator/dist/gate.d.ts +6 -4
  81. package/node_modules/@lorenz/dispatch-coordinator/dist/gate.d.ts.map +1 -1
  82. package/node_modules/@lorenz/dispatch-coordinator/dist/gate.js +9 -6
  83. package/node_modules/@lorenz/dispatch-coordinator/dist/gate.js.map +1 -1
  84. package/node_modules/@lorenz/dispatch-coordinator/dist/index.d.ts +1 -1
  85. package/node_modules/@lorenz/dispatch-coordinator/dist/index.d.ts.map +1 -1
  86. package/node_modules/@lorenz/dispatch-coordinator/dist/index.js +5 -6
  87. package/node_modules/@lorenz/dispatch-coordinator/dist/index.js.map +1 -1
  88. package/node_modules/@lorenz/dispatch-coordinator/dist/mcpEndpointManager.d.ts +7 -5
  89. package/node_modules/@lorenz/dispatch-coordinator/dist/mcpEndpointManager.d.ts.map +1 -1
  90. package/node_modules/@lorenz/dispatch-coordinator/dist/mcpEndpointManager.js +12 -10
  91. package/node_modules/@lorenz/dispatch-coordinator/dist/mcpEndpointManager.js.map +1 -1
  92. package/node_modules/@lorenz/dispatch-coordinator/dist/nullEndpointManager.d.ts +11 -10
  93. package/node_modules/@lorenz/dispatch-coordinator/dist/nullEndpointManager.d.ts.map +1 -1
  94. package/node_modules/@lorenz/dispatch-coordinator/dist/nullEndpointManager.js +15 -22
  95. package/node_modules/@lorenz/dispatch-coordinator/dist/nullEndpointManager.js.map +1 -1
  96. package/node_modules/@lorenz/dispatch-coordinator/dist/types.d.ts +16 -15
  97. package/node_modules/@lorenz/dispatch-coordinator/dist/types.d.ts.map +1 -1
  98. package/node_modules/@lorenz/dispatch-coordinator/dist/types.js +6 -7
  99. package/node_modules/@lorenz/dispatch-coordinator/dist/types.js.map +1 -1
  100. package/node_modules/@lorenz/domain/dist/index.d.ts +75 -9
  101. package/node_modules/@lorenz/domain/dist/index.d.ts.map +1 -1
  102. package/node_modules/@lorenz/domain/dist/index.js +40 -0
  103. package/node_modules/@lorenz/domain/dist/index.js.map +1 -1
  104. package/node_modules/@lorenz/flags/dist/coerce.d.ts +12 -0
  105. package/node_modules/@lorenz/flags/dist/coerce.d.ts.map +1 -0
  106. package/node_modules/@lorenz/flags/dist/coerce.js +44 -0
  107. package/node_modules/@lorenz/flags/dist/coerce.js.map +1 -0
  108. package/node_modules/@lorenz/flags/dist/default.d.ts +6 -0
  109. package/node_modules/@lorenz/flags/dist/default.d.ts.map +1 -0
  110. package/node_modules/@lorenz/flags/dist/default.js +22 -0
  111. package/node_modules/@lorenz/flags/dist/default.js.map +1 -0
  112. package/node_modules/@lorenz/flags/dist/deprecations.d.ts +20 -0
  113. package/node_modules/@lorenz/flags/dist/deprecations.d.ts.map +1 -0
  114. package/node_modules/@lorenz/flags/dist/deprecations.js +42 -0
  115. package/node_modules/@lorenz/flags/dist/deprecations.js.map +1 -0
  116. package/node_modules/@lorenz/flags/dist/env.d.ts +17 -0
  117. package/node_modules/@lorenz/flags/dist/env.d.ts.map +1 -0
  118. package/node_modules/@lorenz/flags/dist/env.js +90 -0
  119. package/node_modules/@lorenz/flags/dist/env.js.map +1 -0
  120. package/node_modules/@lorenz/flags/dist/errors.d.ts +22 -0
  121. package/node_modules/@lorenz/flags/dist/errors.d.ts.map +1 -0
  122. package/node_modules/@lorenz/flags/dist/errors.js +61 -0
  123. package/node_modules/@lorenz/flags/dist/errors.js.map +1 -0
  124. package/node_modules/@lorenz/flags/dist/index.d.ts +8 -0
  125. package/node_modules/@lorenz/flags/dist/index.d.ts.map +1 -0
  126. package/node_modules/@lorenz/flags/dist/index.js +11 -0
  127. package/node_modules/@lorenz/flags/dist/index.js.map +1 -0
  128. package/node_modules/@lorenz/flags/dist/keys.d.ts +6 -0
  129. package/node_modules/@lorenz/flags/dist/keys.d.ts.map +1 -0
  130. package/node_modules/@lorenz/flags/dist/keys.js +15 -0
  131. package/node_modules/@lorenz/flags/dist/keys.js.map +1 -0
  132. package/node_modules/@lorenz/flags/dist/layers.d.ts +14 -0
  133. package/node_modules/@lorenz/flags/dist/layers.d.ts.map +1 -0
  134. package/node_modules/@lorenz/flags/dist/layers.js +107 -0
  135. package/node_modules/@lorenz/flags/dist/layers.js.map +1 -0
  136. package/node_modules/@lorenz/flags/dist/manifest.d.ts +71 -0
  137. package/node_modules/@lorenz/flags/dist/manifest.d.ts.map +1 -0
  138. package/node_modules/@lorenz/flags/dist/manifest.js +137 -0
  139. package/node_modules/@lorenz/flags/dist/manifest.js.map +1 -0
  140. package/node_modules/@lorenz/flags/dist/resolve.d.ts +8 -0
  141. package/node_modules/@lorenz/flags/dist/resolve.d.ts.map +1 -0
  142. package/node_modules/@lorenz/flags/dist/resolve.js +178 -0
  143. package/node_modules/@lorenz/flags/dist/resolve.js.map +1 -0
  144. package/node_modules/@lorenz/flags/dist/testing.d.ts +19 -0
  145. package/node_modules/@lorenz/flags/dist/testing.d.ts.map +1 -0
  146. package/node_modules/@lorenz/flags/dist/testing.js +68 -0
  147. package/node_modules/@lorenz/flags/dist/testing.js.map +1 -0
  148. package/node_modules/@lorenz/flags/dist/types.d.ts +93 -0
  149. package/node_modules/@lorenz/flags/dist/types.d.ts.map +1 -0
  150. package/node_modules/@lorenz/flags/dist/types.js +2 -0
  151. package/node_modules/@lorenz/flags/dist/types.js.map +1 -0
  152. package/node_modules/@lorenz/flags/package.json +16 -0
  153. package/node_modules/@lorenz/mcp/dist/agentEndpoint.d.ts +16 -3
  154. package/node_modules/@lorenz/mcp/dist/agentEndpoint.d.ts.map +1 -1
  155. package/node_modules/@lorenz/mcp/dist/agentEndpoint.js +105 -17
  156. package/node_modules/@lorenz/mcp/dist/agentEndpoint.js.map +1 -1
  157. package/node_modules/@lorenz/mcp/dist/auth.d.ts +88 -0
  158. package/node_modules/@lorenz/mcp/dist/auth.d.ts.map +1 -1
  159. package/node_modules/@lorenz/mcp/dist/auth.js +53 -0
  160. package/node_modules/@lorenz/mcp/dist/auth.js.map +1 -1
  161. package/node_modules/@lorenz/mcp/dist/index.d.ts +3 -2
  162. package/node_modules/@lorenz/mcp/dist/index.d.ts.map +1 -1
  163. package/node_modules/@lorenz/mcp/dist/index.js +1 -1
  164. package/node_modules/@lorenz/mcp/dist/index.js.map +1 -1
  165. package/node_modules/@lorenz/mcp/dist/server.d.ts +22 -0
  166. package/node_modules/@lorenz/mcp/dist/server.d.ts.map +1 -1
  167. package/node_modules/@lorenz/mcp/dist/server.js +85 -12
  168. package/node_modules/@lorenz/mcp/dist/server.js.map +1 -1
  169. package/node_modules/@lorenz/orchestrator/dist/claimStore.d.ts +157 -0
  170. package/node_modules/@lorenz/orchestrator/dist/claimStore.d.ts.map +1 -0
  171. package/node_modules/@lorenz/orchestrator/dist/claimStore.js +621 -0
  172. package/node_modules/@lorenz/orchestrator/dist/claimStore.js.map +1 -0
  173. package/node_modules/@lorenz/orchestrator/dist/codec.d.ts +38 -0
  174. package/node_modules/@lorenz/orchestrator/dist/codec.d.ts.map +1 -0
  175. package/node_modules/@lorenz/orchestrator/dist/codec.js +176 -0
  176. package/node_modules/@lorenz/orchestrator/dist/codec.js.map +1 -0
  177. package/node_modules/@lorenz/orchestrator/dist/index.d.ts +55 -51
  178. package/node_modules/@lorenz/orchestrator/dist/index.d.ts.map +1 -1
  179. package/node_modules/@lorenz/orchestrator/dist/index.js +285 -45
  180. package/node_modules/@lorenz/orchestrator/dist/index.js.map +1 -1
  181. package/node_modules/@lorenz/orchestrator/dist/sqlite.d.ts +34 -0
  182. package/node_modules/@lorenz/orchestrator/dist/sqlite.d.ts.map +1 -0
  183. package/node_modules/@lorenz/orchestrator/dist/sqlite.js +142 -0
  184. package/node_modules/@lorenz/orchestrator/dist/sqlite.js.map +1 -0
  185. package/node_modules/@lorenz/orchestrator/dist/state.d.ts +47 -0
  186. package/node_modules/@lorenz/orchestrator/dist/state.d.ts.map +1 -0
  187. package/node_modules/@lorenz/orchestrator/dist/state.js +15 -0
  188. package/node_modules/@lorenz/orchestrator/dist/state.js.map +1 -0
  189. package/node_modules/@lorenz/orchestrator/dist/turso.d.ts +28 -0
  190. package/node_modules/@lorenz/orchestrator/dist/turso.d.ts.map +1 -0
  191. package/node_modules/@lorenz/orchestrator/dist/turso.js +125 -0
  192. package/node_modules/@lorenz/orchestrator/dist/turso.js.map +1 -0
  193. package/node_modules/@lorenz/orchestrator/package.json +6 -2
  194. package/node_modules/@lorenz/presenter/dist/index.d.ts +14 -0
  195. package/node_modules/@lorenz/presenter/dist/index.d.ts.map +1 -1
  196. package/node_modules/@lorenz/presenter/dist/index.js +18 -0
  197. package/node_modules/@lorenz/presenter/dist/index.js.map +1 -1
  198. package/node_modules/@lorenz/projections/dist/index.d.ts.map +1 -1
  199. package/node_modules/@lorenz/projections/dist/index.js +1 -0
  200. package/node_modules/@lorenz/projections/dist/index.js.map +1 -1
  201. package/node_modules/@lorenz/runtime/dist/index.d.ts +27 -8
  202. package/node_modules/@lorenz/runtime/dist/index.d.ts.map +1 -1
  203. package/node_modules/@lorenz/runtime/dist/index.js +422 -98
  204. package/node_modules/@lorenz/runtime/dist/index.js.map +1 -1
  205. package/node_modules/@lorenz/runtime-events/dist/index.d.ts +14 -0
  206. package/node_modules/@lorenz/runtime-events/dist/index.d.ts.map +1 -1
  207. package/node_modules/@lorenz/ssh/dist/index.d.ts +2 -0
  208. package/node_modules/@lorenz/ssh/dist/index.d.ts.map +1 -1
  209. package/node_modules/@lorenz/ssh/dist/index.js +2 -1
  210. package/node_modules/@lorenz/ssh/dist/index.js.map +1 -1
  211. package/node_modules/@lorenz/tool-sdk/dist/index.d.ts +1 -0
  212. package/node_modules/@lorenz/tool-sdk/dist/index.d.ts.map +1 -1
  213. package/node_modules/@lorenz/tool-sdk/dist/index.js +1 -0
  214. package/node_modules/@lorenz/tool-sdk/dist/index.js.map +1 -1
  215. package/node_modules/@lorenz/tool-sdk/dist/module.d.ts +38 -0
  216. package/node_modules/@lorenz/tool-sdk/dist/module.d.ts.map +1 -0
  217. package/node_modules/@lorenz/tool-sdk/dist/module.js +42 -0
  218. package/node_modules/@lorenz/tool-sdk/dist/module.js.map +1 -0
  219. package/node_modules/@lorenz/tracker-sdk/dist/index.d.ts +1 -0
  220. package/node_modules/@lorenz/tracker-sdk/dist/index.d.ts.map +1 -1
  221. package/node_modules/@lorenz/tracker-sdk/dist/index.js +1 -0
  222. package/node_modules/@lorenz/tracker-sdk/dist/index.js.map +1 -1
  223. package/node_modules/@lorenz/tracker-sdk/dist/module.d.ts +37 -0
  224. package/node_modules/@lorenz/tracker-sdk/dist/module.d.ts.map +1 -0
  225. package/node_modules/@lorenz/tracker-sdk/dist/module.js +38 -0
  226. package/node_modules/@lorenz/tracker-sdk/dist/module.js.map +1 -0
  227. package/node_modules/@lorenz/worker-host-pool/dist/index.d.ts +34 -6
  228. package/node_modules/@lorenz/worker-host-pool/dist/index.d.ts.map +1 -1
  229. package/node_modules/@lorenz/worker-host-pool/dist/index.js +110 -143
  230. package/node_modules/@lorenz/worker-host-pool/dist/index.js.map +1 -1
  231. package/node_modules/@lorenz/worker-sdk/dist/index.d.ts +1 -0
  232. package/node_modules/@lorenz/worker-sdk/dist/index.d.ts.map +1 -1
  233. package/node_modules/@lorenz/worker-sdk/dist/index.js +1 -0
  234. package/node_modules/@lorenz/worker-sdk/dist/index.js.map +1 -1
  235. package/node_modules/@lorenz/worker-sdk/dist/local.d.ts +74 -0
  236. package/node_modules/@lorenz/worker-sdk/dist/local.d.ts.map +1 -0
  237. package/node_modules/@lorenz/worker-sdk/dist/local.js +112 -0
  238. package/node_modules/@lorenz/worker-sdk/dist/local.js.map +1 -0
  239. package/node_modules/@lorenz/worker-sdk/dist/module.d.ts +8 -16
  240. package/node_modules/@lorenz/worker-sdk/dist/module.d.ts.map +1 -1
  241. package/node_modules/@lorenz/worker-sdk/dist/module.js +15 -35
  242. package/node_modules/@lorenz/worker-sdk/dist/module.js.map +1 -1
  243. package/node_modules/@lorenz/workflow/dist/index.d.ts +11 -0
  244. package/node_modules/@lorenz/workflow/dist/index.d.ts.map +1 -1
  245. package/node_modules/@lorenz/workflow/dist/index.js +3 -0
  246. package/node_modules/@lorenz/workflow/dist/index.js.map +1 -1
  247. package/package.json +4 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.js","sourceRoot":"","sources":["../src/default.ts"],"names":[],"mappings":"AAEA,oGAAoG;AACpG,IAAI,OAAkC,CAAC;AAEvC,MAAM,UAAU,eAAe;IAC7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,6FAA6F;QAC7F,8FAA8F;QAC9F,6BAA6B;QAC7B,MAAM,IAAI,KAAK,CACb,yFAAyF;YACvF,uFAAuF,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,OAAO,GAAG,QAAQ,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,KAAK,SAAS,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,GAAG,SAAS,CAAC;AACtB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { FlagManifest } from "./types.js";
2
+ export declare function stderrFlagWarn(message: string): void;
3
+ export interface StagedDeprecation {
4
+ readonly key: string;
5
+ readonly message: string;
6
+ }
7
+ /**
8
+ * Stage (but do not emit) deprecation warnings for the given explicitly-set keys. The resolver
9
+ * stages during resolution and only {@link commitFlagDeprecations commits} if the overall resolve
10
+ * succeeds, so a resolve that throws never consumes a once-per-process warning slot.
11
+ */
12
+ export declare function collectFlagDeprecations(explicitKeys: readonly {
13
+ readonly key: string;
14
+ readonly isFeature: boolean;
15
+ }[], manifest: FlagManifest): StagedDeprecation[];
16
+ /** Commit staged warnings to the once-per-process dedup set and emit the not-yet-seen ones. */
17
+ export declare function commitFlagDeprecations(staged: readonly StagedDeprecation[], warn?: (message: string) => void): string[];
18
+ /** Test seam: clear the once-per-process dedup set so a fresh snapshot re-warns. */
19
+ export declare function resetFlagDeprecationWarnings(): void;
20
+ //# sourceMappingURL=deprecations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deprecations.d.ts","sourceRoot":"","sources":["../src/deprecations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,YAAY,CAAC;AAOhE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEpD;AAKD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,SAAS;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAAE,EAAE,EAC9E,QAAQ,EAAE,YAAY,GACrB,iBAAiB,EAAE,CASrB;AAED,+FAA+F;AAC/F,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,iBAAiB,EAAE,EACpC,IAAI,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAqB,GAC/C,MAAM,EAAE,CASV;AAED,oFAAoF;AACpF,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD"}
@@ -0,0 +1,42 @@
1
+ function formatFlagDeprecation(key, deprecation) {
2
+ const base = `\`${key}\` is deprecated.`;
3
+ return deprecation.detail ? `${base} ${deprecation.detail}` : base;
4
+ }
5
+ export function stderrFlagWarn(message) {
6
+ process.stderr.write(`warning: ${message}\n`);
7
+ }
8
+ // Once-per-process dedup, so a deprecated key set on every poll/reload warns only once.
9
+ const warnedDeprecations = new Set();
10
+ /**
11
+ * Stage (but do not emit) deprecation warnings for the given explicitly-set keys. The resolver
12
+ * stages during resolution and only {@link commitFlagDeprecations commits} if the overall resolve
13
+ * succeeds, so a resolve that throws never consumes a once-per-process warning slot.
14
+ */
15
+ export function collectFlagDeprecations(explicitKeys, manifest) {
16
+ const staged = [];
17
+ for (const { key, isFeature } of explicitKeys) {
18
+ const deprecation = isFeature
19
+ ? manifest.features[key]?.deprecation
20
+ : manifest.flags[key]?.deprecation;
21
+ if (deprecation)
22
+ staged.push({ key, message: formatFlagDeprecation(key, deprecation) });
23
+ }
24
+ return staged;
25
+ }
26
+ /** Commit staged warnings to the once-per-process dedup set and emit the not-yet-seen ones. */
27
+ export function commitFlagDeprecations(staged, warn = stderrFlagWarn) {
28
+ const emitted = [];
29
+ for (const { key, message } of staged) {
30
+ if (warnedDeprecations.has(key))
31
+ continue;
32
+ warnedDeprecations.add(key);
33
+ warn(message);
34
+ emitted.push(key);
35
+ }
36
+ return emitted;
37
+ }
38
+ /** Test seam: clear the once-per-process dedup set so a fresh snapshot re-warns. */
39
+ export function resetFlagDeprecationWarnings() {
40
+ warnedDeprecations.clear();
41
+ }
42
+ //# sourceMappingURL=deprecations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deprecations.js","sourceRoot":"","sources":["../src/deprecations.ts"],"names":[],"mappings":"AAEA,SAAS,qBAAqB,CAAC,GAAW,EAAE,WAA4B;IACtE,MAAM,IAAI,GAAG,KAAK,GAAG,mBAAmB,CAAC;IACzC,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,wFAAwF;AACxF,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;AAO7C;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACrC,YAA8E,EAC9E,QAAsB;IAEtB,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,KAAK,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,YAAY,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,SAAS;YAC3B,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,WAAW;YACrC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC;QACrC,IAAI,WAAW;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,qBAAqB,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,sBAAsB,CACpC,MAAoC,EACpC,OAAkC,cAAc;IAEhD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,MAAM,EAAE,CAAC;QACtC,IAAI,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC1C,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,4BAA4B;IAC1C,kBAAkB,CAAC,KAAK,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { FlagManifest, RawLayer } from "./types.js";
2
+ export declare function flagEnvName(key: string): string;
3
+ interface EnvBinding {
4
+ readonly kind: "flag" | "feature";
5
+ readonly key: string;
6
+ }
7
+ /** Build the reverse env-name -> binding table, throwing on a boot-time name collision. */
8
+ export declare function buildEnvLookup(manifest: FlagManifest): Map<string, EnvBinding>;
9
+ /**
10
+ * Scan the whole environment for the reserved prefixes. Categorization problems (unknown name,
11
+ * wrong prefix for a known key, non-boolean feature value) become deferred {@link FlagIssue}s so a
12
+ * single resolve reports every env problem at once, independent of `process.env` iteration order.
13
+ * Only a manifest-level env-name collision (from {@link buildEnvLookup}) throws.
14
+ */
15
+ export declare function flagInputsFromEnv(manifest: FlagManifest, env?: NodeJS.ProcessEnv): RawLayer;
16
+ export {};
17
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsC,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAY7F,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAMD,UAAU,UAAU;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,2FAA2F;AAC3F,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAmB9E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,EACtB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,QAAQ,CA8CV"}
@@ -0,0 +1,90 @@
1
+ import { parseBoolToken } from "./coerce.js";
2
+ const FLAG_PREFIX = "LORENZ_FLAG_";
3
+ const FEATURE_PREFIX = "LORENZ_FEATURE_";
4
+ // Manifest keys are lower_snake_case dotted, so the env encoding is a lossless mechanical
5
+ // transform: `scheduler.batch_size` -> `LORENZ_FLAG_SCHEDULER__BATCH_SIZE`. No camelCase boundary
6
+ // handling and no lossy uppercasing, so derived names never collide.
7
+ function encodeKey(key) {
8
+ return key.split(".").join("__").toUpperCase();
9
+ }
10
+ export function flagEnvName(key) {
11
+ return `${FLAG_PREFIX}${encodeKey(key)}`;
12
+ }
13
+ function featureEnvName(name) {
14
+ return `${FEATURE_PREFIX}${encodeKey(name)}`;
15
+ }
16
+ /** Build the reverse env-name -> binding table, throwing on a boot-time name collision. */
17
+ export function buildEnvLookup(manifest) {
18
+ const table = new Map();
19
+ const add = (envVar, binding) => {
20
+ const existing = table.get(envVar);
21
+ if (existing) {
22
+ throw new Error(`@lorenz/flags: env var ${envVar} maps to both ${existing.kind} \`${existing.key}\` and ` +
23
+ `${binding.kind} \`${binding.key}\`; set an explicit envName to disambiguate`);
24
+ }
25
+ table.set(envVar, binding);
26
+ };
27
+ for (const [key, def] of Object.entries(manifest.flags)) {
28
+ add(def.envName ?? flagEnvName(key), { kind: "flag", key });
29
+ }
30
+ for (const [name, def] of Object.entries(manifest.features)) {
31
+ add(def.envName ?? featureEnvName(name), { kind: "feature", key: name });
32
+ }
33
+ return table;
34
+ }
35
+ /**
36
+ * Scan the whole environment for the reserved prefixes. Categorization problems (unknown name,
37
+ * wrong prefix for a known key, non-boolean feature value) become deferred {@link FlagIssue}s so a
38
+ * single resolve reports every env problem at once, independent of `process.env` iteration order.
39
+ * Only a manifest-level env-name collision (from {@link buildEnvLookup}) throws.
40
+ */
41
+ export function flagInputsFromEnv(manifest, env = process.env) {
42
+ const lookup = buildEnvLookup(manifest);
43
+ const flags = [];
44
+ const features = [];
45
+ const issues = [];
46
+ for (const [envVar, rawValue] of Object.entries(env)) {
47
+ const isFlag = envVar.startsWith(FLAG_PREFIX);
48
+ const isFeature = envVar.startsWith(FEATURE_PREFIX);
49
+ if ((!isFlag && !isFeature) || rawValue === undefined)
50
+ continue;
51
+ const binding = lookup.get(envVar);
52
+ if (!binding) {
53
+ issues.push({
54
+ kind: isFlag ? "unknown_flag" : "unknown_feature",
55
+ message: `${envVar}: unknown ${isFlag ? "flag" : "feature"} (no manifest key maps to this env var)`,
56
+ });
57
+ continue;
58
+ }
59
+ if (binding.kind === "flag") {
60
+ if (!isFlag) {
61
+ issues.push({
62
+ kind: "invalid_value",
63
+ message: `${envVar}: \`${binding.key}\` is a flag; use ${FLAG_PREFIX}* not ${FEATURE_PREFIX}*`,
64
+ });
65
+ continue;
66
+ }
67
+ flags.push({ source: "env", key: binding.key, rawValue, origin: envVar });
68
+ }
69
+ else {
70
+ if (!isFeature) {
71
+ issues.push({
72
+ kind: "invalid_value",
73
+ message: `${envVar}: \`${binding.key}\` is a feature; use ${FEATURE_PREFIX}* not ${FLAG_PREFIX}*`,
74
+ });
75
+ continue;
76
+ }
77
+ const enabled = parseBoolToken(rawValue);
78
+ if (enabled === undefined) {
79
+ issues.push({
80
+ kind: "invalid_value",
81
+ message: `invalid value for ${envVar}: must be true or false`,
82
+ });
83
+ continue;
84
+ }
85
+ features.push({ source: "env", name: binding.key, enabled, origin: envVar });
86
+ }
87
+ }
88
+ return { flags, features, issues };
89
+ }
90
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { z } from "zod";
2
+ import type { FlagDef, FlagIssue, FlagManifest } from "./types.js";
3
+ /** Accumulates problems across every layer so one resolve reports them all at once. */
4
+ export declare class FlagIssueCollector {
5
+ private readonly issues;
6
+ add(issue: FlagIssue): void;
7
+ addAll(issues: readonly FlagIssue[]): void;
8
+ get isEmpty(): boolean;
9
+ list(): readonly FlagIssue[];
10
+ throwIfAny(): void;
11
+ }
12
+ export declare function unknownFlagError(sourceLabel: string, key: string, manifest: FlagManifest): FlagIssue;
13
+ export declare function unknownFeatureError(sourceLabel: string, name: string, manifest: FlagManifest): FlagIssue;
14
+ /**
15
+ * Map a Zod validation error for one flag value to friendly text. The message is keyed off the
16
+ * flag's `kind` rather than the raw Zod issue, because the coercion unions (`numericInput`,
17
+ * `coercedBoolean`) surface as `invalid_union` issues whose default wording is unhelpful, and enum
18
+ * allowed-values come from the manifest (`def.values`) rather than a Zod-internal field. A `custom`
19
+ * refine failure (e.g. a per-flag bound) keeps its own message so callers can express constraints.
20
+ */
21
+ export declare function flagValueErrorMessage(error: z.ZodError, def: FlagDef): string;
22
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAG7B,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnE,uFAAuF;AACvF,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAE1C,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAI3B,MAAM,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI;IAI1C,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,IAAI,SAAS,SAAS,EAAE;IAI5B,UAAU,IAAI,IAAI;CAGnB;AAQD,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,YAAY,GACrB,SAAS,CAKX;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,GACrB,SAAS,CAKX;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,CAc7E"}
@@ -0,0 +1,61 @@
1
+ import { featureKeys, flagKeys } from "./keys.js";
2
+ /** Accumulates problems across every layer so one resolve reports them all at once. */
3
+ export class FlagIssueCollector {
4
+ issues = [];
5
+ add(issue) {
6
+ this.issues.push(issue);
7
+ }
8
+ addAll(issues) {
9
+ for (const issue of issues)
10
+ this.issues.push(issue);
11
+ }
12
+ get isEmpty() {
13
+ return this.issues.length === 0;
14
+ }
15
+ list() {
16
+ return this.issues;
17
+ }
18
+ throwIfAny() {
19
+ if (this.issues.length > 0)
20
+ throw new Error(formatFlagIssues(this.issues));
21
+ }
22
+ }
23
+ function formatFlagIssues(issues) {
24
+ const header = issues.length === 1 ? "lorenz flags: 1 problem:" : `lorenz flags: ${issues.length} problems:`;
25
+ return `${header}\n${issues.map((issue) => ` - ${issue.message}`).join("\n")}`;
26
+ }
27
+ export function unknownFlagError(sourceLabel, key, manifest) {
28
+ return {
29
+ kind: "unknown_flag",
30
+ message: `${sourceLabel} sets unknown flag \`${key}\` (known flags: ${flagKeys(manifest).join(", ")})`,
31
+ };
32
+ }
33
+ export function unknownFeatureError(sourceLabel, name, manifest) {
34
+ return {
35
+ kind: "unknown_feature",
36
+ message: `${sourceLabel} sets unknown feature \`${name}\` (known features: ${featureKeys(manifest).join(", ")})`,
37
+ };
38
+ }
39
+ /**
40
+ * Map a Zod validation error for one flag value to friendly text. The message is keyed off the
41
+ * flag's `kind` rather than the raw Zod issue, because the coercion unions (`numericInput`,
42
+ * `coercedBoolean`) surface as `invalid_union` issues whose default wording is unhelpful, and enum
43
+ * allowed-values come from the manifest (`def.values`) rather than a Zod-internal field. A `custom`
44
+ * refine failure (e.g. a per-flag bound) keeps its own message so callers can express constraints.
45
+ */
46
+ export function flagValueErrorMessage(error, def) {
47
+ const first = error.issues[0];
48
+ switch (def.kind) {
49
+ case "int":
50
+ return first?.code === "custom" ? first.message : "must be an integer";
51
+ case "float":
52
+ return first?.code === "custom" ? first.message : "must be a number";
53
+ case "bool":
54
+ return "must be true or false";
55
+ case "enum":
56
+ return `must be one of: ${(def.values ?? []).join(", ")}`;
57
+ default:
58
+ return first ? first.message : "is invalid";
59
+ }
60
+ }
61
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGlD,uFAAuF;AACvF,MAAM,OAAO,kBAAkB;IACZ,MAAM,GAAgB,EAAE,CAAC;IAE1C,GAAG,CAAC,KAAgB;QAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,MAA4B;QACjC,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7E,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,MAA4B;IACpD,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,iBAAiB,MAAM,CAAC,MAAM,YAAY,CAAC;IAChG,OAAO,GAAG,MAAM,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,WAAmB,EACnB,GAAW,EACX,QAAsB;IAEtB,OAAO;QACL,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,GAAG,WAAW,wBAAwB,GAAG,oBAAoB,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;KACvG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,WAAmB,EACnB,IAAY,EACZ,QAAsB;IAEtB,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,GAAG,WAAW,2BAA2B,IAAI,uBAAuB,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;KACjH,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAiB,EAAE,GAAY;IACnE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9B,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,KAAK;YACR,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC;QACzE,KAAK,OAAO;YACV,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;QACvE,KAAK,MAAM;YACT,OAAO,uBAAuB,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,mBAAmB,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D;YACE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;IAChD,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type { FeatureDef, FeatureInput, FeatureKeyOf, FeatureMapFor, FlagDef, FlagDeprecation, FlagInput, FlagIssue, FlagIssueKind, FlagKeyOf, FlagKind, FlagManifest, FlagMap, FlagOverrides, FlagsSnapshot, FlagValue, FlagValuesOf, LayerSource, PresetFor, RawLayer, RawLayers, ResolveOptions, } from "./types.js";
2
+ export { bindFlags, defineFeatures, defineFlags, feature, flag, validateManifest, type BoundFlags, } from "./manifest.js";
3
+ export { featureKeys } from "./keys.js";
4
+ export { flagInputsFromEnv } from "./env.js";
5
+ export { flagInputsFromCli, flagInputsFromFile } from "./layers.js";
6
+ export { resolveFlags } from "./resolve.js";
7
+ export { setDefaultFlags } from "./default.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,OAAO,EACP,eAAe,EACf,SAAS,EACT,SAAS,EACT,aAAa,EACb,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,OAAO,EACP,aAAa,EACb,aAAa,EACb,SAAS,EACT,YAAY,EACZ,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,cAAc,EACd,WAAW,EACX,OAAO,EACP,IAAI,EACJ,gBAAgB,EAChB,KAAK,UAAU,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,11 @@
1
+ // Public surface of @lorenz/flags. Kept deliberately small: only what the composition root needs to
2
+ // declare a manifest, resolve it, and install the snapshot. Internal helpers (coercion primitives,
3
+ // the issue collector, env-name encoding, the raw singleton holder, key guards) stay unexported so
4
+ // the engine-internal boundary is not widened. Test seams live in the `./testing` subpath.
5
+ export { bindFlags, defineFeatures, defineFlags, feature, flag, validateManifest, } from "./manifest.js";
6
+ export { featureKeys } from "./keys.js";
7
+ export { flagInputsFromEnv } from "./env.js";
8
+ export { flagInputsFromCli, flagInputsFromFile } from "./layers.js";
9
+ export { resolveFlags } from "./resolve.js";
10
+ export { setDefaultFlags } from "./default.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,mGAAmG;AACnG,mGAAmG;AACnG,2FAA2F;AA2B3F,OAAO,EACL,SAAS,EACT,cAAc,EACd,WAAW,EACX,OAAO,EACP,IAAI,EACJ,gBAAgB,GAEjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { FlagManifest } from "./types.js";
2
+ export declare function isFlagKey(manifest: FlagManifest, key: string): boolean;
3
+ export declare function isFeatureKey(manifest: FlagManifest, name: string): boolean;
4
+ export declare function flagKeys(manifest: FlagManifest): readonly string[];
5
+ export declare function featureKeys(manifest: FlagManifest): readonly string[];
6
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,wBAAgB,SAAS,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,CAElE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,CAErE"}
@@ -0,0 +1,15 @@
1
+ // `hasOwnProperty` (not the `in` operator) so inherited names like `constructor`/`toString` are not
2
+ // mistaken for declared keys: `isFlagKey(m, "constructor")` must be false so unknown keys fail.
3
+ export function isFlagKey(manifest, key) {
4
+ return Object.prototype.hasOwnProperty.call(manifest.flags, key);
5
+ }
6
+ export function isFeatureKey(manifest, name) {
7
+ return Object.prototype.hasOwnProperty.call(manifest.features, name);
8
+ }
9
+ export function flagKeys(manifest) {
10
+ return Object.keys(manifest.flags).sort();
11
+ }
12
+ export function featureKeys(manifest) {
13
+ return Object.keys(manifest.features).sort();
14
+ }
15
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAEA,oGAAoG;AACpG,gGAAgG;AAEhG,MAAM,UAAU,SAAS,CAAC,QAAsB,EAAE,GAAW;IAC3D,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAsB,EAAE,IAAY;IAC/D,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAsB;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAsB;IAChD,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { FlagManifest, RawLayer } from "./types.js";
2
+ /**
3
+ * Parse repeatable `--flag key=value` / `--feature name[=true|false]` CLI tokens. Like the env
4
+ * parser, this is fully non-throwing: malformed shape, unknown keys, and non-boolean feature tokens
5
+ * become deferred {@link FlagIssue}s so the resolver reports every CLI problem at once.
6
+ */
7
+ export declare function flagInputsFromCli(manifest: FlagManifest, flagTokens: readonly string[], featureTokens: readonly string[]): RawLayer;
8
+ /**
9
+ * Read the `flags:` / `features:` sections off raw `WORKFLOW.md` front matter. Native YAML scalars
10
+ * pass through unchanged as `rawValue` (no pre-stringification), so a YAML `8`/`true`/`null` reaches
11
+ * the right validator. Structural and unknown-key problems become deferred issues.
12
+ */
13
+ export declare function flagInputsFromFile(manifest: FlagManifest, config: Record<string, unknown>): RawLayer;
14
+ //# sourceMappingURL=layers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.d.ts","sourceRoot":"","sources":["../src/layers.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAsC,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7F;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,QAAQ,CA4CV;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,QAAQ,CAkDV"}
@@ -0,0 +1,107 @@
1
+ import { isRecord } from "@lorenz/domain";
2
+ import { parseBoolToken } from "./coerce.js";
3
+ import { unknownFeatureError, unknownFlagError } from "./errors.js";
4
+ import { isFeatureKey, isFlagKey } from "./keys.js";
5
+ /**
6
+ * Parse repeatable `--flag key=value` / `--feature name[=true|false]` CLI tokens. Like the env
7
+ * parser, this is fully non-throwing: malformed shape, unknown keys, and non-boolean feature tokens
8
+ * become deferred {@link FlagIssue}s so the resolver reports every CLI problem at once.
9
+ */
10
+ export function flagInputsFromCli(manifest, flagTokens, featureTokens) {
11
+ const flags = [];
12
+ const features = [];
13
+ const issues = [];
14
+ for (const token of flagTokens) {
15
+ const eq = token.indexOf("=");
16
+ if (eq <= 0) {
17
+ issues.push({ kind: "invalid_value", message: `--flag expects key=value, got "${token}"` });
18
+ continue;
19
+ }
20
+ const key = token.slice(0, eq).trim();
21
+ // Split on the FIRST `=` so values may themselves contain `=`.
22
+ const rawValue = token.slice(eq + 1);
23
+ if (!isFlagKey(manifest, key)) {
24
+ issues.push(unknownFlagError("--flag", key, manifest));
25
+ continue;
26
+ }
27
+ flags.push({ source: "cli", key, rawValue, origin: `--flag ${token}` });
28
+ }
29
+ for (const token of featureTokens) {
30
+ const eq = token.indexOf("=");
31
+ const name = (eq === -1 ? token : token.slice(0, eq)).trim();
32
+ if (!isFeatureKey(manifest, name)) {
33
+ issues.push(unknownFeatureError("--feature", name, manifest));
34
+ continue;
35
+ }
36
+ if (eq === -1) {
37
+ features.push({ source: "cli", name, enabled: true, origin: `--feature ${name}` });
38
+ continue;
39
+ }
40
+ const enabled = parseBoolToken(token.slice(eq + 1));
41
+ if (enabled === undefined) {
42
+ issues.push({
43
+ kind: "invalid_value",
44
+ message: `--feature ${name} expects true|false, got "${token.slice(eq + 1)}"`,
45
+ });
46
+ continue;
47
+ }
48
+ features.push({ source: "cli", name, enabled, origin: `--feature ${token}` });
49
+ }
50
+ return { flags, features, issues };
51
+ }
52
+ /**
53
+ * Read the `flags:` / `features:` sections off raw `WORKFLOW.md` front matter. Native YAML scalars
54
+ * pass through unchanged as `rawValue` (no pre-stringification), so a YAML `8`/`true`/`null` reaches
55
+ * the right validator. Structural and unknown-key problems become deferred issues.
56
+ */
57
+ export function flagInputsFromFile(manifest, config) {
58
+ const flags = [];
59
+ const features = [];
60
+ const issues = [];
61
+ const flagsRaw = config.flags;
62
+ if (flagsRaw !== undefined) {
63
+ if (!isRecord(flagsRaw)) {
64
+ issues.push({
65
+ kind: "invalid_value",
66
+ message: "WORKFLOW.md `flags:` must be a map of key to value",
67
+ });
68
+ }
69
+ else {
70
+ for (const [key, value] of Object.entries(flagsRaw)) {
71
+ if (!isFlagKey(manifest, key)) {
72
+ issues.push(unknownFlagError("WORKFLOW.md flags", key, manifest));
73
+ continue;
74
+ }
75
+ flags.push({ source: "file", key, rawValue: value, origin: `WORKFLOW.md flags.${key}` });
76
+ }
77
+ }
78
+ }
79
+ const featuresRaw = config.features;
80
+ if (featuresRaw !== undefined) {
81
+ if (!isRecord(featuresRaw)) {
82
+ issues.push({
83
+ kind: "invalid_value",
84
+ message: "WORKFLOW.md `features:` must be a map of name to boolean",
85
+ });
86
+ }
87
+ else {
88
+ for (const [name, value] of Object.entries(featuresRaw)) {
89
+ if (!isFeatureKey(manifest, name)) {
90
+ issues.push(unknownFeatureError("WORKFLOW.md features", name, manifest));
91
+ continue;
92
+ }
93
+ const enabled = parseBoolToken(value);
94
+ if (enabled === undefined) {
95
+ issues.push({
96
+ kind: "invalid_value",
97
+ message: `WORKFLOW.md features.${name} must be a boolean, got "${String(value)}"`,
98
+ });
99
+ continue;
100
+ }
101
+ features.push({ source: "file", name, enabled, origin: `WORKFLOW.md features.${name}` });
102
+ }
103
+ }
104
+ }
105
+ return { flags, features, issues };
106
+ }
107
+ //# sourceMappingURL=layers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.js","sourceRoot":"","sources":["../src/layers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { z } from "zod";
2
+ import type { FeatureDef, FeatureMapFor, FlagDef, FlagDeprecation, FlagManifest, FlagMap, FlagsSnapshot } from "./types.js";
3
+ interface BaseFlagConfig {
4
+ readonly description: string;
5
+ readonly deprecation?: FlagDeprecation | undefined;
6
+ readonly envName?: string | undefined;
7
+ }
8
+ interface StringFlagConfig extends BaseFlagConfig {
9
+ readonly default: string;
10
+ }
11
+ interface NumberFlagConfig extends BaseFlagConfig {
12
+ readonly default: number;
13
+ /** Optional extra constraint (e.g. `(n) => n >= 1`) applied on top of int/float coercion. */
14
+ readonly refine?: ((n: number) => boolean) | undefined;
15
+ readonly refineMessage?: string | undefined;
16
+ }
17
+ interface BoolFlagConfig extends BaseFlagConfig {
18
+ readonly default: boolean;
19
+ }
20
+ interface EnumFlagConfig<V extends readonly [string, ...string[]]> extends BaseFlagConfig {
21
+ readonly values: V;
22
+ readonly default: V[number];
23
+ }
24
+ /** Builders for the five flag kinds. Each returns a {@link FlagDef} whose schema output is the
25
+ * flag's value type; numeric and boolean schemas coerce string inputs from env/CLI/file. */
26
+ export declare const flag: {
27
+ readonly string: (config: StringFlagConfig) => FlagDef<z.ZodString>;
28
+ readonly int: (config: NumberFlagConfig) => FlagDef<z.ZodType<number, string | number>>;
29
+ readonly float: (config: NumberFlagConfig) => FlagDef<z.ZodType<number, string | number>>;
30
+ readonly bool: (config: BoolFlagConfig) => FlagDef<z.ZodType<boolean, string | boolean>>;
31
+ readonly enum: <const V extends readonly [string, ...string[]]>(config: EnumFlagConfig<V>) => {
32
+ kind: "enum";
33
+ schema: z.ZodEnum<{ [k_1 in V[number]]: k_1; } extends infer T ? { [k in keyof T]: T[k]; } : never>;
34
+ default: V[number];
35
+ description: string;
36
+ deprecation: FlagDeprecation | undefined;
37
+ values: V;
38
+ envName: string | undefined;
39
+ };
40
+ };
41
+ export declare function feature<const Preset extends Record<string, unknown>>(config: {
42
+ readonly default: boolean;
43
+ readonly description: string;
44
+ readonly preset: Preset;
45
+ readonly deprecation?: FlagDeprecation | undefined;
46
+ readonly envName?: string | undefined;
47
+ }): FeatureDef<Preset>;
48
+ export declare function defineFlags<const F extends FlagMap>(flags: F): F;
49
+ export declare function defineFeatures<const F extends FlagMap, const Features extends FeatureMapFor<F>>(_flags: F, features: Features): Features;
50
+ /** Scalar-only value set, so reference identity via `Object.is` is correct and obvious. */
51
+ export declare function presetValueEqual(a: unknown, b: unknown): boolean;
52
+ /**
53
+ * Validate a manifest once at module load: every flag default parses, and every preset references a
54
+ * known flag with a valid value. Two features presetting the same flag to differing values is
55
+ * intentionally allowed (legal for mutually-exclusive features); that conflict is authoritative only
56
+ * over the actually-enabled set at resolve time.
57
+ */
58
+ export declare function validateManifest(manifest: FlagManifest): void;
59
+ export interface BoundFlags<F extends FlagMap, Features extends Record<string, FeatureDef>> {
60
+ /** Typed ambient accessor: the installed snapshot, narrowed to this manifest. */
61
+ getFlags(): FlagsSnapshot<F, Features>;
62
+ }
63
+ /**
64
+ * Bind a manifest to typed ambient accessors. Called once by the manifest-owning module; the rest
65
+ * of the engine imports the returned `getFlags`/`flag`, so ambient reads are as well-typed as the
66
+ * manifest. The cast is sound because the composition root installs a snapshot built from the same
67
+ * manifest, and it is contained to this one factory.
68
+ */
69
+ export declare function bindFlags<F extends FlagMap, Features extends Record<string, FeatureDef>>(_manifest: FlagManifest<F, Features>): BoundFlags<F, Features>;
70
+ export {};
71
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}