@geotechcli/core 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/dist/agents/brain.d.ts +39 -0
  2. package/dist/agents/brain.d.ts.map +1 -0
  3. package/dist/agents/brain.js +339 -0
  4. package/dist/agents/brain.js.map +1 -0
  5. package/dist/agents/bridge-tools.d.ts +2 -0
  6. package/dist/agents/bridge-tools.d.ts.map +1 -0
  7. package/dist/agents/bridge-tools.js +170 -0
  8. package/dist/agents/bridge-tools.js.map +1 -0
  9. package/dist/agents/data-tools.d.ts +2 -0
  10. package/dist/agents/data-tools.d.ts.map +1 -0
  11. package/dist/agents/data-tools.js +309 -0
  12. package/dist/agents/data-tools.js.map +1 -0
  13. package/dist/agents/filesystem-tools.d.ts +2 -0
  14. package/dist/agents/filesystem-tools.d.ts.map +1 -0
  15. package/dist/agents/filesystem-tools.js +267 -0
  16. package/dist/agents/filesystem-tools.js.map +1 -0
  17. package/dist/agents/guardrails.d.ts +17 -0
  18. package/dist/agents/guardrails.d.ts.map +1 -0
  19. package/dist/agents/guardrails.js +260 -0
  20. package/dist/agents/guardrails.js.map +1 -0
  21. package/dist/agents/orchestrator.d.ts +9 -0
  22. package/dist/agents/orchestrator.d.ts.map +1 -0
  23. package/dist/agents/orchestrator.js +136 -0
  24. package/dist/agents/orchestrator.js.map +1 -0
  25. package/dist/agents/safety.d.ts +9 -0
  26. package/dist/agents/safety.d.ts.map +1 -0
  27. package/dist/agents/safety.js +40 -0
  28. package/dist/agents/safety.js.map +1 -0
  29. package/dist/agents/sandbox.d.ts +34 -0
  30. package/dist/agents/sandbox.d.ts.map +1 -0
  31. package/dist/agents/sandbox.js +235 -0
  32. package/dist/agents/sandbox.js.map +1 -0
  33. package/dist/agents/swarm.d.ts +25 -0
  34. package/dist/agents/swarm.d.ts.map +1 -0
  35. package/dist/agents/swarm.js +434 -0
  36. package/dist/agents/swarm.js.map +1 -0
  37. package/dist/agents/tools.d.ts +37 -0
  38. package/dist/agents/tools.d.ts.map +1 -0
  39. package/dist/agents/tools.js +451 -0
  40. package/dist/agents/tools.js.map +1 -0
  41. package/dist/bridge/index.d.ts +52 -0
  42. package/dist/bridge/index.d.ts.map +1 -0
  43. package/dist/bridge/index.js +195 -0
  44. package/dist/bridge/index.js.map +1 -0
  45. package/dist/config/index.d.ts +106 -0
  46. package/dist/config/index.d.ts.map +1 -0
  47. package/dist/config/index.js +217 -0
  48. package/dist/config/index.js.map +1 -0
  49. package/dist/db/index.d.ts +4 -0
  50. package/dist/db/index.d.ts.map +1 -0
  51. package/dist/db/index.js +4 -0
  52. package/dist/db/index.js.map +1 -0
  53. package/dist/db/redis.d.ts +14 -0
  54. package/dist/db/redis.d.ts.map +1 -0
  55. package/dist/db/redis.js +204 -0
  56. package/dist/db/redis.js.map +1 -0
  57. package/dist/db/supabase.d.ts +57 -0
  58. package/dist/db/supabase.d.ts.map +1 -0
  59. package/dist/db/supabase.js +156 -0
  60. package/dist/db/supabase.js.map +1 -0
  61. package/dist/db/users.d.ts +50 -0
  62. package/dist/db/users.d.ts.map +1 -0
  63. package/dist/db/users.js +132 -0
  64. package/dist/db/users.js.map +1 -0
  65. package/dist/export/index.d.ts +51 -0
  66. package/dist/export/index.d.ts.map +1 -0
  67. package/dist/export/index.js +126 -0
  68. package/dist/export/index.js.map +1 -0
  69. package/dist/geo/bearing-capacity.d.ts +60 -0
  70. package/dist/geo/bearing-capacity.d.ts.map +1 -0
  71. package/dist/geo/bearing-capacity.js +195 -0
  72. package/dist/geo/bearing-capacity.js.map +1 -0
  73. package/dist/geo/classification.d.ts +107 -0
  74. package/dist/geo/classification.d.ts.map +1 -0
  75. package/dist/geo/classification.js +261 -0
  76. package/dist/geo/classification.js.map +1 -0
  77. package/dist/geo/index.d.ts +9 -0
  78. package/dist/geo/index.d.ts.map +1 -0
  79. package/dist/geo/index.js +9 -0
  80. package/dist/geo/index.js.map +1 -0
  81. package/dist/geo/lateral-earth-pressure.d.ts +75 -0
  82. package/dist/geo/lateral-earth-pressure.d.ts.map +1 -0
  83. package/dist/geo/lateral-earth-pressure.js +219 -0
  84. package/dist/geo/lateral-earth-pressure.js.map +1 -0
  85. package/dist/geo/liquefaction.d.ts +65 -0
  86. package/dist/geo/liquefaction.d.ts.map +1 -0
  87. package/dist/geo/liquefaction.js +163 -0
  88. package/dist/geo/liquefaction.js.map +1 -0
  89. package/dist/geo/pile-capacity.d.ts +91 -0
  90. package/dist/geo/pile-capacity.d.ts.map +1 -0
  91. package/dist/geo/pile-capacity.js +233 -0
  92. package/dist/geo/pile-capacity.js.map +1 -0
  93. package/dist/geo/settlement.d.ts +119 -0
  94. package/dist/geo/settlement.d.ts.map +1 -0
  95. package/dist/geo/settlement.js +184 -0
  96. package/dist/geo/settlement.js.map +1 -0
  97. package/dist/geo/slope-stability.d.ts +82 -0
  98. package/dist/geo/slope-stability.d.ts.map +1 -0
  99. package/dist/geo/slope-stability.js +214 -0
  100. package/dist/geo/slope-stability.js.map +1 -0
  101. package/dist/geo/tunnel/index.d.ts +2 -0
  102. package/dist/geo/tunnel/index.d.ts.map +1 -0
  103. package/dist/geo/tunnel/index.js +2 -0
  104. package/dist/geo/tunnel/index.js.map +1 -0
  105. package/dist/geo/tunnel/tbm.d.ts +135 -0
  106. package/dist/geo/tunnel/tbm.d.ts.map +1 -0
  107. package/dist/geo/tunnel/tbm.js +268 -0
  108. package/dist/geo/tunnel/tbm.js.map +1 -0
  109. package/dist/index.d.ts +20 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +33 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/ingest/ags.d.ts +42 -0
  114. package/dist/ingest/ags.d.ts.map +1 -0
  115. package/dist/ingest/ags.js +133 -0
  116. package/dist/ingest/ags.js.map +1 -0
  117. package/dist/ingest/cpt.d.ts +47 -0
  118. package/dist/ingest/cpt.d.ts.map +1 -0
  119. package/dist/ingest/cpt.js +112 -0
  120. package/dist/ingest/cpt.js.map +1 -0
  121. package/dist/ingest/index.d.ts +3 -0
  122. package/dist/ingest/index.d.ts.map +1 -0
  123. package/dist/ingest/index.js +3 -0
  124. package/dist/ingest/index.js.map +1 -0
  125. package/dist/llm/index.d.ts +5 -0
  126. package/dist/llm/index.d.ts.map +1 -0
  127. package/dist/llm/index.js +4 -0
  128. package/dist/llm/index.js.map +1 -0
  129. package/dist/llm/middleware/metering.d.ts +55 -0
  130. package/dist/llm/middleware/metering.d.ts.map +1 -0
  131. package/dist/llm/middleware/metering.js +191 -0
  132. package/dist/llm/middleware/metering.js.map +1 -0
  133. package/dist/llm/middleware/persistent-usage.d.ts +7 -0
  134. package/dist/llm/middleware/persistent-usage.d.ts.map +1 -0
  135. package/dist/llm/middleware/persistent-usage.js +108 -0
  136. package/dist/llm/middleware/persistent-usage.js.map +1 -0
  137. package/dist/llm/middleware/retry.d.ts +7 -0
  138. package/dist/llm/middleware/retry.d.ts.map +1 -0
  139. package/dist/llm/middleware/retry.js +29 -0
  140. package/dist/llm/middleware/retry.js.map +1 -0
  141. package/dist/llm/providers/anthropic.d.ts +10 -0
  142. package/dist/llm/providers/anthropic.d.ts.map +1 -0
  143. package/dist/llm/providers/anthropic.js +107 -0
  144. package/dist/llm/providers/anthropic.js.map +1 -0
  145. package/dist/llm/providers/hosted-beta.d.ts +10 -0
  146. package/dist/llm/providers/hosted-beta.d.ts.map +1 -0
  147. package/dist/llm/providers/hosted-beta.js +106 -0
  148. package/dist/llm/providers/hosted-beta.js.map +1 -0
  149. package/dist/llm/providers/huggingface.d.ts +37 -0
  150. package/dist/llm/providers/huggingface.d.ts.map +1 -0
  151. package/dist/llm/providers/huggingface.js +133 -0
  152. package/dist/llm/providers/huggingface.js.map +1 -0
  153. package/dist/llm/providers/openai-compatible.d.ts +27 -0
  154. package/dist/llm/providers/openai-compatible.d.ts.map +1 -0
  155. package/dist/llm/providers/openai-compatible.js +99 -0
  156. package/dist/llm/providers/openai-compatible.js.map +1 -0
  157. package/dist/llm/providers/zhipu.d.ts +10 -0
  158. package/dist/llm/providers/zhipu.d.ts.map +1 -0
  159. package/dist/llm/providers/zhipu.js +81 -0
  160. package/dist/llm/providers/zhipu.js.map +1 -0
  161. package/dist/llm/router.d.ts +35 -0
  162. package/dist/llm/router.d.ts.map +1 -0
  163. package/dist/llm/router.js +109 -0
  164. package/dist/llm/router.js.map +1 -0
  165. package/dist/llm/types.d.ts +63 -0
  166. package/dist/llm/types.d.ts.map +1 -0
  167. package/dist/llm/types.js +38 -0
  168. package/dist/llm/types.js.map +1 -0
  169. package/dist/meta/index.d.ts +12 -0
  170. package/dist/meta/index.d.ts.map +1 -0
  171. package/dist/meta/index.js +8 -0
  172. package/dist/meta/index.js.map +1 -0
  173. package/dist/meta/metadata.json +46 -0
  174. package/dist/report/index.d.ts +20 -0
  175. package/dist/report/index.d.ts.map +1 -0
  176. package/dist/report/index.js +58 -0
  177. package/dist/report/index.js.map +1 -0
  178. package/dist/standards/index.d.ts +23 -0
  179. package/dist/standards/index.d.ts.map +1 -0
  180. package/dist/standards/index.js +89 -0
  181. package/dist/standards/index.js.map +1 -0
  182. package/dist/storage/index.d.ts +114 -0
  183. package/dist/storage/index.d.ts.map +1 -0
  184. package/dist/storage/index.js +465 -0
  185. package/dist/storage/index.js.map +1 -0
  186. package/dist/vision/index.d.ts +80 -0
  187. package/dist/vision/index.d.ts.map +1 -0
  188. package/dist/vision/index.js +298 -0
  189. package/dist/vision/index.js.map +1 -0
  190. package/dist/vision/parse.d.ts +20 -0
  191. package/dist/vision/parse.d.ts.map +1 -0
  192. package/dist/vision/parse.js +75 -0
  193. package/dist/vision/parse.js.map +1 -0
  194. package/package.json +55 -0
