lorenz 0.1.4 → 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 (249) 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 +39 -2
  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/server/dist/index.js +1 -1
  208. package/node_modules/@lorenz/server/dist/index.js.map +1 -1
  209. package/node_modules/@lorenz/ssh/dist/index.d.ts +2 -0
  210. package/node_modules/@lorenz/ssh/dist/index.d.ts.map +1 -1
  211. package/node_modules/@lorenz/ssh/dist/index.js +2 -1
  212. package/node_modules/@lorenz/ssh/dist/index.js.map +1 -1
  213. package/node_modules/@lorenz/tool-sdk/dist/index.d.ts +1 -0
  214. package/node_modules/@lorenz/tool-sdk/dist/index.d.ts.map +1 -1
  215. package/node_modules/@lorenz/tool-sdk/dist/index.js +1 -0
  216. package/node_modules/@lorenz/tool-sdk/dist/index.js.map +1 -1
  217. package/node_modules/@lorenz/tool-sdk/dist/module.d.ts +38 -0
  218. package/node_modules/@lorenz/tool-sdk/dist/module.d.ts.map +1 -0
  219. package/node_modules/@lorenz/tool-sdk/dist/module.js +42 -0
  220. package/node_modules/@lorenz/tool-sdk/dist/module.js.map +1 -0
  221. package/node_modules/@lorenz/tracker-sdk/dist/index.d.ts +1 -0
  222. package/node_modules/@lorenz/tracker-sdk/dist/index.d.ts.map +1 -1
  223. package/node_modules/@lorenz/tracker-sdk/dist/index.js +1 -0
  224. package/node_modules/@lorenz/tracker-sdk/dist/index.js.map +1 -1
  225. package/node_modules/@lorenz/tracker-sdk/dist/module.d.ts +37 -0
  226. package/node_modules/@lorenz/tracker-sdk/dist/module.d.ts.map +1 -0
  227. package/node_modules/@lorenz/tracker-sdk/dist/module.js +38 -0
  228. package/node_modules/@lorenz/tracker-sdk/dist/module.js.map +1 -0
  229. package/node_modules/@lorenz/worker-host-pool/dist/index.d.ts +34 -6
  230. package/node_modules/@lorenz/worker-host-pool/dist/index.d.ts.map +1 -1
  231. package/node_modules/@lorenz/worker-host-pool/dist/index.js +110 -143
  232. package/node_modules/@lorenz/worker-host-pool/dist/index.js.map +1 -1
  233. package/node_modules/@lorenz/worker-sdk/dist/index.d.ts +1 -0
  234. package/node_modules/@lorenz/worker-sdk/dist/index.d.ts.map +1 -1
  235. package/node_modules/@lorenz/worker-sdk/dist/index.js +1 -0
  236. package/node_modules/@lorenz/worker-sdk/dist/index.js.map +1 -1
  237. package/node_modules/@lorenz/worker-sdk/dist/local.d.ts +74 -0
  238. package/node_modules/@lorenz/worker-sdk/dist/local.d.ts.map +1 -0
  239. package/node_modules/@lorenz/worker-sdk/dist/local.js +112 -0
  240. package/node_modules/@lorenz/worker-sdk/dist/local.js.map +1 -0
  241. package/node_modules/@lorenz/worker-sdk/dist/module.d.ts +8 -16
  242. package/node_modules/@lorenz/worker-sdk/dist/module.d.ts.map +1 -1
  243. package/node_modules/@lorenz/worker-sdk/dist/module.js +15 -35
  244. package/node_modules/@lorenz/worker-sdk/dist/module.js.map +1 -1
  245. package/node_modules/@lorenz/workflow/dist/index.d.ts +11 -0
  246. package/node_modules/@lorenz/workflow/dist/index.d.ts.map +1 -1
  247. package/node_modules/@lorenz/workflow/dist/index.js +3 -0
  248. package/node_modules/@lorenz/workflow/dist/index.js.map +1 -1
  249. package/package.json +4 -1