@@ -0,0 +1,195 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Software Bridge — Connect geotechCLI to local geotech software
3
+ // Detects running instances, generates automation scripts, exchanges data
4
+ // ---------------------------------------------------------------------------
5
+ // ---------------------------------------------------------------------------
6
+ // Default connection parameters
7
+ // ---------------------------------------------------------------------------
8
+ const DEFAULT_PORTS = {
9
+ plaxis: 10000,
10
+ flac: 5000,
11
+ rocscience: 8080,
12
+ };
13
+ // ---------------------------------------------------------------------------
14
+ // Detection (checks if software scripting server is accessible)
15
+ // ---------------------------------------------------------------------------
16
+ export async function detectSoftware(software, host = 'localhost', port) {
17
+ const targetPort = port ?? DEFAULT_PORTS[software];
18
+ try {
19
+ const controller = new AbortController();
20
+ const timeout = setTimeout(() => controller.abort(), 3000);
21
+ let url;
22
+ if (software === 'plaxis') {
23
+ url = `http://${host}:${targetPort}/`;
24
+ }
25
+ else if (software === 'flac') {
26
+ url = `http://${host}:${targetPort}/api/v1/status`;
27
+ }
28
+ else {
29
+ url = `http://${host}:${targetPort}/api/status`;
30
+ }
31
+ const res = await fetch(url, {
32
+ method: 'GET',
33
+ signal: controller.signal,
34
+ }).catch(() => null);
35
+ clearTimeout(timeout);
36
+ if (res && res.ok) {
37
+ return {
38
+ software,
39
+ detected: true,
40
+ host,
41
+ port: targetPort,
42
+ version: 'detected',
43
+ };
44
+ }
45
+ return {
46
+ software,
47
+ detected: false,
48
+ host,
49
+ port: targetPort,
50
+ error: `No response from ${software} at ${host}:${targetPort}`,
51
+ };
52
+ }
53
+ catch {
54
+ return {
55
+ software,
56
+ detected: false,
57
+ host,
58
+ port: targetPort,
59
+ error: `Cannot reach ${software} scripting server at ${host}:${targetPort}`,
60
+ };
61
+ }
62
+ }
63
+ // ---------------------------------------------------------------------------
64
+ // Script Generation — generate automation scripts for each software
65
+ // ---------------------------------------------------------------------------
66
+ export function generatePLAXISScript(params) {
67
+ const layers = params.soilLayers ?? [
68
+ { name: 'Fill', depth: 2, gamma: 17, phi: 25, cohesion: 5 },
69
+ { name: 'Clay', depth: 8, gamma: 18, phi: 28, cohesion: 20 },
70
+ { name: 'Sand', depth: 15, gamma: 19, phi: 33, cohesion: 0 },
71
+ ];
72
+ const layerCode = layers.map((l, i) => `
73
+ # Layer ${i + 1}: ${l.name}
74
+ mat_${i + 1} = g_i.soilmat()
75
+ mat_${i + 1}.Identification = "${l.name}"
76
+ mat_${i + 1}.SoilModel = "Mohr-Coulomb"
77
+ mat_${i + 1}.gammaUnsat = ${l.gamma}
78
+ mat_${i + 1}.gammaSat = ${l.gamma + 2}
79
+ mat_${i + 1}.cref = ${l.cohesion}
80
+ mat_${i + 1}.phi = ${l.phi}
81
+ g_i.Soils[${i}].Material = mat_${i + 1}`).join('\n');
82
+ const tunnelCode = params.tunnelDepth ? `
83
+ # Tunnel
84
+ g_i.tunnel(${params.tunnelDepth}, ${params.tunnelRadius ?? 5})
85
+ ` : '';
86
+ const script = `# Auto-generated by geotechCLI for PLAXIS ${params.modelType.toUpperCase()}
87
+ # Execute in PLAXIS Python scripting console
88
+ from plxscripting.easy import new_server
89
+
90
+ s_i, g_i = new_server('localhost', ${DEFAULT_PORTS.plaxis}, timeout=30)
91
+ s_i.new()
92
+
93
+ # Model geometry
94
+ g_i.SoilContour.initializerectangular(-50, 0, 50, -30)
95
+ ${layerCode}
96
+ ${tunnelCode}
97
+ # Mesh generation
98
+ g_i.gotomesh()
99
+ g_i.mesh(0.06) # Fine mesh
100
+
101
+ # Calculation phases
102
+ g_i.gotostages()
103
+ g_i.phase(g_i.InitialPhase)
104
+ g_i.set(g_i.Phase_1.DeformCalcType, "LoadAdvanced")
105
+ g_i.calculate()
106
+
107
+ # Extract results
108
+ print(f"Max displacement: {g_i.getresults(g_i.Phase_1, g_i.ResultTypes.Soil.Utot, 'max'):.4f} m")
109
+ print(f"Max stress: {g_i.getresults(g_i.Phase_1, g_i.ResultTypes.Soil.SigmaXXeff, 'min'):.2f} kPa")
110
+ `;
111
+ return {
112
+ software: 'plaxis',
113
+ language: 'python',
114
+ description: `PLAXIS ${params.modelType.toUpperCase()} model with ${layers.length} soil layers`,
115
+ script,
116
+ };
117
+ }
118
+ export function generateFLACScript(params) {
119
+ const grid = params.gridSize ?? { x: 20, y: 20 };
120
+ const soil = params.soilProperties ?? {
121
+ name: 'Clay', density: 1800, bulk: 2e8, shear: 1e8, cohesion: 20e3, friction: 28,
122
+ };
123
+ const script = `; Auto-generated by geotechCLI for FLAC
124
+ ; Execute in FLAC command window
125
+
126
+ model new
127
+ model title 'geotechCLI Generated Model'
128
+
129
+ ; Grid
130
+ zone create brick size ${grid.x} ${grid.y} 1
131
+
132
+ ; Material: ${soil.name}
133
+ zone cmodel assign mohr-coulomb
134
+ zone property density ${soil.density} bulk ${soil.bulk} shear ${soil.shear}
135
+ zone property cohesion ${soil.cohesion} friction ${soil.friction}
136
+
137
+ ; Boundary conditions
138
+ zone face apply velocity-normal 0 range position-x 0
139
+ zone face apply velocity-normal 0 range position-x ${grid.x}
140
+ zone face apply velocity (0,0,0) range position-z 0
141
+
142
+ ; Gravity
143
+ model gravity 0 0 -9.81
144
+
145
+ ; Initial stresses (K0 = 0.5)
146
+ zone initialize-stresses ratio 0.5
147
+
148
+ ; Solve
149
+ model solve ratio-local 1e-4
150
+
151
+ ; Output
152
+ model save 'geotechcli_output.sav'
153
+ `;
154
+ return {
155
+ software: 'flac',
156
+ language: 'fish',
157
+ description: `FLAC ${grid.x}×${grid.y} grid with ${soil.name}`,
158
+ script,
159
+ };
160
+ }
161
+ export function generateRocscienceScript(params) {
162
+ const layers = params.soilLayers ?? [
163
+ { name: 'Soil', gamma: 18, phi: 30, cohesion: 10 },
164
+ ];
165
+ const materialDefs = layers.map((l, i) => `mat${i} = model.AddMaterial("${l.name}")
166
+ mat${i}.UnitWeight = ${l.gamma}
167
+ mat${i}.FrictionAngle = ${l.phi}
168
+ mat${i}.Cohesion = ${l.cohesion}`).join('\n');
169
+ const script = `# Auto-generated by geotechCLI for Rocscience RS2/Slide
170
+ # Execute in Rocscience scripting console
171
+ import rs2
172
+
173
+ model = rs2.RS2Model()
174
+ model.SetTitle("geotechCLI Generated Model")
175
+
176
+ # Materials
177
+ ${materialDefs}
178
+
179
+ # Analysis
180
+ model.SetAnalysisType("${params.analysisType}")
181
+ model.Compute()
182
+
183
+ # Results
184
+ results = model.GetResults()
185
+ print(f"Factor of Safety: {results.GetMinFOS():.3f}")
186
+ print(f"Critical surface: {results.GetCriticalSurface()}")
187
+ `;
188
+ return {
189
+ software: 'rocscience',
190
+ language: 'python',
191
+ description: `Rocscience ${params.analysisType} analysis`,
192
+ script,
193
+ };
194
+ }
195
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,iEAAiE;AACjE,0EAA0E;AAC1E,8EAA8E;AAoB9E,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,MAAM,aAAa,GAAiC;IAClD,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,IAAI;IACV,UAAU,EAAE,IAAI;CACjB,CAAC;AAEF,8EAA8E;AAC9E,gEAAgE;AAChE,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAsB,EACtB,IAAI,GAAG,WAAW,EAClB,IAAa;IAEb,MAAM,UAAU,GAAG,IAAI,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAE3D,IAAI,GAAW,CAAC;QAChB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,GAAG,GAAG,UAAU,IAAI,IAAI,UAAU,GAAG,CAAC;QACxC,CAAC;aAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC/B,GAAG,GAAG,UAAU,IAAI,IAAI,UAAU,gBAAgB,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,UAAU,IAAI,IAAI,UAAU,aAAa,CAAC;QAClD,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAErB,YAAY,CAAC,OAAO,CAAC,CAAC;QAEtB,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YAClB,OAAO;gBACL,QAAQ;gBACR,QAAQ,EAAE,IAAI;gBACd,IAAI;gBACJ,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,UAAU;aACpB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ;YACR,QAAQ,EAAE,KAAK;YACf,IAAI;YACJ,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,oBAAoB,QAAQ,OAAO,IAAI,IAAI,UAAU,EAAE;SAC/D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,QAAQ;YACR,QAAQ,EAAE,KAAK;YACf,IAAI;YACJ,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,gBAAgB,QAAQ,wBAAwB,IAAI,IAAI,UAAU,EAAE;SAC5E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,oEAAoE;AACpE,8EAA8E;AAE9E,MAAM,UAAU,oBAAoB,CAAC,MAKpC;IACC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,IAAI;QAClC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;QAC3D,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC5D,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;KAC7D,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;UAC/B,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI;MACpB,CAAC,GAAG,CAAC;MACL,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,IAAI;MACjC,CAAC,GAAG,CAAC;MACL,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,KAAK;MAC7B,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,GAAG,CAAC;MAC/B,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,QAAQ;MAC1B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG;YACd,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEnD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;;aAE7B,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,YAAY,IAAI,CAAC;CAC3D,CAAC,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,MAAM,GAAG,6CAA6C,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE;;;;qCAIvD,aAAa,CAAC,MAAM;;;;;EAKvD,SAAS;EACT,UAAU;;;;;;;;;;;;;;CAcX,CAAC;IAEA,OAAO;QACL,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,UAAU,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,eAAe,MAAM,CAAC,MAAM,cAAc;QAC/F,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAGlC;IACC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,IAAI;QACpC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;KACjF,CAAC;IAEF,MAAM,MAAM,GAAG;;;;;;;yBAOQ,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;;cAE3B,IAAI,CAAC,IAAI;;wBAEC,IAAI,CAAC,OAAO,SAAS,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,KAAK;yBACjD,IAAI,CAAC,QAAQ,aAAa,IAAI,CAAC,QAAQ;;;;qDAIX,IAAI,CAAC,CAAC;;;;;;;;;;;;;;CAc1D,CAAC;IAEA,OAAO;QACL,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,IAAI,EAAE;QAC9D,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAGxC;IACC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,IAAI;QAClC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;KACnD,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACvC,MAAM,CAAC,yBAAyB,CAAC,CAAC,IAAI;KACrC,CAAC,iBAAiB,CAAC,CAAC,KAAK;KACzB,CAAC,oBAAoB,CAAC,CAAC,GAAG;KAC1B,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE,CAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,MAAM,GAAG;;;;;;;;EAQf,YAAY;;;yBAGW,MAAM,CAAC,YAAY;;;;;;;CAO3C,CAAC;IAEA,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,cAAc,MAAM,CAAC,YAAY,WAAW;QACzD,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,106 @@
1
+ import { z } from 'zod';
2
+ declare const ConfigSchema: z.ZodObject<{
3
+ llm: z.ZodDefault<z.ZodObject<{
4
+ provider: z.ZodDefault<z.ZodEnum<["hosted-beta", "zhipu", "openai", "anthropic", "openai-compatible", "huggingface"]>>;
5
+ api_key: z.ZodDefault<z.ZodString>;
6
+ model: z.ZodDefault<z.ZodString>;
7
+ vision_model: z.ZodDefault<z.ZodString>;
8
+ base_url: z.ZodDefault<z.ZodString>;
9
+ timeout: z.ZodDefault<z.ZodNumber>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ model: string;
12
+ provider: "hosted-beta" | "zhipu" | "openai" | "anthropic" | "openai-compatible" | "huggingface";
13
+ api_key: string;
14
+ vision_model: string;
15
+ base_url: string;
16
+ timeout: number;
17
+ }, {
18
+ model?: string | undefined;
19
+ provider?: "hosted-beta" | "zhipu" | "openai" | "anthropic" | "openai-compatible" | "huggingface" | undefined;
20
+ api_key?: string | undefined;
21
+ vision_model?: string | undefined;
22
+ base_url?: string | undefined;
23
+ timeout?: number | undefined;
24
+ }>>;
25
+ auth: z.ZodDefault<z.ZodObject<{
26
+ api_key: z.ZodDefault<z.ZodString>;
27
+ tier: z.ZodDefault<z.ZodEnum<["free", "lite_pro", "pro", "annual"]>>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ api_key: string;
30
+ tier: "free" | "lite_pro" | "pro" | "annual";
31
+ }, {
32
+ api_key?: string | undefined;
33
+ tier?: "free" | "lite_pro" | "pro" | "annual" | undefined;
34
+ }>>;
35
+ cli: z.ZodDefault<z.ZodObject<{
36
+ color: z.ZodDefault<z.ZodBoolean>;
37
+ verbose: z.ZodDefault<z.ZodBoolean>;
38
+ }, "strip", z.ZodTypeAny, {
39
+ verbose: boolean;
40
+ color: boolean;
41
+ }, {
42
+ verbose?: boolean | undefined;
43
+ color?: boolean | undefined;
44
+ }>>;
45
+ }, "strip", z.ZodTypeAny, {
46
+ llm: {
47
+ model: string;
48
+ provider: "hosted-beta" | "zhipu" | "openai" | "anthropic" | "openai-compatible" | "huggingface";
49
+ api_key: string;
50
+ vision_model: string;
51
+ base_url: string;
52
+ timeout: number;
53
+ };
54
+ auth: {
55
+ api_key: string;
56
+ tier: "free" | "lite_pro" | "pro" | "annual";
57
+ };
58
+ cli: {
59
+ verbose: boolean;
60
+ color: boolean;
61
+ };
62
+ }, {
63
+ llm?: {
64
+ model?: string | undefined;
65
+ provider?: "hosted-beta" | "zhipu" | "openai" | "anthropic" | "openai-compatible" | "huggingface" | undefined;
66
+ api_key?: string | undefined;
67
+ vision_model?: string | undefined;
68
+ base_url?: string | undefined;
69
+ timeout?: number | undefined;
70
+ } | undefined;
71
+ auth?: {
72
+ api_key?: string | undefined;
73
+ tier?: "free" | "lite_pro" | "pro" | "annual" | undefined;
74
+ } | undefined;
75
+ cli?: {
76
+ verbose?: boolean | undefined;
77
+ color?: boolean | undefined;
78
+ } | undefined;
79
+ }>;
80
+ export type GeotechConfig = z.infer<typeof ConfigSchema>;
81
+ export declare function loadConfig(): GeotechConfig;
82
+ export declare function saveConfig(config: GeotechConfig): void;
83
+ /**
84
+ * Set a nested config value using dot notation.
85
+ * Example: setConfigValue('llm.provider', 'openai')
86
+ */
87
+ export declare function setConfigValue(key: string, value: string): void;
88
+ /**
89
+ * Get a nested config value using dot notation.
90
+ */
91
+ export declare function getConfigValue(key: string): unknown;
92
+ /**
93
+ * Build an LLMConfig from the stored config + environment variables.
94
+ * Environment variables take precedence over config file values when present.
95
+ * API keys are NEVER logged or exposed.
96
+ */
97
+ export declare function buildLLMConfig(): {
98
+ provider: import('../llm/types.js').LLMProvider;
99
+ apiKey: string;
100
+ baseUrl?: string;
101
+ modelId?: string;
102
+ visionModelId?: string;
103
+ timeout: number;
104
+ };
105
+ export {};
106
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmBxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuBhB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AA0BzD,wBAAgB,UAAU,IAAI,aAAa,CAgC1C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAMtD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAoC/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBnD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI;IAAE,QAAQ,EAAE,OAAO,iBAAiB,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAqEjL"}
@@ -0,0 +1,217 @@
1
+ import { z } from 'zod';
2
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, chmodSync, statSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { homedir, platform } from 'node:os';
5
+ import { DEFAULT_LLM_PROVIDER } from '../meta/index.js';
6
+ // ---------------------------------------------------------------------------
7
+ // Schema
8
+ // ---------------------------------------------------------------------------
9
+ const LLMProviderSchema = z.enum([
10
+ 'hosted-beta',
11
+ 'zhipu',
12
+ 'openai',
13
+ 'anthropic',
14
+ 'openai-compatible',
15
+ 'huggingface',
16
+ ]);
17
+ const ConfigSchema = z.object({
18
+ llm: z
19
+ .object({
20
+ provider: LLMProviderSchema.default(DEFAULT_LLM_PROVIDER),
21
+ api_key: z.string().default(''),
22
+ model: z.string().default(''),
23
+ vision_model: z.string().default(''),
24
+ base_url: z.string().default(''),
25
+ timeout: z.number().default(60000),
26
+ })
27
+ .default({}),
28
+ auth: z
29
+ .object({
30
+ api_key: z.string().default(''),
31
+ tier: z.enum(['free', 'lite_pro', 'pro', 'annual']).default('free'),
32
+ })
33
+ .default({}),
34
+ cli: z
35
+ .object({
36
+ color: z.boolean().default(true),
37
+ verbose: z.boolean().default(false),
38
+ })
39
+ .default({}),
40
+ });
41
+ // ---------------------------------------------------------------------------
42
+ // Paths
43
+ // ---------------------------------------------------------------------------
44
+ function getConfigDir() {
45
+ const dir = process.env.GEOTECHCLI_CONFIG_DIR ?? join(homedir(), '.geotechcli');
46
+ if (!existsSync(dir)) {
47
+ mkdirSync(dir, { recursive: true });
48
+ if (platform() !== 'win32') {
49
+ try {
50
+ chmodSync(dir, 0o700);
51
+ }
52
+ catch { /* best effort */ }
53
+ }
54
+ }
55
+ return dir;
56
+ }
57
+ function getConfigPath() {
58
+ return join(getConfigDir(), 'config.json');
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // Read / Write
62
+ // ---------------------------------------------------------------------------
63
+ export function loadConfig() {
64
+ const configPath = getConfigPath();
65
+ if (!existsSync(configPath)) {
66
+ const defaults = ConfigSchema.parse({});
67
+ saveConfig(defaults);
68
+ return defaults;
69
+ }
70
+ // SECURITY: Auto-repair permissions if config file is too open
71
+ if (platform() !== 'win32') {
72
+ try {
73
+ const st = statSync(configPath);
74
+ const mode = st.mode & 0o777;
75
+ if (mode & 0o077) {
76
+ chmodSync(configPath, 0o600);
77
+ console.error(`⚠ geotechCLI: Repaired config permissions (was ${mode.toString(8)}, now 600). Config contains API keys.`);
78
+ }
79
+ }
80
+ catch { /* best effort */ }
81
+ }
82
+ try {
83
+ const raw = readFileSync(configPath, 'utf-8');
84
+ const parsed = JSON.parse(raw);
85
+ return ConfigSchema.parse(parsed);
86
+ }
87
+ catch {
88
+ const defaults = ConfigSchema.parse({});
89
+ saveConfig(defaults);
90
+ return defaults;
91
+ }
92
+ }
93
+ export function saveConfig(config) {
94
+ const configPath = getConfigPath();
95
+ writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
96
+ if (platform() !== 'win32') {
97
+ try {
98
+ chmodSync(configPath, 0o600);
99
+ }
100
+ catch { /* best effort */ }
101
+ }
102
+ }
103
+ /**
104
+ * Set a nested config value using dot notation.
105
+ * Example: setConfigValue('llm.provider', 'openai')
106
+ */
107
+ export function setConfigValue(key, value) {
108
+ const config = loadConfig();
109
+ const parts = key.split('.');
110
+ // Navigate to parent, then set leaf
111
+ let current = config;
112
+ for (let i = 0; i < parts.length - 1; i++) {
113
+ const part = parts[i];
114
+ if (typeof current[part] !== 'object' ||
115
+ current[part] === null) {
116
+ current[part] = {};
117
+ }
118
+ current = current[part];
119
+ }
120
+ const leaf = parts[parts.length - 1];
121
+ // Type coercion for known boolean/number fields
122
+ if (value === 'true') {
123
+ current[leaf] = true;
124
+ }
125
+ else if (value === 'false') {
126
+ current[leaf] = false;
127
+ }
128
+ else if (!isNaN(Number(value)) && value.trim() !== '') {
129
+ current[leaf] = Number(value);
130
+ }
131
+ else {
132
+ current[leaf] = value;
133
+ }
134
+ // Re-validate entire config
135
+ const validated = ConfigSchema.parse(config);
136
+ saveConfig(validated);
137
+ }
138
+ /**
139
+ * Get a nested config value using dot notation.
140
+ */
141
+ export function getConfigValue(key) {
142
+ const config = loadConfig();
143
+ const parts = key.split('.');
144
+ let current = config;
145
+ for (const part of parts) {
146
+ if (typeof current !== 'object' ||
147
+ current === null ||
148
+ !(part in current)) {
149
+ return undefined;
150
+ }
151
+ current = current[part];
152
+ }
153
+ return current;
154
+ }
155
+ /**
156
+ * Build an LLMConfig from the stored config + environment variables.
157
+ * Environment variables take precedence over config file values when present.
158
+ * API keys are NEVER logged or exposed.
159
+ */
160
+ export function buildLLMConfig() {
161
+ const config = loadConfig();
162
+ const provider = config.llm.provider;
163
+ function preferEnv(...values) {
164
+ for (const value of values) {
165
+ if (value && value.trim().length > 0) {
166
+ return value;
167
+ }
168
+ }
169
+ return '';
170
+ }
171
+ // Resolve API key: env var > config file
172
+ let apiKey = config.llm.api_key;
173
+ switch (provider) {
174
+ case 'hosted-beta':
175
+ apiKey = '';
176
+ break;
177
+ case 'zhipu':
178
+ apiKey = preferEnv(process.env.ZHIPU_API_KEY, config.llm.api_key);
179
+ break;
180
+ case 'openai':
181
+ apiKey = preferEnv(process.env.OPENAI_API_KEY, config.llm.api_key);
182
+ break;
183
+ case 'anthropic':
184
+ apiKey = preferEnv(process.env.ANTHROPIC_API_KEY, config.llm.api_key);
185
+ break;
186
+ case 'openai-compatible':
187
+ apiKey = preferEnv(process.env.QWEN_VPS_API_KEY, process.env.OPENAI_API_KEY, config.llm.api_key);
188
+ break;
189
+ case 'huggingface':
190
+ apiKey = preferEnv(process.env.HF_TOKEN, process.env.HUGGINGFACE_TOKEN, config.llm.api_key);
191
+ break;
192
+ }
193
+ // Resolve base URL for openai-compatible (Qwen VPS)
194
+ let baseUrl = config.llm.base_url || undefined;
195
+ if (provider === 'hosted-beta') {
196
+ baseUrl =
197
+ preferEnv(process.env.GEOTECHCLI_PROXY_URL, config.llm.base_url) ||
198
+ 'https://beta.geotechcli.com/api/proxy';
199
+ }
200
+ else if (provider === 'openai-compatible') {
201
+ baseUrl = preferEnv(process.env.QWEN_VPS_BASE_URL, config.llm.base_url) || undefined;
202
+ }
203
+ // Resolve model overrides
204
+ let modelId = config.llm.model || undefined;
205
+ if (provider === 'openai-compatible') {
206
+ modelId = preferEnv(process.env.QWEN_VPS_MODEL_ID, config.llm.model) || undefined;
207
+ }
208
+ return {
209
+ provider,
210
+ apiKey,
211
+ baseUrl,
212
+ modelId,
213
+ visionModelId: config.llm.vision_model || undefined,
214
+ timeout: config.llm.timeout,
215
+ };
216
+ }
217
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { dbQuery, dbInsert, dbUpdate, dbUpsert, dbRpc, dbHealthCheck, type SupabaseConfig, } from './supabase.js';
2
+ export { getUserById, getUserByKey, getUserByEmail, getUserByStripeCustomer, createUser, updateSubscription, linkStripeCustomer, regenerateKey, generateGeotechKey, deleteUser, resolveEffectiveTier, type GeotechUser, type CreateUserInput, } from './users.js';
3
+ export { RedisUsageStore, isIPRateLimitedRedis, redisHealthCheck, } from './redis.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAC3D,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,uBAAuB,EAClE,UAAU,EAAE,kBAAkB,EAAE,kBAAkB,EAClD,aAAa,EAAE,kBAAkB,EAAE,UAAU,EAAE,oBAAoB,EACnE,KAAK,WAAW,EAAE,KAAK,eAAe,GACvC,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,eAAe,EAAE,oBAAoB,EAAE,gBAAgB,GACxD,MAAM,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { dbQuery, dbInsert, dbUpdate, dbUpsert, dbRpc, dbHealthCheck, } from './supabase.js';
2
+ export { getUserById, getUserByKey, getUserByEmail, getUserByStripeCustomer, createUser, updateSubscription, linkStripeCustomer, regenerateKey, generateGeotechKey, deleteUser, resolveEffectiveTier, } from './users.js';
3
+ export { RedisUsageStore, isIPRateLimitedRedis, redisHealthCheck, } from './redis.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,GAE5D,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,uBAAuB,EAClE,UAAU,EAAE,kBAAkB,EAAE,kBAAkB,EAClD,aAAa,EAAE,kBAAkB,EAAE,UAAU,EAAE,oBAAoB,GAEpE,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,eAAe,EAAE,oBAAoB,EAAE,gBAAgB,GACxD,MAAM,YAAY,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { UsageRecord, UsageStore } from '../llm/middleware/metering.js';
2
+ export declare class RedisUsageStore implements UsageStore {
3
+ private keyPrefix;
4
+ get(identifier: string): Promise<UsageRecord | null>;
5
+ set(identifier: string, record: UsageRecord): Promise<void>;
6
+ increment(identifier: string, field: 'llmCalls' | 'visionCalls' | 'agentCalls'): Promise<UsageRecord>;
7
+ }
8
+ /**
9
+ * Check if an IP is rate-limited using Redis sliding window.
10
+ * Returns true if the IP should be blocked.
11
+ */
12
+ export declare function isIPRateLimitedRedis(ip: string, maxRequests?: number, windowMs?: number): Promise<boolean>;
13
+ export declare function redisHealthCheck(): Promise<boolean>;
14
+ //# sourceMappingURL=redis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/db/redis.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAsG7E,qBAAa,eAAgB,YAAW,UAAU;IAChD,OAAO,CAAC,SAAS;IAKX,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAqCpD,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3D,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,UAAU,GAAG,aAAa,GAAG,YAAY,GAC/C,OAAO,CAAC,WAAW,CAAC;CA4BxB;AAMD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,WAAW,SAAK,EAChB,QAAQ,SAAS,GAChB,OAAO,CAAC,OAAO,CAAC,CAuBlB;AAMD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAGzD"}