@@ -0,0 +1,137 @@
1
+ import { z } from "zod";
2
+ import { coercedBoolean, coercedFloat, coercedInt } from "./coerce.js";
3
+ import { getDefaultFlags } from "./default.js";
4
+ import { flagValueErrorMessage } from "./errors.js";
5
+ function refinedNumber(base, config) {
6
+ if (!config.refine)
7
+ return base;
8
+ const refine = config.refine;
9
+ return base.refine(refine, { message: config.refineMessage ?? "is invalid" });
10
+ }
11
+ /** Builders for the five flag kinds. Each returns a {@link FlagDef} whose schema output is the
12
+ * flag's value type; numeric and boolean schemas coerce string inputs from env/CLI/file. */
13
+ export const flag = {
14
+ string(config) {
15
+ return {
16
+ kind: "string",
17
+ schema: z.string(),
18
+ default: config.default,
19
+ description: config.description,
20
+ deprecation: config.deprecation,
21
+ envName: config.envName,
22
+ };
23
+ },
24
+ int(config) {
25
+ return {
26
+ kind: "int",
27
+ schema: refinedNumber(coercedInt, config),
28
+ default: config.default,
29
+ description: config.description,
30
+ deprecation: config.deprecation,
31
+ envName: config.envName,
32
+ };
33
+ },
34
+ float(config) {
35
+ return {
36
+ kind: "float",
37
+ schema: refinedNumber(coercedFloat, config),
38
+ default: config.default,
39
+ description: config.description,
40
+ deprecation: config.deprecation,
41
+ envName: config.envName,
42
+ };
43
+ },
44
+ bool(config) {
45
+ return {
46
+ kind: "bool",
47
+ schema: coercedBoolean,
48
+ default: config.default,
49
+ description: config.description,
50
+ deprecation: config.deprecation,
51
+ envName: config.envName,
52
+ };
53
+ },
54
+ enum(config) {
55
+ // The return type is inferred from the actual `z.enum(values)` call, so `FlagValue<thisDef>`
56
+ // narrows to the exact literal union rather than a hand-asserted type.
57
+ const schema = z.enum(config.values);
58
+ return {
59
+ kind: "enum",
60
+ schema,
61
+ default: config.default,
62
+ description: config.description,
63
+ deprecation: config.deprecation,
64
+ values: config.values,
65
+ envName: config.envName,
66
+ };
67
+ },
68
+ };
69
+ export function feature(config) {
70
+ return config;
71
+ }
72
+ // Keys are lower_snake_case dotted segments only, which keeps the env-var transform lossless. The
73
+ // rule is enforced at module load so a stray camelCase key fails fast in CI, not at daemon start.
74
+ const SNAKE_KEY = /^[a-z0-9]+(?:_[a-z0-9]+)*(?:\.[a-z0-9]+(?:_[a-z0-9]+)*)*$/;
75
+ function assertSnakeKeys(keys, what) {
76
+ for (const key of keys) {
77
+ if (!SNAKE_KEY.test(key)) {
78
+ throw new Error(`@lorenz/flags: ${what} key \`${key}\` must be lower_snake_case dotted ` +
79
+ `(e.g. scheduler.batch_size); camelCase is not allowed.`);
80
+ }
81
+ }
82
+ }
83
+ export function defineFlags(flags) {
84
+ assertSnakeKeys(Object.keys(flags), "flag");
85
+ return flags;
86
+ }
87
+ export function defineFeatures(_flags, features) {
88
+ assertSnakeKeys(Object.keys(features), "feature");
89
+ return features;
90
+ }
91
+ /** Scalar-only value set, so reference identity via `Object.is` is correct and obvious. */
92
+ export function presetValueEqual(a, b) {
93
+ return Object.is(a, b);
94
+ }
95
+ /**
96
+ * Validate a manifest once at module load: every flag default parses, and every preset references a
97
+ * known flag with a valid value. Two features presetting the same flag to differing values is
98
+ * intentionally allowed (legal for mutually-exclusive features); that conflict is authoritative only
99
+ * over the actually-enabled set at resolve time.
100
+ */
101
+ export function validateManifest(manifest) {
102
+ const errors = [];
103
+ for (const [key, def] of Object.entries(manifest.flags)) {
104
+ const result = def.schema.safeParse(def.default);
105
+ if (!result.success) {
106
+ errors.push(`flag \`${key}\` default is invalid: ${flagValueErrorMessage(result.error, def)}`);
107
+ }
108
+ }
109
+ for (const [featureName, featureDef] of Object.entries(manifest.features)) {
110
+ for (const [flagKey, value] of Object.entries(featureDef.preset)) {
111
+ const flagDef = manifest.flags[flagKey];
112
+ if (!flagDef) {
113
+ errors.push(`feature \`${featureName}\` presets unknown flag \`${flagKey}\``);
114
+ continue;
115
+ }
116
+ const result = flagDef.schema.safeParse(value);
117
+ if (!result.success) {
118
+ errors.push(`feature \`${featureName}\` presets \`${flagKey}\` to an invalid value: ${flagValueErrorMessage(result.error, flagDef)}`);
119
+ }
120
+ }
121
+ }
122
+ if (errors.length > 0) {
123
+ throw new Error(`@lorenz/flags manifest is invalid:\n - ${errors.join("\n - ")}`);
124
+ }
125
+ }
126
+ /**
127
+ * Bind a manifest to typed ambient accessors. Called once by the manifest-owning module; the rest
128
+ * of the engine imports the returned `getFlags`/`flag`, so ambient reads are as well-typed as the
129
+ * manifest. The cast is sound because the composition root installs a snapshot built from the same
130
+ * manifest, and it is contained to this one factory.
131
+ */
132
+ export function bindFlags(_manifest) {
133
+ return {
134
+ getFlags: () => getDefaultFlags(),
135
+ };
136
+ }
137
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAiCpD,SAAS,aAAa,CACpB,IAAwC,EACxC,MAAwB;IAExB,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,aAAa,IAAI,YAAY,EAAE,CAAC,CAAC;AAChF,CAAC;AAED;6FAC6F;AAC7F,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,MAAM,CAAC,MAAwB;QAC7B,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;YAClB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IACD,GAAG,CAAC,MAAwB;QAC1B,OAAO;YACL,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC;YACzC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,MAAwB;QAC5B,OAAO;YACL,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC;YAC3C,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAsB;QACzB,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC;IACD,IAAI,CAAiD,MAAyB;QAC5E,6FAA6F;QAC7F,uEAAuE;QACvE,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,MAAM;YACN,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;SACS,CAAC;IACrC,CAAC;CACO,CAAC;AAEX,MAAM,UAAU,OAAO,CAA+C,MAMrE;IACC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kGAAkG;AAClG,kGAAkG;AAClG,MAAM,SAAS,GAAG,2DAA2D,CAAC;AAE9E,SAAS,eAAe,CAAC,IAAuB,EAAE,IAAY;IAC5D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,kBAAkB,IAAI,UAAU,GAAG,qCAAqC;gBACtE,wDAAwD,CAC3D,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAA0B,KAAQ;IAC3D,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,MAAS,EACT,QAAkB;IAElB,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;IAClD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,gBAAgB,CAAC,CAAU,EAAE,CAAU;IACrD,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAsB;IACrD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CACT,UAAU,GAAG,0BAA0B,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAClF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1E,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,aAAa,WAAW,6BAA6B,OAAO,IAAI,CAAC,CAAC;gBAC9E,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CACT,aAAa,WAAW,gBAAgB,OAAO,2BAA2B,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CACzH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,2CAA2C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAOD;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CACvB,SAAoC;IAEpC,OAAO;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,eAAe,EAAgC;KAChE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { FeatureDef, FlagManifest, FlagMap, FlagsSnapshot, RawLayers, ResolveOptions } from "./types.js";
2
+ /**
3
+ * Fold the CLI, file, and env layers, plus enabled-feature presets and manifest defaults, into one
4
+ * frozen snapshot. All problems aggregate into a single thrown error (collect-all). Deprecation
5
+ * warnings are staged during resolution and committed only on success.
6
+ */
7
+ export declare function resolveFlags<F extends FlagMap, Features extends Record<string, FeatureDef>>(manifest: FlagManifest<F, Features>, layers: RawLayers, options?: ResolveOptions): FlagsSnapshot<F, Features>;
8
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,UAAU,EAIV,YAAY,EACZ,OAAO,EACP,aAAa,EAEb,SAAS,EACT,cAAc,EACf,MAAM,YAAY,CAAC;AAWpB;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,OAAO,EAAE,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACzF,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,EACnC,MAAM,EAAE,SAAS,EACjB,OAAO,GAAE,cAAmB,GAC3B,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,CAoG5B"}
@@ -0,0 +1,178 @@
1
+ import { parseBoolToken } from "./coerce.js";
2
+ import { collectFlagDeprecations, commitFlagDeprecations, stderrFlagWarn } from "./deprecations.js";
3
+ import { FlagIssueCollector, flagValueErrorMessage } from "./errors.js";
4
+ import { presetValueEqual } from "./manifest.js";
5
+ /**
6
+ * Fold the CLI, file, and env layers, plus enabled-feature presets and manifest defaults, into one
7
+ * frozen snapshot. All problems aggregate into a single thrown error (collect-all). Deprecation
8
+ * warnings are staged during resolution and committed only on success.
9
+ */
10
+ export function resolveFlags(manifest, layers, options = {}) {
11
+ const issues = new FlagIssueCollector();
12
+ for (const layer of [layers.cli, layers.file, layers.env]) {
13
+ if (layer.issues)
14
+ issues.addAll(layer.issues);
15
+ }
16
+ // Per-layer last-wins maps of explicit flag inputs (parsers guarantee known keys).
17
+ const cliFlags = lastWins(layers.cli.flags);
18
+ const fileFlags = lastWins(layers.file.flags);
19
+ const envFlags = lastWins(layers.env.flags);
20
+ const explicitFlagKeys = new Set([
21
+ ...cliFlags.keys(),
22
+ ...fileFlags.keys(),
23
+ ...envFlags.keys(),
24
+ ]);
25
+ // Feature enablement: the highest layer that mentions the feature wins; otherwise its default.
26
+ const enabled = new Map();
27
+ for (const [name, def] of Object.entries(manifest.features)) {
28
+ const chosen = featureInLayer(layers.cli.features, name) ??
29
+ featureInLayer(layers.file.features, name) ??
30
+ featureInLayer(layers.env.features, name);
31
+ enabled.set(name, chosen ? chosen.enabled : def.default);
32
+ }
33
+ // Preset composition over enabled features only, skipping any explicitly-set flag (an explicit
34
+ // setting both overrides and defuses a would-be conflict). Differing values from two enabled
35
+ // features that both reach this point is a hard, deterministic error.
36
+ const presetValue = new Map();
37
+ const presetOwner = new Map();
38
+ const conflicts = new Set();
39
+ for (const [featureName, featureDef] of Object.entries(manifest.features)) {
40
+ if (!enabled.get(featureName))
41
+ continue;
42
+ for (const [flagKey, value] of Object.entries(featureDef.preset)) {
43
+ if (explicitFlagKeys.has(flagKey))
44
+ continue;
45
+ if (presetValue.has(flagKey)) {
46
+ const existing = presetValue.get(flagKey);
47
+ if (!presetValueEqual(existing, value) && !conflicts.has(flagKey)) {
48
+ conflicts.add(flagKey);
49
+ issues.add({
50
+ kind: "preset_conflict",
51
+ message: `feature preset conflict on flag \`${flagKey}\`: feature \`${presetOwner.get(flagKey) ?? "?"}\` ` +
52
+ `sets it to ${display(existing)} but feature \`${featureName}\` sets it to ${display(value)}. ` +
53
+ `Enable only one, or set \`${flagKey}\` explicitly to override both.`,
54
+ });
55
+ }
56
+ continue;
57
+ }
58
+ presetValue.set(flagKey, value);
59
+ presetOwner.set(flagKey, featureName);
60
+ }
61
+ }
62
+ // Flag value resolution: highest explicit layer -> enabled-feature preset -> manifest default.
63
+ const resolved = new Map();
64
+ for (const [key, def] of Object.entries(manifest.flags)) {
65
+ const explicit = cliFlags.get(key) ?? fileFlags.get(key) ?? envFlags.get(key);
66
+ if (explicit) {
67
+ const outcome = parseFlagValue(def, explicit.rawValue);
68
+ if (outcome.ok)
69
+ resolved.set(key, { value: outcome.value, source: explicit.source });
70
+ else
71
+ issues.add({
72
+ kind: "invalid_value",
73
+ message: `invalid value for ${explicit.origin}: ${outcome.message}`,
74
+ });
75
+ continue;
76
+ }
77
+ if (presetValue.has(key) && !conflicts.has(key)) {
78
+ // Preset values were validated at manifest load; re-validate defensively against the schema.
79
+ const outcome = parseFlagValue(def, presetValue.get(key));
80
+ if (outcome.ok)
81
+ resolved.set(key, { value: outcome.value, source: "feature" });
82
+ else
83
+ issues.add({
84
+ kind: "invalid_value",
85
+ message: `feature preset for flag \`${key}\` is invalid: ${outcome.message}`,
86
+ });
87
+ continue;
88
+ }
89
+ resolved.set(key, { value: def.default, source: "default" });
90
+ }
91
+ // Stage deprecation warnings for explicitly-set keys that resolved successfully. A deprecated flag
92
+ // set to an invalid value is absent from `resolved`, so it neither warns nor consumes a slot.
93
+ const explicitDeprecationKeys = [];
94
+ for (const key of explicitFlagKeys) {
95
+ if (resolved.get(key)?.source !== "default" && resolved.has(key)) {
96
+ explicitDeprecationKeys.push({ key, isFeature: false });
97
+ }
98
+ }
99
+ for (const name of explicitlyMentionedFeatures(layers)) {
100
+ explicitDeprecationKeys.push({ key: name, isFeature: true });
101
+ }
102
+ const staged = collectFlagDeprecations(explicitDeprecationKeys, manifest);
103
+ issues.throwIfAny();
104
+ commitFlagDeprecations(staged, options.warn ?? stderrFlagWarn);
105
+ return buildSnapshot(resolved, enabled);
106
+ }
107
+ function parseFlagValue(def, raw) {
108
+ // Boolean tokens are normalized (case-insensitive) before the schema sees them, so env/CLI/file
109
+ // booleans behave identically.
110
+ let input = raw;
111
+ if (def.kind === "bool") {
112
+ const parsed = parseBoolToken(raw);
113
+ if (parsed === undefined)
114
+ return { ok: false, message: "must be true or false" };
115
+ input = parsed;
116
+ }
117
+ const result = def.schema.safeParse(input);
118
+ if (result.success)
119
+ return { ok: true, value: result.data };
120
+ return { ok: false, message: flagValueErrorMessage(result.error, def) };
121
+ }
122
+ function buildSnapshot(resolved, enabled) {
123
+ const values = {};
124
+ const sources = new Map();
125
+ for (const [key, entry] of resolved) {
126
+ values[key] = entry.value;
127
+ sources.set(key, entry.source);
128
+ }
129
+ Object.freeze(values);
130
+ const snapshot = {
131
+ get: (key) => {
132
+ const name = key;
133
+ if (!Object.prototype.hasOwnProperty.call(values, name)) {
134
+ throw new Error(`unknown flag \`${name}\``);
135
+ }
136
+ return values[name];
137
+ },
138
+ feature: (key) => {
139
+ const value = enabled.get(key);
140
+ if (value === undefined)
141
+ throw new Error(`unknown feature \`${String(key)}\``);
142
+ return value;
143
+ },
144
+ values: values,
145
+ source: (key) => {
146
+ const value = sources.get(key);
147
+ if (value === undefined)
148
+ throw new Error(`unknown flag \`${String(key)}\``);
149
+ return value;
150
+ },
151
+ };
152
+ return Object.freeze(snapshot);
153
+ }
154
+ function lastWins(inputs) {
155
+ const map = new Map();
156
+ for (const input of inputs)
157
+ map.set(input.key, input);
158
+ return map;
159
+ }
160
+ function featureInLayer(inputs, name) {
161
+ let found;
162
+ for (const input of inputs)
163
+ if (input.name === name)
164
+ found = input;
165
+ return found;
166
+ }
167
+ function explicitlyMentionedFeatures(layers) {
168
+ const names = new Set();
169
+ for (const layer of [layers.cli, layers.file, layers.env]) {
170
+ for (const input of layer.features)
171
+ names.add(input.name);
172
+ }
173
+ return names;
174
+ }
175
+ function display(value) {
176
+ return typeof value === "string" ? JSON.stringify(value) : String(value);
177
+ }
178
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { FeatureDef, FlagManifest, FlagMap, FlagOverrides, FlagsSnapshot } from "./types.js";
2
+ /**
3
+ * Build a frozen snapshot from manifest defaults + feature presets + typed overrides, with no
4
+ * env/CLI/file scanning. Overrides enter at the explicit (CLI) band, so an explicit override beats
5
+ * an enabled feature preset exactly as in production. Routing through the real {@link resolveFlags}
6
+ * keeps a single precedence implementation. Deprecation warnings are suppressed (no-op `warn`).
7
+ */
8
+ export declare function buildTestFlags<F extends FlagMap, Features extends Record<string, FeatureDef>>(manifest: FlagManifest<F, Features>, overrides?: FlagOverrides<F, Features>): FlagsSnapshot<F, Features>;
9
+ /** Build a snapshot from overrides and install it as the default. Returns the snapshot. */
10
+ export declare function setFlagsForTesting<F extends FlagMap, Features extends Record<string, FeatureDef>>(manifest: FlagManifest<F, Features>, overrides?: FlagOverrides<F, Features>): FlagsSnapshot<F, Features>;
11
+ /**
12
+ * Run `fn` with a fresh snapshot installed as the default, restoring the prior install afterward
13
+ * (even on throw). Synchronous only: a module-level save/restore is not safe across `await` points
14
+ * if two scopes interleave.
15
+ */
16
+ export declare function withFlags<F extends FlagMap, Features extends Record<string, FeatureDef>, T>(manifest: FlagManifest<F, Features>, overrides: FlagOverrides<F, Features>, fn: () => T): T;
17
+ /** Clear the installed snapshot and re-arm once-per-process deprecation warnings. */
18
+ export declare function resetFlags(): void;
19
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EAGV,YAAY,EACZ,OAAO,EACP,aAAa,EACb,aAAa,EAEd,MAAM,YAAY,CAAC;AAQpB;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,OAAO,EAAE,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EAC3F,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,EACnC,SAAS,GAAE,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAM,GACzC,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,CAe5B;AAED,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,OAAO,EAAE,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EAC/F,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,EACnC,SAAS,GAAE,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAM,GACzC,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,CAI5B;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,OAAO,EAAE,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,EACzF,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,EACnC,SAAS,EAAE,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,EACrC,EAAE,EAAE,MAAM,CAAC,GACV,CAAC,CAkBH;AAUD,qFAAqF;AACrF,wBAAgB,UAAU,IAAI,IAAI,CAGjC"}
@@ -0,0 +1,68 @@
1
+ import { clearDefaultFlags, getDefaultFlags, hasDefaultFlags, setDefaultFlags } from "./default.js";
2
+ import { resetFlagDeprecationWarnings } from "./deprecations.js";
3
+ import { resolveFlags } from "./resolve.js";
4
+ // Test seams (subpath export `@lorenz/flags/testing`), kept out of the production entry point.
5
+ function emptyLayer() {
6
+ return { flags: [], features: [] };
7
+ }
8
+ /**
9
+ * Build a frozen snapshot from manifest defaults + feature presets + typed overrides, with no
10
+ * env/CLI/file scanning. Overrides enter at the explicit (CLI) band, so an explicit override beats
11
+ * an enabled feature preset exactly as in production. Routing through the real {@link resolveFlags}
12
+ * keeps a single precedence implementation. Deprecation warnings are suppressed (no-op `warn`).
13
+ */
14
+ export function buildTestFlags(manifest, overrides = {}) {
15
+ const flags = [];
16
+ const features = [];
17
+ for (const [key, value] of Object.entries(overrides.flags ?? {})) {
18
+ flags.push({ source: "cli", key, rawValue: value, origin: `test override flags.${key}` });
19
+ }
20
+ for (const [name, enabled] of Object.entries(overrides.features ?? {})) {
21
+ if (enabled === undefined)
22
+ continue;
23
+ features.push({ source: "cli", name, enabled, origin: `test override features.${name}` });
24
+ }
25
+ return resolveFlags(manifest, { cli: { flags, features }, file: emptyLayer(), env: emptyLayer() }, { warn: () => { } });
26
+ }
27
+ /** Build a snapshot from overrides and install it as the default. Returns the snapshot. */
28
+ export function setFlagsForTesting(manifest, overrides = {}) {
29
+ const snapshot = buildTestFlags(manifest, overrides);
30
+ setDefaultFlags(snapshot);
31
+ return snapshot;
32
+ }
33
+ /**
34
+ * Run `fn` with a fresh snapshot installed as the default, restoring the prior install afterward
35
+ * (even on throw). Synchronous only: a module-level save/restore is not safe across `await` points
36
+ * if two scopes interleave.
37
+ */
38
+ export function withFlags(manifest, overrides, fn) {
39
+ const previous = hasDefaultFlags() ? getDefaultFlags() : undefined;
40
+ setDefaultFlags(buildTestFlags(manifest, overrides));
41
+ try {
42
+ const result = fn();
43
+ if (isThenable(result)) {
44
+ // An async body would read flags after `finally` has already restored the prior snapshot, so
45
+ // its post-await reads would silently see the wrong flags. Fail loudly instead.
46
+ throw new Error("withFlags requires a synchronous callback; it returned a thenable. Use " +
47
+ "setFlagsForTesting()/resetFlags() to scope flags across awaits.");
48
+ }
49
+ return result;
50
+ }
51
+ finally {
52
+ if (previous)
53
+ setDefaultFlags(previous);
54
+ else
55
+ clearDefaultFlags();
56
+ }
57
+ }
58
+ function isThenable(value) {
59
+ return ((typeof value === "object" || typeof value === "function") &&
60
+ value !== null &&
61
+ typeof value.then === "function");
62
+ }
63
+ /** Clear the installed snapshot and re-arm once-per-process deprecation warnings. */
64
+ export function resetFlags() {
65
+ clearDefaultFlags();
66
+ resetFlagDeprecationWarnings();
67
+ }
68
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import type { z } from "zod";
2
+ /** Per-key deprecation marker. `detail` adds optional guidance to the warning. */
3
+ export interface FlagDeprecation {
4
+ readonly detail?: string | undefined;
5
+ }
6
+ export type FlagKind = "string" | "int" | "float" | "bool" | "enum";
7
+ /** A single flag declaration. `schema`'s output is the flag's value type; `default` is that type. */
8
+ export interface FlagDef<Schema extends z.ZodType = z.ZodType> {
9
+ readonly kind: FlagKind;
10
+ readonly schema: Schema;
11
+ readonly default: z.output<Schema>;
12
+ readonly description: string;
13
+ readonly deprecation?: FlagDeprecation | undefined;
14
+ /** enum only: the allowed values, surfaced in error/help text. */
15
+ readonly values?: readonly string[] | undefined;
16
+ /** Optional explicit env var name (including the `LORENZ_FLAG_`/`LORENZ_FEATURE_` prefix). */
17
+ readonly envName?: string | undefined;
18
+ }
19
+ /** A feature: a named boolean whose enablement applies a preset of flag default-overrides. */
20
+ export interface FeatureDef<Preset extends Record<string, unknown> = Record<string, unknown>> {
21
+ readonly default: boolean;
22
+ readonly description: string;
23
+ readonly preset: Preset;
24
+ readonly deprecation?: FlagDeprecation | undefined;
25
+ readonly envName?: string | undefined;
26
+ }
27
+ export type FlagMap = Record<string, FlagDef>;
28
+ export type FlagValue<D extends FlagDef> = D extends FlagDef<infer S> ? z.output<S> : never;
29
+ export type FlagKeyOf<F extends FlagMap> = keyof F & string;
30
+ export type FlagValuesOf<F extends FlagMap> = {
31
+ [K in keyof F]: FlagValue<F[K]>;
32
+ };
33
+ export type PresetFor<F extends FlagMap> = Partial<FlagValuesOf<F>>;
34
+ export type FeatureMapFor<F extends FlagMap> = Record<string, FeatureDef<PresetFor<F>>>;
35
+ export type FeatureKeyOf<Features extends Record<string, FeatureDef>> = keyof Features & string;
36
+ export interface FlagManifest<F extends FlagMap = FlagMap, Features extends Record<string, FeatureDef> = Record<string, FeatureDef>> {
37
+ readonly flags: F;
38
+ readonly features: Features;
39
+ }
40
+ /** Where a resolved value came from. `feature` means an enabled feature's preset supplied it. */
41
+ export type LayerSource = "cli" | "file" | "env" | "feature" | "default";
42
+ export interface FlagInput {
43
+ readonly source: LayerSource;
44
+ readonly key: string;
45
+ readonly rawValue: unknown;
46
+ /** Human-facing label of where this came from, e.g. `--flag x=1` or `LORENZ_FLAG_X`. */
47
+ readonly origin: string;
48
+ }
49
+ export interface FeatureInput {
50
+ readonly source: LayerSource;
51
+ readonly name: string;
52
+ readonly enabled: boolean;
53
+ readonly origin: string;
54
+ }
55
+ export type FlagIssueKind = "unknown_flag" | "unknown_feature" | "invalid_value" | "preset_conflict";
56
+ export interface FlagIssue {
57
+ readonly kind: FlagIssueKind;
58
+ readonly message: string;
59
+ }
60
+ export interface RawLayer {
61
+ readonly flags: readonly FlagInput[];
62
+ readonly features: readonly FeatureInput[];
63
+ /** Problems a parser detected but deferred to the resolver's collect-all aggregation. */
64
+ readonly issues?: readonly FlagIssue[] | undefined;
65
+ }
66
+ /** The three explicit layers, in HIGH-to-LOW precedence order. */
67
+ export interface RawLayers {
68
+ readonly cli: RawLayer;
69
+ readonly file: RawLayer;
70
+ readonly env: RawLayer;
71
+ }
72
+ export interface ResolveOptions {
73
+ /** Sink for once-per-process deprecation warnings. Defaults to a stderr `warning:` writer. */
74
+ readonly warn?: ((message: string) => void) | undefined;
75
+ }
76
+ /** A fully-resolved, immutable view. Values are already coerced and validated. */
77
+ export interface FlagsSnapshot<F extends FlagMap = FlagMap, Features extends Record<string, FeatureDef> = Record<string, FeatureDef>> {
78
+ /** Typed flag read; the return type is exactly this key's value type. */
79
+ get<K extends FlagKeyOf<F>>(key: K): FlagValue<F[K]>;
80
+ /** Effective feature state after all layers. */
81
+ feature(key: FeatureKeyOf<Features>): boolean;
82
+ /** Frozen value map, for snapshotting into logs/traces. */
83
+ readonly values: Readonly<{
84
+ [K in keyof F]: FlagValue<F[K]>;
85
+ }>;
86
+ /** Per-flag provenance, for diagnostics (e.g. "timeout_ms came from cli"). */
87
+ source(key: FlagKeyOf<F>): LayerSource;
88
+ }
89
+ export interface FlagOverrides<F extends FlagMap, Features extends Record<string, FeatureDef>> {
90
+ flags?: Partial<FlagValuesOf<F>> | undefined;
91
+ features?: Partial<Record<FeatureKeyOf<Features>, boolean>> | undefined;
92
+ }
93
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAM7B,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpE,qGAAqG;AACrG,MAAM,WAAW,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO;IAC3D,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACnD,kEAAkE;IAClE,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAChD,8FAA8F;IAC9F,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,8FAA8F;AAC9F,MAAM,WAAW,UAAU,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1F,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAC5F,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,OAAO,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC;AAC5D,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,OAAO,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC;AAClF,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxF,MAAM,MAAM,YAAY,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,MAAM,QAAQ,GAAG,MAAM,CAAC;AAEhG,MAAM,WAAW,YAAY,CAC3B,CAAC,SAAS,OAAO,GAAG,OAAO,EAC3B,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC;IAExE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,iGAAiG;AACjG,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;AAEzE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,wFAAwF;IACxF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,aAAa,GACrB,cAAc,GACd,iBAAiB,GACjB,eAAe,GACf,iBAAiB,CAAC;AAEtB,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,yFAAyF;IACzF,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAAC;CACpD;AAED,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,8FAA8F;IAC9F,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACzD;AAED,kFAAkF;AAClF,MAAM,WAAW,aAAa,CAC5B,CAAC,SAAS,OAAO,GAAG,OAAO,EAC3B,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC;IAExE,yEAAyE;IACzE,GAAG,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,gDAAgD;IAChD,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;IAC9C,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC,CAAC;IAC/D,8EAA8E;IAC9E,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;CACxC;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,OAAO,EAAE,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC;IAC3F,KAAK,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CACzE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "@lorenz/flags",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": "./dist/index.js",
10
+ "./testing": "./dist/testing.js"
11
+ },
12
+ "dependencies": {
13
+ "@lorenz/domain": "0.1.1",
14
+ "zod": "^4.4.3"
15
+ }
16
+ }
@@ -1,9 +1,20 @@
1
1
  import { type Settings, type TrackerKind } from "@lorenz/domain";
2
2
  import type { McpServer } from "@agentclientprotocol/sdk";
3
+ import { type IsRunLive } from "./server.js";
3
4
  export declare function trackerMcpServerName(kind: TrackerKind | undefined): string;
4
5
  export interface AgentMcpEndpointLease {
5
6
  url: string;
6
7
  token: string;
8
+ /**
9
+ * Generation of the shared local MCP server this lease (and its Token B claim)
10
+ * was minted against, captured BEFORE the per-run tunnel was opened. The
11
+ * composition root carries it onto the live `RunSlot` so the injected
12
+ * `isRunLive(runKey, workerHost, generation)` re-check denies a token whose
13
+ * generation no longer matches the live slot - the generation backstop for the
14
+ * liveness re-check's own async window. `1` on the local/null path (no shared
15
+ * server is recycled in place there).
16
+ */
17
+ generation: number;
7
18
  acpServer(): McpServer;
8
19
  release(): Promise<void>;
9
20
  }
@@ -16,8 +27,10 @@ interface RemoteMcpTunnel {
16
27
  * composition side passes its pool (e.g. the SSH worker-host pool); this package never
17
28
  * reaches into transport infrastructure itself. The whole-endpoint path uses the
18
29
  * stateless {@link acquireRemoteMcpTunnel}/{@link releaseRemoteMcpTunnel} pair; the
19
- * per-run path keys a tunnel by `(workerHost, runKey)` via {@link openForRun}/{@link
20
- * closeForRun} so co-resident runs on one machine each get an isolated tunnel.
30
+ * per-run path takes a per-run HOLD on the SHARED per-host tunnel via {@link
31
+ * openForRun}/{@link closeForRun} (one `ssh -R` per worker host, refcounted across
32
+ * co-resident runs). Co-resident runs are kept apart by their per-run Token B claim,
33
+ * NOT by a distinct tunnel/remote port.
21
34
  */
22
35
  export interface RemoteMcpTunnelTransport {
23
36
  acquireRemoteMcpTunnel(workerHost: string, localHost: string, localPort: number): Promise<RemoteMcpTunnel>;
@@ -26,6 +39,6 @@ export interface RemoteMcpTunnelTransport {
26
39
  closeForRun(workerHost: string, runKey: string): void;
27
40
  }
28
41
  export declare function acquireAgentMcpEndpoint(settings: Settings, workerHost?: string | null, tunnels?: RemoteMcpTunnelTransport): Promise<AgentMcpEndpointLease>;
29
- export declare function acquireAgentMcpEndpointForRun(settings: Settings, workerHost: string, runKey: string, tunnels: RemoteMcpTunnelTransport): Promise<AgentMcpEndpointLease>;
42
+ export declare function acquireAgentMcpEndpointForRun(settings: Settings, workerHost: string, runKey: string, tunnels: RemoteMcpTunnelTransport, isRunLive?: IsRunLive): Promise<AgentMcpEndpointLease>;
30
43
  export {};
31
44
  //# sourceMappingURL=agentEndpoint.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agentEndpoint.d.ts","sourceRoot":"","sources":["../src/agentEndpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAK1D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAE1E;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,IAAI,SAAS,CAAC;IACvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,yEAAyE;AACzE,UAAU,eAAe;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,wBAAwB;IACvC,sBAAsB,CACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5B,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IACtD,UAAU,CACR,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5B,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvD;AA8BD,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,QAAQ,EAClB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,qBAAqB,CAAC,CAyChC;AAED,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAsChC"}
1
+ {"version":3,"file":"agentEndpoint.d.ts","sourceRoot":"","sources":["../src/agentEndpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EAAkB,KAAK,SAAS,EAAkC,MAAM,aAAa,CAAC;AAU7F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAE1E;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;OAQG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,IAAI,SAAS,CAAC;IACvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,yEAAyE;AACzE,UAAU,eAAe;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,wBAAwB;IACvC,sBAAsB,CACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5B,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IACtD,UAAU,CACR,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5B,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvD;AAgED,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,QAAQ,EAClB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,qBAAqB,CAAC,CA0ChC;AAED,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,wBAAwB,EACjC,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CAAC,qBAAqB,CAAC,CAwDhC"}