@untangle-code/cli 0.0.0-stage → 0.1.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 (571) hide show
  1. package/LICENSE +661 -0
  2. package/NOTICE +90 -0
  3. package/README.md +424 -2
  4. package/THIRD_PARTY_LICENSES.md +152 -0
  5. package/dist/cli/args.d.ts +48 -0
  6. package/dist/cli/args.d.ts.map +1 -0
  7. package/dist/cli/args.js +167 -0
  8. package/dist/cli/args.js.map +1 -0
  9. package/dist/cli/command.d.ts +69 -0
  10. package/dist/cli/command.d.ts.map +1 -0
  11. package/dist/cli/command.js +82 -0
  12. package/dist/cli/command.js.map +1 -0
  13. package/dist/cli/deadline.d.ts +33 -0
  14. package/dist/cli/deadline.d.ts.map +1 -0
  15. package/dist/cli/deadline.js +49 -0
  16. package/dist/cli/deadline.js.map +1 -0
  17. package/dist/cli/embedder-deadline.d.ts +72 -0
  18. package/dist/cli/embedder-deadline.d.ts.map +1 -0
  19. package/dist/cli/embedder-deadline.js +117 -0
  20. package/dist/cli/embedder-deadline.js.map +1 -0
  21. package/dist/cli/exit.d.ts +71 -0
  22. package/dist/cli/exit.d.ts.map +1 -0
  23. package/dist/cli/exit.js +81 -0
  24. package/dist/cli/exit.js.map +1 -0
  25. package/dist/cli/graphs.d.ts +65 -0
  26. package/dist/cli/graphs.d.ts.map +1 -0
  27. package/dist/cli/graphs.js +108 -0
  28. package/dist/cli/graphs.js.map +1 -0
  29. package/dist/cli/index-freshness.d.ts +13 -0
  30. package/dist/cli/index-freshness.d.ts.map +1 -0
  31. package/dist/cli/index-freshness.js +226 -0
  32. package/dist/cli/index-freshness.js.map +1 -0
  33. package/dist/cli/index-refresh.d.ts +10 -0
  34. package/dist/cli/index-refresh.d.ts.map +1 -0
  35. package/dist/cli/index-refresh.js +76 -0
  36. package/dist/cli/index-refresh.js.map +1 -0
  37. package/dist/cli/index-state.d.ts +184 -0
  38. package/dist/cli/index-state.d.ts.map +1 -0
  39. package/dist/cli/index-state.js +852 -0
  40. package/dist/cli/index-state.js.map +1 -0
  41. package/dist/cli/io.d.ts +29 -0
  42. package/dist/cli/io.d.ts.map +1 -0
  43. package/dist/cli/io.js +42 -0
  44. package/dist/cli/io.js.map +1 -0
  45. package/dist/cli/language-support.d.ts +77 -0
  46. package/dist/cli/language-support.d.ts.map +1 -0
  47. package/dist/cli/language-support.js +152 -0
  48. package/dist/cli/language-support.js.map +1 -0
  49. package/dist/cli/renewing-lease.d.ts +26 -0
  50. package/dist/cli/renewing-lease.d.ts.map +1 -0
  51. package/dist/cli/renewing-lease.js +102 -0
  52. package/dist/cli/renewing-lease.js.map +1 -0
  53. package/dist/cli/search-graph-enrichment.d.ts +16 -0
  54. package/dist/cli/search-graph-enrichment.d.ts.map +1 -0
  55. package/dist/cli/search-graph-enrichment.js +428 -0
  56. package/dist/cli/search-graph-enrichment.js.map +1 -0
  57. package/dist/cli/system.d.ts +34 -0
  58. package/dist/cli/system.d.ts.map +1 -0
  59. package/dist/cli/system.js +89 -0
  60. package/dist/cli/system.js.map +1 -0
  61. package/dist/cli/vector-store-policy.d.ts +116 -0
  62. package/dist/cli/vector-store-policy.d.ts.map +1 -0
  63. package/dist/cli/vector-store-policy.js +160 -0
  64. package/dist/cli/vector-store-policy.js.map +1 -0
  65. package/dist/cli/version.d.ts +3 -0
  66. package/dist/cli/version.d.ts.map +1 -0
  67. package/dist/cli/version.js +3 -0
  68. package/dist/cli/version.js.map +1 -0
  69. package/dist/cli/workspace.d.ts +105 -0
  70. package/dist/cli/workspace.d.ts.map +1 -0
  71. package/dist/cli/workspace.js +215 -0
  72. package/dist/cli/workspace.js.map +1 -0
  73. package/dist/commands/complexity.d.ts +72 -0
  74. package/dist/commands/complexity.d.ts.map +1 -0
  75. package/dist/commands/complexity.js +580 -0
  76. package/dist/commands/complexity.js.map +1 -0
  77. package/dist/commands/doctor.d.ts +66 -0
  78. package/dist/commands/doctor.d.ts.map +1 -0
  79. package/dist/commands/doctor.js +764 -0
  80. package/dist/commands/doctor.js.map +1 -0
  81. package/dist/commands/doctor.languages.d.ts +37 -0
  82. package/dist/commands/doctor.languages.d.ts.map +1 -0
  83. package/dist/commands/doctor.languages.js +143 -0
  84. package/dist/commands/doctor.languages.js.map +1 -0
  85. package/dist/commands/doctor.storage.d.ts +17 -0
  86. package/dist/commands/doctor.storage.d.ts.map +1 -0
  87. package/dist/commands/doctor.storage.js +91 -0
  88. package/dist/commands/doctor.storage.js.map +1 -0
  89. package/dist/commands/extensions/add.d.ts +10 -0
  90. package/dist/commands/extensions/add.d.ts.map +1 -0
  91. package/dist/commands/extensions/add.js +213 -0
  92. package/dist/commands/extensions/add.js.map +1 -0
  93. package/dist/commands/extensions/configure.d.ts +5 -0
  94. package/dist/commands/extensions/configure.d.ts.map +1 -0
  95. package/dist/commands/extensions/configure.js +58 -0
  96. package/dist/commands/extensions/configure.js.map +1 -0
  97. package/dist/commands/extensions/container.d.ts +15 -0
  98. package/dist/commands/extensions/container.d.ts.map +1 -0
  99. package/dist/commands/extensions/container.js +135 -0
  100. package/dist/commands/extensions/container.js.map +1 -0
  101. package/dist/commands/extensions/context.d.ts +37 -0
  102. package/dist/commands/extensions/context.d.ts.map +1 -0
  103. package/dist/commands/extensions/context.js +72 -0
  104. package/dist/commands/extensions/context.js.map +1 -0
  105. package/dist/commands/extensions/enable.d.ts +6 -0
  106. package/dist/commands/extensions/enable.d.ts.map +1 -0
  107. package/dist/commands/extensions/enable.js +180 -0
  108. package/dist/commands/extensions/enable.js.map +1 -0
  109. package/dist/commands/extensions/environment.d.ts +74 -0
  110. package/dist/commands/extensions/environment.d.ts.map +1 -0
  111. package/dist/commands/extensions/environment.js +168 -0
  112. package/dist/commands/extensions/environment.js.map +1 -0
  113. package/dist/commands/extensions/feature-scan.d.ts +48 -0
  114. package/dist/commands/extensions/feature-scan.d.ts.map +1 -0
  115. package/dist/commands/extensions/feature-scan.js +156 -0
  116. package/dist/commands/extensions/feature-scan.js.map +1 -0
  117. package/dist/commands/extensions/invoke.d.ts +60 -0
  118. package/dist/commands/extensions/invoke.d.ts.map +1 -0
  119. package/dist/commands/extensions/invoke.js +275 -0
  120. package/dist/commands/extensions/invoke.js.map +1 -0
  121. package/dist/commands/extensions/list.d.ts +5 -0
  122. package/dist/commands/extensions/list.d.ts.map +1 -0
  123. package/dist/commands/extensions/list.js +125 -0
  124. package/dist/commands/extensions/list.js.map +1 -0
  125. package/dist/commands/extensions/logs.d.ts +5 -0
  126. package/dist/commands/extensions/logs.d.ts.map +1 -0
  127. package/dist/commands/extensions/logs.js +74 -0
  128. package/dist/commands/extensions/logs.js.map +1 -0
  129. package/dist/commands/extensions/provision.d.ts +36 -0
  130. package/dist/commands/extensions/provision.d.ts.map +1 -0
  131. package/dist/commands/extensions/provision.js +137 -0
  132. package/dist/commands/extensions/provision.js.map +1 -0
  133. package/dist/commands/extensions/remove.d.ts +5 -0
  134. package/dist/commands/extensions/remove.d.ts.map +1 -0
  135. package/dist/commands/extensions/remove.js +77 -0
  136. package/dist/commands/extensions/remove.js.map +1 -0
  137. package/dist/commands/extensions/render.d.ts +16 -0
  138. package/dist/commands/extensions/render.d.ts.map +1 -0
  139. package/dist/commands/extensions/render.js +25 -0
  140. package/dist/commands/extensions/render.js.map +1 -0
  141. package/dist/commands/extensions/run.d.ts +30 -0
  142. package/dist/commands/extensions/run.d.ts.map +1 -0
  143. package/dist/commands/extensions/run.js +292 -0
  144. package/dist/commands/extensions/run.js.map +1 -0
  145. package/dist/commands/extensions/secret-store.d.ts +15 -0
  146. package/dist/commands/extensions/secret-store.d.ts.map +1 -0
  147. package/dist/commands/extensions/secret-store.js +164 -0
  148. package/dist/commands/extensions/secret-store.js.map +1 -0
  149. package/dist/commands/extensions/setup.d.ts +17 -0
  150. package/dist/commands/extensions/setup.d.ts.map +1 -0
  151. package/dist/commands/extensions/setup.js +94 -0
  152. package/dist/commands/extensions/setup.js.map +1 -0
  153. package/dist/commands/extensions/source.d.ts +47 -0
  154. package/dist/commands/extensions/source.d.ts.map +1 -0
  155. package/dist/commands/extensions/source.js +142 -0
  156. package/dist/commands/extensions/source.js.map +1 -0
  157. package/dist/commands/extensions/state.d.ts +62 -0
  158. package/dist/commands/extensions/state.d.ts.map +1 -0
  159. package/dist/commands/extensions/state.js +177 -0
  160. package/dist/commands/extensions/state.js.map +1 -0
  161. package/dist/commands/extensions/status.d.ts +9 -0
  162. package/dist/commands/extensions/status.d.ts.map +1 -0
  163. package/dist/commands/extensions/status.js +239 -0
  164. package/dist/commands/extensions/status.js.map +1 -0
  165. package/dist/commands/extensions.d.ts +3 -0
  166. package/dist/commands/extensions.d.ts.map +1 -0
  167. package/dist/commands/extensions.js +223 -0
  168. package/dist/commands/extensions.js.map +1 -0
  169. package/dist/commands/flow/index.d.ts +3 -0
  170. package/dist/commands/flow/index.d.ts.map +1 -0
  171. package/dist/commands/flow/index.js +295 -0
  172. package/dist/commands/flow/index.js.map +1 -0
  173. package/dist/commands/flow/limits.d.ts +12 -0
  174. package/dist/commands/flow/limits.d.ts.map +1 -0
  175. package/dist/commands/flow/limits.js +13 -0
  176. package/dist/commands/flow/limits.js.map +1 -0
  177. package/dist/commands/flow/output.d.ts +8 -0
  178. package/dist/commands/flow/output.d.ts.map +1 -0
  179. package/dist/commands/flow/output.js +11 -0
  180. package/dist/commands/flow/output.js.map +1 -0
  181. package/dist/commands/flow/render.d.ts +51 -0
  182. package/dist/commands/flow/render.d.ts.map +1 -0
  183. package/dist/commands/flow/render.js +220 -0
  184. package/dist/commands/flow/render.js.map +1 -0
  185. package/dist/commands/flow/select.d.ts +31 -0
  186. package/dist/commands/flow/select.d.ts.map +1 -0
  187. package/dist/commands/flow/select.js +62 -0
  188. package/dist/commands/flow/select.js.map +1 -0
  189. package/dist/commands/graph/boundaries-input.d.ts +26 -0
  190. package/dist/commands/graph/boundaries-input.d.ts.map +1 -0
  191. package/dist/commands/graph/boundaries-input.js +54 -0
  192. package/dist/commands/graph/boundaries-input.js.map +1 -0
  193. package/dist/commands/graph/boundaries.d.ts +4 -0
  194. package/dist/commands/graph/boundaries.d.ts.map +1 -0
  195. package/dist/commands/graph/boundaries.js +141 -0
  196. package/dist/commands/graph/boundaries.js.map +1 -0
  197. package/dist/commands/graph/bounds.d.ts +16 -0
  198. package/dist/commands/graph/bounds.d.ts.map +1 -0
  199. package/dist/commands/graph/bounds.js +22 -0
  200. package/dist/commands/graph/bounds.js.map +1 -0
  201. package/dist/commands/graph/category-clusters.d.ts +20 -0
  202. package/dist/commands/graph/category-clusters.d.ts.map +1 -0
  203. package/dist/commands/graph/category-clusters.js +158 -0
  204. package/dist/commands/graph/category-clusters.js.map +1 -0
  205. package/dist/commands/graph/feature-3d.d.ts +22 -0
  206. package/dist/commands/graph/feature-3d.d.ts.map +1 -0
  207. package/dist/commands/graph/feature-3d.js +114 -0
  208. package/dist/commands/graph/feature-3d.js.map +1 -0
  209. package/dist/commands/graph/feature-clusters.d.ts +17 -0
  210. package/dist/commands/graph/feature-clusters.d.ts.map +1 -0
  211. package/dist/commands/graph/feature-clusters.js +94 -0
  212. package/dist/commands/graph/feature-clusters.js.map +1 -0
  213. package/dist/commands/graph/feature-html.d.ts +26 -0
  214. package/dist/commands/graph/feature-html.d.ts.map +1 -0
  215. package/dist/commands/graph/feature-html.js +314 -0
  216. package/dist/commands/graph/feature-html.js.map +1 -0
  217. package/dist/commands/graph/feature-map.d.ts +31 -0
  218. package/dist/commands/graph/feature-map.d.ts.map +1 -0
  219. package/dist/commands/graph/feature-map.js +217 -0
  220. package/dist/commands/graph/feature-map.js.map +1 -0
  221. package/dist/commands/graph/feature-model.d.ts +55 -0
  222. package/dist/commands/graph/feature-model.d.ts.map +1 -0
  223. package/dist/commands/graph/feature-model.js +167 -0
  224. package/dist/commands/graph/feature-model.js.map +1 -0
  225. package/dist/commands/graph/feature-untangle-motion.d.ts +33 -0
  226. package/dist/commands/graph/feature-untangle-motion.d.ts.map +1 -0
  227. package/dist/commands/graph/feature-untangle-motion.js +155 -0
  228. package/dist/commands/graph/feature-untangle-motion.js.map +1 -0
  229. package/dist/commands/graph/index.d.ts +3 -0
  230. package/dist/commands/graph/index.d.ts.map +1 -0
  231. package/dist/commands/graph/index.js +414 -0
  232. package/dist/commands/graph/index.js.map +1 -0
  233. package/dist/commands/graph/render.d.ts +63 -0
  234. package/dist/commands/graph/render.d.ts.map +1 -0
  235. package/dist/commands/graph/render.js +352 -0
  236. package/dist/commands/graph/render.js.map +1 -0
  237. package/dist/commands/graph/select.d.ts +34 -0
  238. package/dist/commands/graph/select.d.ts.map +1 -0
  239. package/dist/commands/graph/select.js +55 -0
  240. package/dist/commands/graph/select.js.map +1 -0
  241. package/dist/commands/index/index.d.ts +6 -0
  242. package/dist/commands/index/index.d.ts.map +1 -0
  243. package/dist/commands/index/index.js +461 -0
  244. package/dist/commands/index/index.js.map +1 -0
  245. package/dist/commands/index/render.d.ts +53 -0
  246. package/dist/commands/index/render.d.ts.map +1 -0
  247. package/dist/commands/index/render.js +205 -0
  248. package/dist/commands/index/render.js.map +1 -0
  249. package/dist/commands/index/target.d.ts +34 -0
  250. package/dist/commands/index/target.d.ts.map +1 -0
  251. package/dist/commands/index/target.js +97 -0
  252. package/dist/commands/index/target.js.map +1 -0
  253. package/dist/commands/index-watch.d.ts +30 -0
  254. package/dist/commands/index-watch.d.ts.map +1 -0
  255. package/dist/commands/index-watch.js +138 -0
  256. package/dist/commands/index-watch.js.map +1 -0
  257. package/dist/commands/init/command.d.ts +25 -0
  258. package/dist/commands/init/command.d.ts.map +1 -0
  259. package/dist/commands/init/command.js +198 -0
  260. package/dist/commands/init/command.js.map +1 -0
  261. package/dist/commands/init/config-draft.d.ts +48 -0
  262. package/dist/commands/init/config-draft.d.ts.map +1 -0
  263. package/dist/commands/init/config-draft.js +201 -0
  264. package/dist/commands/init/config-draft.js.map +1 -0
  265. package/dist/commands/init/diff.d.ts +33 -0
  266. package/dist/commands/init/diff.d.ts.map +1 -0
  267. package/dist/commands/init/diff.js +109 -0
  268. package/dist/commands/init/diff.js.map +1 -0
  269. package/dist/commands/init/http-probe.d.ts +26 -0
  270. package/dist/commands/init/http-probe.d.ts.map +1 -0
  271. package/dist/commands/init/http-probe.js +144 -0
  272. package/dist/commands/init/http-probe.js.map +1 -0
  273. package/dist/commands/init/ignore-rules.d.ts +70 -0
  274. package/dist/commands/init/ignore-rules.d.ts.map +1 -0
  275. package/dist/commands/init/ignore-rules.js +146 -0
  276. package/dist/commands/init/ignore-rules.js.map +1 -0
  277. package/dist/commands/init/index.d.ts +33 -0
  278. package/dist/commands/init/index.d.ts.map +1 -0
  279. package/dist/commands/init/index.js +32 -0
  280. package/dist/commands/init/index.js.map +1 -0
  281. package/dist/commands/init/integrations-apply.d.ts +50 -0
  282. package/dist/commands/init/integrations-apply.d.ts.map +1 -0
  283. package/dist/commands/init/integrations-apply.js +452 -0
  284. package/dist/commands/init/integrations-apply.js.map +1 -0
  285. package/dist/commands/init/integrations-plan.d.ts +68 -0
  286. package/dist/commands/init/integrations-plan.d.ts.map +1 -0
  287. package/dist/commands/init/integrations-plan.js +515 -0
  288. package/dist/commands/init/integrations-plan.js.map +1 -0
  289. package/dist/commands/init/integrations.d.ts +5 -0
  290. package/dist/commands/init/integrations.d.ts.map +1 -0
  291. package/dist/commands/init/integrations.js +4 -0
  292. package/dist/commands/init/integrations.js.map +1 -0
  293. package/dist/commands/init/languages.d.ts +55 -0
  294. package/dist/commands/init/languages.d.ts.map +1 -0
  295. package/dist/commands/init/languages.js +245 -0
  296. package/dist/commands/init/languages.js.map +1 -0
  297. package/dist/commands/init/product-context.d.ts +63 -0
  298. package/dist/commands/init/product-context.d.ts.map +1 -0
  299. package/dist/commands/init/product-context.js +390 -0
  300. package/dist/commands/init/product-context.js.map +1 -0
  301. package/dist/commands/init/render.d.ts +38 -0
  302. package/dist/commands/init/render.d.ts.map +1 -0
  303. package/dist/commands/init/render.js +501 -0
  304. package/dist/commands/init/render.js.map +1 -0
  305. package/dist/commands/init/report.d.ts +24 -0
  306. package/dist/commands/init/report.d.ts.map +1 -0
  307. package/dist/commands/init/report.js +163 -0
  308. package/dist/commands/init/report.js.map +1 -0
  309. package/dist/commands/init/run.d.ts +71 -0
  310. package/dist/commands/init/run.d.ts.map +1 -0
  311. package/dist/commands/init/run.js +253 -0
  312. package/dist/commands/init/run.js.map +1 -0
  313. package/dist/commands/init/services.d.ts +82 -0
  314. package/dist/commands/init/services.d.ts.map +1 -0
  315. package/dist/commands/init/services.js +209 -0
  316. package/dist/commands/init/services.js.map +1 -0
  317. package/dist/commands/init/storage.d.ts +8 -0
  318. package/dist/commands/init/storage.d.ts.map +1 -0
  319. package/dist/commands/init/storage.js +102 -0
  320. package/dist/commands/init/storage.js.map +1 -0
  321. package/dist/commands/init/toml.d.ts +65 -0
  322. package/dist/commands/init/toml.d.ts.map +1 -0
  323. package/dist/commands/init/toml.js +159 -0
  324. package/dist/commands/init/toml.js.map +1 -0
  325. package/dist/commands/init/topology.d.ts +54 -0
  326. package/dist/commands/init/topology.d.ts.map +1 -0
  327. package/dist/commands/init/topology.js +146 -0
  328. package/dist/commands/init/topology.js.map +1 -0
  329. package/dist/commands/init/types.d.ts +334 -0
  330. package/dist/commands/init/types.d.ts.map +1 -0
  331. package/dist/commands/init/types.js +31 -0
  332. package/dist/commands/init/types.js.map +1 -0
  333. package/dist/commands/init/wizard-terminal.d.ts +36 -0
  334. package/dist/commands/init/wizard-terminal.d.ts.map +1 -0
  335. package/dist/commands/init/wizard-terminal.js +163 -0
  336. package/dist/commands/init/wizard-terminal.js.map +1 -0
  337. package/dist/commands/init/wizard.d.ts +25 -0
  338. package/dist/commands/init/wizard.d.ts.map +1 -0
  339. package/dist/commands/init/wizard.js +358 -0
  340. package/dist/commands/init/wizard.js.map +1 -0
  341. package/dist/commands/mcp.d.ts +4 -0
  342. package/dist/commands/mcp.d.ts.map +1 -0
  343. package/dist/commands/mcp.js +111 -0
  344. package/dist/commands/mcp.js.map +1 -0
  345. package/dist/commands/product-test-runner.d.ts +4 -0
  346. package/dist/commands/product-test-runner.d.ts.map +1 -0
  347. package/dist/commands/product-test-runner.js +85 -0
  348. package/dist/commands/product-test-runner.js.map +1 -0
  349. package/dist/commands/product.d.ts +16 -0
  350. package/dist/commands/product.d.ts.map +1 -0
  351. package/dist/commands/product.js +262 -0
  352. package/dist/commands/product.js.map +1 -0
  353. package/dist/commands/query.d.ts +114 -0
  354. package/dist/commands/query.d.ts.map +1 -0
  355. package/dist/commands/query.js +783 -0
  356. package/dist/commands/query.js.map +1 -0
  357. package/dist/commands/scan.d.ts +10 -0
  358. package/dist/commands/scan.d.ts.map +1 -0
  359. package/dist/commands/scan.js +302 -0
  360. package/dist/commands/scan.js.map +1 -0
  361. package/dist/commands/sdd.d.ts +24 -0
  362. package/dist/commands/sdd.d.ts.map +1 -0
  363. package/dist/commands/sdd.js +195 -0
  364. package/dist/commands/sdd.js.map +1 -0
  365. package/dist/commands/unavailable.d.ts +40 -0
  366. package/dist/commands/unavailable.d.ts.map +1 -0
  367. package/dist/commands/unavailable.js +73 -0
  368. package/dist/commands/unavailable.js.map +1 -0
  369. package/dist/commands/watch/analyze.d.ts +69 -0
  370. package/dist/commands/watch/analyze.d.ts.map +1 -0
  371. package/dist/commands/watch/analyze.js +402 -0
  372. package/dist/commands/watch/analyze.js.map +1 -0
  373. package/dist/commands/watch/cli.d.ts +8 -0
  374. package/dist/commands/watch/cli.d.ts.map +1 -0
  375. package/dist/commands/watch/cli.js +97 -0
  376. package/dist/commands/watch/cli.js.map +1 -0
  377. package/dist/commands/watch/delta.d.ts +46 -0
  378. package/dist/commands/watch/delta.d.ts.map +1 -0
  379. package/dist/commands/watch/delta.js +170 -0
  380. package/dist/commands/watch/delta.js.map +1 -0
  381. package/dist/commands/watch/events.d.ts +214 -0
  382. package/dist/commands/watch/events.d.ts.map +1 -0
  383. package/dist/commands/watch/events.js +13 -0
  384. package/dist/commands/watch/events.js.map +1 -0
  385. package/dist/commands/watch/index.d.ts +19 -0
  386. package/dist/commands/watch/index.d.ts.map +1 -0
  387. package/dist/commands/watch/index.js +15 -0
  388. package/dist/commands/watch/index.js.map +1 -0
  389. package/dist/commands/watch/options.d.ts +43 -0
  390. package/dist/commands/watch/options.d.ts.map +1 -0
  391. package/dist/commands/watch/options.js +193 -0
  392. package/dist/commands/watch/options.js.map +1 -0
  393. package/dist/commands/watch/render.d.ts +26 -0
  394. package/dist/commands/watch/render.d.ts.map +1 -0
  395. package/dist/commands/watch/render.js +175 -0
  396. package/dist/commands/watch/render.js.map +1 -0
  397. package/dist/commands/watch/run.d.ts +14 -0
  398. package/dist/commands/watch/run.d.ts.map +1 -0
  399. package/dist/commands/watch/run.js +460 -0
  400. package/dist/commands/watch/run.js.map +1 -0
  401. package/dist/commands/watch/runtime.d.ts +67 -0
  402. package/dist/commands/watch/runtime.d.ts.map +1 -0
  403. package/dist/commands/watch/runtime.js +149 -0
  404. package/dist/commands/watch/runtime.js.map +1 -0
  405. package/dist/commands/watch-command.d.ts +3 -0
  406. package/dist/commands/watch-command.d.ts.map +1 -0
  407. package/dist/commands/watch-command.js +273 -0
  408. package/dist/commands/watch-command.js.map +1 -0
  409. package/dist/entry-point.d.ts +11 -0
  410. package/dist/entry-point.d.ts.map +1 -0
  411. package/dist/entry-point.js +65 -0
  412. package/dist/entry-point.js.map +1 -0
  413. package/dist/index.d.ts +38 -0
  414. package/dist/index.d.ts.map +1 -0
  415. package/dist/index.js +245 -0
  416. package/dist/index.js.map +1 -0
  417. package/dist/mcp/boundaries-schema.d.ts +262 -0
  418. package/dist/mcp/boundaries-schema.d.ts.map +1 -0
  419. package/dist/mcp/boundaries-schema.js +183 -0
  420. package/dist/mcp/boundaries-schema.js.map +1 -0
  421. package/dist/mcp/default-runtime.d.ts +16 -0
  422. package/dist/mcp/default-runtime.d.ts.map +1 -0
  423. package/dist/mcp/default-runtime.js +718 -0
  424. package/dist/mcp/default-runtime.js.map +1 -0
  425. package/dist/mcp/envelope.d.ts +13 -0
  426. package/dist/mcp/envelope.d.ts.map +1 -0
  427. package/dist/mcp/envelope.js +29 -0
  428. package/dist/mcp/envelope.js.map +1 -0
  429. package/dist/mcp/index.d.ts +8 -0
  430. package/dist/mcp/index.d.ts.map +1 -0
  431. package/dist/mcp/index.js +8 -0
  432. package/dist/mcp/index.js.map +1 -0
  433. package/dist/mcp/output-schemas.d.ts +5928 -0
  434. package/dist/mcp/output-schemas.d.ts.map +1 -0
  435. package/dist/mcp/output-schemas.js +2814 -0
  436. package/dist/mcp/output-schemas.js.map +1 -0
  437. package/dist/mcp/path-sandbox.d.ts +35 -0
  438. package/dist/mcp/path-sandbox.d.ts.map +1 -0
  439. package/dist/mcp/path-sandbox.js +128 -0
  440. package/dist/mcp/path-sandbox.js.map +1 -0
  441. package/dist/mcp/server.d.ts +155 -0
  442. package/dist/mcp/server.d.ts.map +1 -0
  443. package/dist/mcp/server.js +257 -0
  444. package/dist/mcp/server.js.map +1 -0
  445. package/dist/mcp/stdio.d.ts +20 -0
  446. package/dist/mcp/stdio.d.ts.map +1 -0
  447. package/dist/mcp/stdio.js +71 -0
  448. package/dist/mcp/stdio.js.map +1 -0
  449. package/dist/mcp/tools.d.ts +355 -0
  450. package/dist/mcp/tools.d.ts.map +1 -0
  451. package/dist/mcp/tools.js +319 -0
  452. package/dist/mcp/tools.js.map +1 -0
  453. package/dist/mcp/types.d.ts +15 -0
  454. package/dist/mcp/types.d.ts.map +1 -0
  455. package/dist/mcp/types.js +45 -0
  456. package/dist/mcp/types.js.map +1 -0
  457. package/package.json +99 -3
  458. package/src/cli/args.ts +231 -0
  459. package/src/cli/command.ts +146 -0
  460. package/src/cli/deadline.ts +56 -0
  461. package/src/cli/embedder-deadline.ts +187 -0
  462. package/src/cli/exit.ts +94 -0
  463. package/src/cli/graphs.ts +191 -0
  464. package/src/cli/index-freshness.ts +303 -0
  465. package/src/cli/index-refresh.ts +125 -0
  466. package/src/cli/index-state.ts +1217 -0
  467. package/src/cli/io.ts +56 -0
  468. package/src/cli/language-support.ts +203 -0
  469. package/src/cli/renewing-lease.ts +121 -0
  470. package/src/cli/search-graph-enrichment.ts +639 -0
  471. package/src/cli/system.ts +94 -0
  472. package/src/cli/vector-store-policy.ts +213 -0
  473. package/src/cli/version.ts +2 -0
  474. package/src/cli/workspace.ts +324 -0
  475. package/src/commands/complexity.ts +776 -0
  476. package/src/commands/doctor.languages.ts +187 -0
  477. package/src/commands/doctor.storage.ts +124 -0
  478. package/src/commands/doctor.ts +946 -0
  479. package/src/commands/extensions/add.ts +312 -0
  480. package/src/commands/extensions/configure.ts +82 -0
  481. package/src/commands/extensions/container.ts +209 -0
  482. package/src/commands/extensions/context.ts +109 -0
  483. package/src/commands/extensions/enable.ts +237 -0
  484. package/src/commands/extensions/environment.ts +218 -0
  485. package/src/commands/extensions/feature-scan.ts +232 -0
  486. package/src/commands/extensions/invoke.ts +368 -0
  487. package/src/commands/extensions/list.ts +158 -0
  488. package/src/commands/extensions/logs.ts +104 -0
  489. package/src/commands/extensions/provision.ts +206 -0
  490. package/src/commands/extensions/remove.ts +110 -0
  491. package/src/commands/extensions/render.ts +32 -0
  492. package/src/commands/extensions/run.ts +386 -0
  493. package/src/commands/extensions/secret-store.ts +223 -0
  494. package/src/commands/extensions/setup.ts +140 -0
  495. package/src/commands/extensions/source.ts +189 -0
  496. package/src/commands/extensions/state.ts +252 -0
  497. package/src/commands/extensions/status.ts +320 -0
  498. package/src/commands/extensions.ts +280 -0
  499. package/src/commands/flow/index.ts +402 -0
  500. package/src/commands/flow/limits.ts +14 -0
  501. package/src/commands/flow/output.ts +16 -0
  502. package/src/commands/flow/render.ts +318 -0
  503. package/src/commands/flow/select.ts +101 -0
  504. package/src/commands/graph/boundaries-input.ts +63 -0
  505. package/src/commands/graph/boundaries.ts +182 -0
  506. package/src/commands/graph/bounds.ts +25 -0
  507. package/src/commands/graph/category-clusters.ts +194 -0
  508. package/src/commands/graph/feature-3d.ts +141 -0
  509. package/src/commands/graph/feature-clusters.ts +125 -0
  510. package/src/commands/graph/feature-html.ts +336 -0
  511. package/src/commands/graph/feature-map.ts +270 -0
  512. package/src/commands/graph/feature-model.ts +234 -0
  513. package/src/commands/graph/feature-untangle-motion.ts +192 -0
  514. package/src/commands/graph/index.ts +562 -0
  515. package/src/commands/graph/render.ts +503 -0
  516. package/src/commands/graph/select.ts +77 -0
  517. package/src/commands/index/index.ts +595 -0
  518. package/src/commands/index/render.ts +325 -0
  519. package/src/commands/index/target.ts +136 -0
  520. package/src/commands/index-watch.ts +206 -0
  521. package/src/commands/init/command.ts +238 -0
  522. package/src/commands/init/config-draft.ts +235 -0
  523. package/src/commands/init/diff.ts +117 -0
  524. package/src/commands/init/http-probe.ts +150 -0
  525. package/src/commands/init/ignore-rules.ts +170 -0
  526. package/src/commands/init/index.ts +63 -0
  527. package/src/commands/init/integrations-apply.ts +618 -0
  528. package/src/commands/init/integrations-plan.ts +634 -0
  529. package/src/commands/init/integrations.ts +8 -0
  530. package/src/commands/init/languages.ts +320 -0
  531. package/src/commands/init/product-context.ts +576 -0
  532. package/src/commands/init/render.ts +598 -0
  533. package/src/commands/init/report.ts +204 -0
  534. package/src/commands/init/run.ts +349 -0
  535. package/src/commands/init/services.ts +271 -0
  536. package/src/commands/init/storage.ts +136 -0
  537. package/src/commands/init/toml.ts +174 -0
  538. package/src/commands/init/topology.ts +192 -0
  539. package/src/commands/init/types.ts +366 -0
  540. package/src/commands/init/wizard-terminal.ts +206 -0
  541. package/src/commands/init/wizard.ts +450 -0
  542. package/src/commands/mcp.ts +123 -0
  543. package/src/commands/product-test-runner.ts +80 -0
  544. package/src/commands/product.ts +331 -0
  545. package/src/commands/query.ts +1032 -0
  546. package/src/commands/scan.ts +360 -0
  547. package/src/commands/sdd.ts +243 -0
  548. package/src/commands/unavailable.ts +92 -0
  549. package/src/commands/watch/README.md +160 -0
  550. package/src/commands/watch/analyze.ts +600 -0
  551. package/src/commands/watch/cli.ts +108 -0
  552. package/src/commands/watch/delta.ts +186 -0
  553. package/src/commands/watch/events.ts +235 -0
  554. package/src/commands/watch/index.ts +53 -0
  555. package/src/commands/watch/options.ts +234 -0
  556. package/src/commands/watch/render.ts +240 -0
  557. package/src/commands/watch/run.ts +553 -0
  558. package/src/commands/watch/runtime.ts +167 -0
  559. package/src/commands/watch-command.ts +294 -0
  560. package/src/entry-point.ts +67 -0
  561. package/src/index.ts +291 -0
  562. package/src/mcp/boundaries-schema.ts +193 -0
  563. package/src/mcp/default-runtime.ts +1034 -0
  564. package/src/mcp/envelope.ts +57 -0
  565. package/src/mcp/index.ts +28 -0
  566. package/src/mcp/output-schemas.ts +3071 -0
  567. package/src/mcp/path-sandbox.ts +156 -0
  568. package/src/mcp/server.ts +358 -0
  569. package/src/mcp/stdio.ts +92 -0
  570. package/src/mcp/tools.ts +563 -0
  571. package/src/mcp/types.ts +66 -0
@@ -0,0 +1,15 @@
1
+ import type { ExtensionManifestV1 } from "@untangle-code/domain";
2
+ import { type ExtensionEnvironmentV1 } from "./environment.js";
3
+ export declare function secretStorePath(environment: ExtensionEnvironmentV1, id: string): string;
4
+ export declare function credentialEndpoint(url?: string): string | null;
5
+ /** Error messages intentionally contain neither raw JSON nor credential values. */
6
+ export declare function parseSecretValues(value: unknown, manifest: ExtensionManifestV1): Record<string, string>;
7
+ export declare function hasCode(error: unknown, code: string): boolean;
8
+ export declare function readStoredSecrets(environment: ExtensionEnvironmentV1, manifest: ExtensionManifestV1, url?: string | undefined): Promise<Record<string, string>>;
9
+ export declare function secretEnvironment(environment: ExtensionEnvironmentV1, manifest: ExtensionManifestV1, stored: Readonly<Record<string, string>>): Record<string, string | undefined>;
10
+ /** A complete environment override does not depend on an old endpoint's config. */
11
+ export declare function resolveSecretEnvironment(environment: ExtensionEnvironmentV1, manifest: ExtensionManifestV1, url?: string | undefined): Promise<Record<string, string | undefined>>;
12
+ /** Caller holds the per-extension lock while changing stored credentials. */
13
+ export declare function writeStoredSecrets(environment: ExtensionEnvironmentV1, manifest: ExtensionManifestV1, values: Readonly<Record<string, string>>, url?: string | undefined): Promise<void>;
14
+ export declare function withSecretLock<T>(environment: ExtensionEnvironmentV1, id: string, action: () => Promise<T>): Promise<T>;
15
+ //# sourceMappingURL=secret-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-store.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/secret-store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAiC,KAAK,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE9F,wBAAgB,eAAe,CAAC,WAAW,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEvF;AAED,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe9D;AAMD,mFAAmF;AACnF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,mBAAmB,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBxB;AA+BD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,sBAAsB,EACnC,QAAQ,EAAE,mBAAmB,EAC7B,GAAG,qBAA4B,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAuCjC;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,sBAAsB,EACnC,QAAQ,EAAE,mBAAmB,EAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACvC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAMpC;AAED,mFAAmF;AACnF,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,sBAAsB,EACnC,QAAQ,EAAE,mBAAmB,EAC7B,GAAG,qBAA4B,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAS7C;AAED,6EAA6E;AAC7E,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,sBAAsB,EACnC,QAAQ,EAAE,mBAAmB,EAC7B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACxC,GAAG,qBAA4B,GAC9B,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,wBAAsB,cAAc,CAAC,CAAC,EACpC,WAAW,EAAE,sBAAsB,EACnC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC,CAmBZ"}
@@ -0,0 +1,164 @@
1
+ /** Private, endpoint-bound extension credentials; never part of project configuration. */
2
+ import { randomUUID } from "node:crypto";
3
+ import { constants } from "node:fs";
4
+ import { lstat, mkdir, open, rename, rm } from "node:fs/promises";
5
+ import { dirname, join } from "node:path";
6
+ import { canonicalize, isInsideAnyRoot } from "./environment.js";
7
+ export function secretStorePath(environment, id) {
8
+ return join(environment.userDataDir, "extension-secrets", `${id}.json`);
9
+ }
10
+ export function credentialEndpoint(url) {
11
+ if (url === undefined)
12
+ return null;
13
+ const parsed = new URL(url);
14
+ if (!["http:", "https:"].includes(parsed.protocol) ||
15
+ parsed.username ||
16
+ parsed.password ||
17
+ parsed.search ||
18
+ parsed.hash) {
19
+ throw new Error("Credential endpoint must be an HTTP(S) base URL without credentials, query or fragment.");
20
+ }
21
+ return parsed.href.replace(/\/$/u, "");
22
+ }
23
+ function isRecord(value) {
24
+ return value !== null && typeof value === "object" && !Array.isArray(value);
25
+ }
26
+ /** Error messages intentionally contain neither raw JSON nor credential values. */
27
+ export function parseSecretValues(value, manifest) {
28
+ if (!isRecord(value))
29
+ throw new Error("Credential configuration must be an object keyed by declared secret names.");
30
+ const declared = new Set(manifest.secrets.map((secret) => secret.name));
31
+ const entries = Object.entries(value);
32
+ if (entries.some(([name, secret]) => !declared.has(name) || typeof secret !== "string" || secret.includes("\0"))) {
33
+ throw new Error("Credential configuration contains an undeclared secret or a non-string value.");
34
+ }
35
+ return Object.fromEntries(entries);
36
+ }
37
+ async function checkDirectory(environment, create) {
38
+ const directory = dirname(secretStorePath(environment, "placeholder"));
39
+ const canonical = await canonicalize(environment.fs, directory);
40
+ if (isInsideAnyRoot(canonical, environment.projectRoots)) {
41
+ throw new Error("Extension credentials must be stored outside project directories.");
42
+ }
43
+ if (create)
44
+ await mkdir(directory, { recursive: true, mode: 0o700 });
45
+ try {
46
+ const info = await lstat(directory);
47
+ if (!info.isDirectory() ||
48
+ info.isSymbolicLink() ||
49
+ (process.platform !== "win32" &&
50
+ ((info.mode & 0o077) !== 0 || info.uid !== process.getuid?.()))) {
51
+ throw new Error(`Credential directory must be owned by this user with mode 0700: ${directory}`);
52
+ }
53
+ }
54
+ catch (error) {
55
+ if (hasCode(error, "ENOENT") && !create)
56
+ return directory;
57
+ throw error;
58
+ }
59
+ return directory;
60
+ }
61
+ export function hasCode(error, code) {
62
+ return isRecord(error) && error["code"] === code;
63
+ }
64
+ export async function readStoredSecrets(environment, manifest, url = manifest.http?.defaultUrl) {
65
+ if (manifest.secrets.length === 0)
66
+ return {};
67
+ await checkDirectory(environment, false);
68
+ const path = secretStorePath(environment, manifest.id);
69
+ let handle;
70
+ try {
71
+ handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
72
+ }
73
+ catch (error) {
74
+ if (hasCode(error, "ENOENT"))
75
+ return {};
76
+ throw new Error(`Cannot safely open credential configuration: ${path}`);
77
+ }
78
+ try {
79
+ const info = await handle.stat();
80
+ if (!info.isFile() ||
81
+ info.size > 1_048_576 ||
82
+ (process.platform !== "win32" &&
83
+ ((info.mode & 0o077) !== 0 || info.uid !== process.getuid?.()))) {
84
+ throw new Error(`Credential configuration must be a user-owned file with mode 0600: ${path}`);
85
+ }
86
+ let value;
87
+ try {
88
+ value = JSON.parse(await handle.readFile("utf8"));
89
+ }
90
+ catch {
91
+ throw new Error(`Invalid JSON in credential configuration: ${path}`);
92
+ }
93
+ if (!isRecord(value) || value["schemaVersion"] !== 1 || value["extensionId"] !== manifest.id) {
94
+ throw new Error(`Invalid credential configuration schema: ${path}`);
95
+ }
96
+ if (value["endpoint"] !== credentialEndpoint(url)) {
97
+ throw new Error("Stored credentials belong to a different endpoint; configure credentials for the selected endpoint first.");
98
+ }
99
+ return parseSecretValues(value["secrets"], manifest);
100
+ }
101
+ finally {
102
+ await handle.close();
103
+ }
104
+ }
105
+ export function secretEnvironment(environment, manifest, stored) {
106
+ const env = { ...environment.env };
107
+ for (const secret of manifest.secrets) {
108
+ if (!env[secret.envVar] && stored[secret.name])
109
+ env[secret.envVar] = stored[secret.name];
110
+ }
111
+ return env;
112
+ }
113
+ /** A complete environment override does not depend on an old endpoint's config. */
114
+ export async function resolveSecretEnvironment(environment, manifest, url = manifest.http?.defaultUrl) {
115
+ const needsStoredValues = manifest.secrets.some((secret) => !secret.setupOnly && !environment.env[secret.envVar]);
116
+ return secretEnvironment(environment, manifest, needsStoredValues ? await readStoredSecrets(environment, manifest, url) : {});
117
+ }
118
+ /** Caller holds the per-extension lock while changing stored credentials. */
119
+ export async function writeStoredSecrets(environment, manifest, values, url = manifest.http?.defaultUrl) {
120
+ await checkDirectory(environment, true);
121
+ const secrets = parseSecretValues(values, manifest);
122
+ const path = secretStorePath(environment, manifest.id);
123
+ const temporary = `${path}.${randomUUID()}.tmp`;
124
+ try {
125
+ const handle = await open(temporary, "wx", 0o600);
126
+ try {
127
+ await handle.writeFile(JSON.stringify({
128
+ schemaVersion: 1,
129
+ extensionId: manifest.id,
130
+ endpoint: credentialEndpoint(url),
131
+ secrets,
132
+ }, null, 2) + "\n");
133
+ await handle.sync();
134
+ }
135
+ finally {
136
+ await handle.close();
137
+ }
138
+ await rename(temporary, path);
139
+ }
140
+ finally {
141
+ await rm(temporary, { force: true });
142
+ }
143
+ }
144
+ export async function withSecretLock(environment, id, action) {
145
+ const directory = await checkDirectory(environment, true);
146
+ const path = join(directory, `${id}.lock`);
147
+ let handle;
148
+ try {
149
+ handle = await open(path, "wx", 0o600);
150
+ }
151
+ catch (error) {
152
+ if (hasCode(error, "EEXIST"))
153
+ throw new Error(`Credential setup is already locked for ${id}; retry after it finishes. If interrupted, inspect and remove ${path}.`);
154
+ throw new Error("Cannot lock the private credential store.");
155
+ }
156
+ try {
157
+ return await action();
158
+ }
159
+ finally {
160
+ await handle.close();
161
+ await rm(path, { force: true });
162
+ }
163
+ }
164
+ //# sourceMappingURL=secret-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-store.js","sourceRoot":"","sources":["../../../src/commands/extensions/secret-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** Runs a user-supplied setup provider after consent, ownership and digest checks. */
2
+ import type { ExtensionManifestV1 } from "@untangle-code/domain";
3
+ import { type ProcessLimitsV1, type ProcessRunnerPort } from "@untangle-code/extension-runtime";
4
+ import type { ExtensionEnvironmentV1 } from "./environment.js";
5
+ import { type ProvisionResultV1 } from "./provision.js";
6
+ export declare function missingAnalyzerSecrets(manifest: ExtensionManifestV1, env: Readonly<Record<string, string | undefined>>): string[];
7
+ export declare function setupCredentials(input: {
8
+ environment: ExtensionEnvironmentV1;
9
+ manifest: ExtensionManifestV1;
10
+ provision?: ProvisionResultV1;
11
+ consent: boolean;
12
+ url?: string;
13
+ processRunner: ProcessRunnerPort;
14
+ limits: ProcessLimitsV1;
15
+ signal?: AbortSignal;
16
+ }): Promise<Record<string, string | undefined>>;
17
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/setup.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAUzE,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,mBAAmB,EAC7B,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GAChD,MAAM,EAAE,CASV;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,WAAW,EAAE,sBAAsB,CAAC;IACpC,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,iBAAiB,CAAC;IACjC,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAiG9C"}
@@ -0,0 +1,94 @@
1
+ import { isLoopbackUrl, } from "@untangle-code/extension-runtime";
2
+ import { primaryHostPort } from "./provision.js";
3
+ import { credentialEndpoint, parseSecretValues, readStoredSecrets, secretEnvironment, withSecretLock, writeStoredSecrets, } from "./secret-store.js";
4
+ export function missingAnalyzerSecrets(manifest, env) {
5
+ return manifest.secrets
6
+ .filter((secret) => !secret.setupOnly &&
7
+ (secret.required || secret.name === manifest.http?.authSecretName) &&
8
+ !env[secret.envVar])
9
+ .map((secret) => secret.name);
10
+ }
11
+ export async function setupCredentials(input) {
12
+ const { environment, manifest, provision } = input;
13
+ const setup = manifest.setup;
14
+ if (!input.consent)
15
+ throw new Error("Credential setup requires --yes.");
16
+ if (!setup ||
17
+ !manifest.container ||
18
+ !provision?.healthy ||
19
+ !provision.state.running ||
20
+ !provision.state.ownedByUntangle ||
21
+ provision.state.imageDigest !== manifest.container.digest) {
22
+ throw new Error("Credential setup requires a healthy, owned container whose digest matches the manifest.");
23
+ }
24
+ const url = input.url ?? manifest.http?.defaultUrl;
25
+ if (!url ||
26
+ !isLoopbackUrl(url) ||
27
+ credentialEndpoint(url) !== credentialEndpoint(manifest.http?.defaultUrl)) {
28
+ throw new Error("Credential setup only uses the declared loopback endpoint of the managed container.");
29
+ }
30
+ const endpoint = new URL(url);
31
+ if (Number(endpoint.port || (endpoint.protocol === "https:" ? 443 : 80)) !==
32
+ primaryHostPort(manifest)) {
33
+ throw new Error("Credential setup endpoint must match the managed container's published port.");
34
+ }
35
+ return withSecretLock(environment, manifest.id, async () => {
36
+ input.signal?.throwIfAborted();
37
+ const stored = await readStoredSecrets(environment, manifest, url);
38
+ const effectiveEnv = secretEnvironment(environment, manifest, stored);
39
+ if (missingAnalyzerSecrets(manifest, effectiveEnv).length === 0)
40
+ return effectiveEnv;
41
+ const env = {
42
+ PATH: environment.env["PATH"] ?? "",
43
+ UNTANGLE_SETUP_URL: url,
44
+ UNTANGLE_SETUP_ID: manifest.id,
45
+ };
46
+ for (const name of ["HOME", "LANG"]) {
47
+ const value = environment.env[name];
48
+ if (value !== undefined)
49
+ env[name] = value;
50
+ }
51
+ for (const secret of manifest.secrets) {
52
+ const value = effectiveEnv[secret.envVar];
53
+ if (value)
54
+ env[secret.envVar] = value;
55
+ }
56
+ const result = await input.processRunner.run({
57
+ command: setup.command,
58
+ args: setup.args,
59
+ cwd: environment.userDataDir,
60
+ env,
61
+ }, {
62
+ ...input.limits,
63
+ timeoutMs: Math.min(input.limits.timeoutMs, 120_000),
64
+ maxOutputBytes: 1_048_576,
65
+ }, input.signal === undefined ? {} : { signal: input.signal });
66
+ input.signal?.throwIfAborted();
67
+ // Neither stdout nor stderr may appear in diagnostics: both can contain freshly issued secrets.
68
+ if (result.outcome !== "completed" || result.exitCode !== 0 || result.stdoutTruncated) {
69
+ throw new Error(`Credential setup provider failed (${result.outcome}, exit ${String(result.exitCode)}). Check the configured administrator credentials and service availability.`);
70
+ }
71
+ let response;
72
+ try {
73
+ response = JSON.parse(result.stdout);
74
+ }
75
+ catch {
76
+ throw new Error("Credential setup provider returned invalid JSON; output was withheld.");
77
+ }
78
+ if (response === null ||
79
+ typeof response !== "object" ||
80
+ !("schemaVersion" in response) ||
81
+ response.schemaVersion !== 1 ||
82
+ !("secrets" in response)) {
83
+ throw new Error("Credential setup provider must return schemaVersion 1 and declared secrets; output was withheld.");
84
+ }
85
+ const generated = parseSecretValues(response.secrets, manifest);
86
+ const combined = { ...stored, ...generated };
87
+ const resolved = secretEnvironment(environment, manifest, combined);
88
+ if (missingAnalyzerSecrets(manifest, resolved).length > 0)
89
+ throw new Error("Credential setup provider did not supply the required analyzer secrets.");
90
+ await writeStoredSecrets(environment, manifest, combined, url);
91
+ return resolved;
92
+ });
93
+ }
94
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/commands/extensions/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { FileSystemPort } from "@untangle-code/domain";
2
+ /** Largest manifest this CLI will accept from a URL. */
3
+ export declare const MAX_MANIFEST_BYTES: number;
4
+ /** Network read budget for one manifest fetch. */
5
+ export declare const FETCH_TIMEOUT_MS = 30000;
6
+ export declare const DIGEST_PATTERN: RegExp;
7
+ export interface ManifestSourceV1 {
8
+ kind: "path" | "url";
9
+ /** What the user typed, for the report. */
10
+ requested: string;
11
+ /** Absolute path or final URL the bytes actually came from. */
12
+ resolved: string;
13
+ bytes: Uint8Array;
14
+ text: string;
15
+ /** `sha256:<64 hex>` over `bytes`. */
16
+ digest: string;
17
+ }
18
+ export declare class ManifestSourceError extends Error {
19
+ constructor(message: string);
20
+ }
21
+ /** True when the argument looks like a URL rather than a path. */
22
+ export declare function isUrlSource(from: string): boolean;
23
+ export declare function digestOf(bytes: Uint8Array): string;
24
+ export interface FetchManifestOptions {
25
+ /** Injected so unit tests never touch the network (CONTRIBUTING, §13). */
26
+ fetchImpl?: typeof fetch;
27
+ maxBytes?: number;
28
+ timeoutMs?: number;
29
+ signal?: AbortSignal;
30
+ }
31
+ /**
32
+ * Reads a manifest from a local path.
33
+ *
34
+ * `path` may be the manifest file or the directory containing it; the same
35
+ * convenience `loadExtensionFrom` offers, applied to the raw bytes so the
36
+ * digest is computed over the file that will actually be installed.
37
+ */
38
+ export declare function readManifestFromPath(fs: FileSystemPort, path: string): Promise<ManifestSourceV1>;
39
+ /**
40
+ * Downloads a manifest over https.
41
+ *
42
+ * Redirects are followed but the FINAL url is reported, so a redirect never
43
+ * hides where the bytes came from. The mandatory `--digest` check happens in
44
+ * the caller, against whatever this returns.
45
+ */
46
+ export declare function fetchManifestFromUrl(url: string, options?: FetchManifestOptions): Promise<ManifestSourceV1>;
47
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/source.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,QAAa,CAAC;AAE7C,kDAAkD;AAClD,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC,eAAO,MAAM,cAAc,QAA0B,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,mBAAoB,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAInC;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAElD;AAED,MAAM,WAAW,oBAAoB;IACnC,0EAA0E;IAC1E,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,gBAAgB,CAAC,CAsB3B;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,gBAAgB,CAAC,CAkE3B"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Where an `add` gets its manifest from, and what it must prove first.
3
+ *
4
+ * A manifest is a description of how to start a program. Fetching one over
5
+ * the network and writing it into the user profile is therefore a supply-chain
6
+ * step, and it is treated like one:
7
+ *
8
+ * - **https only.** Plain http would let anyone on the path replace the
9
+ * invocation. There is no `--insecure` escape hatch; a local copy plus
10
+ * `--from <path>` is the supported answer for an internal http host.
11
+ * - **`--digest` is mandatory for a URL.** Without it, "the file at this URL"
12
+ * is not a fixed artifact — it is whatever the server serves today. This is
13
+ * the same reason X6 forbids moving image tags: an artifact that can change
14
+ * under a stable name changes findings silently.
15
+ * - **A size ceiling.** A manifest is a small TOML file; an endless response
16
+ * must not become an endless allocation.
17
+ *
18
+ * The digest is sha256 over the RAW BYTES, which is exactly what
19
+ * `shasum -a 256 <file>` and `sha256sum <file>` print — so the value a
20
+ * publisher advertises can be verified by hand.
21
+ */
22
+ import { createHash } from "node:crypto";
23
+ import { MANIFEST_FILE_NAME } from "@untangle-code/extension-runtime";
24
+ /** Largest manifest this CLI will accept from a URL. */
25
+ export const MAX_MANIFEST_BYTES = 256 * 1024;
26
+ /** Network read budget for one manifest fetch. */
27
+ export const FETCH_TIMEOUT_MS = 30_000;
28
+ export const DIGEST_PATTERN = /^sha256:[0-9a-f]{64}$/;
29
+ export class ManifestSourceError extends Error {
30
+ constructor(message) {
31
+ super(message);
32
+ this.name = "ManifestSourceError";
33
+ }
34
+ }
35
+ /** True when the argument looks like a URL rather than a path. */
36
+ export function isUrlSource(from) {
37
+ return /^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(from);
38
+ }
39
+ export function digestOf(bytes) {
40
+ return `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
41
+ }
42
+ /**
43
+ * Reads a manifest from a local path.
44
+ *
45
+ * `path` may be the manifest file or the directory containing it; the same
46
+ * convenience `loadExtensionFrom` offers, applied to the raw bytes so the
47
+ * digest is computed over the file that will actually be installed.
48
+ */
49
+ export async function readManifestFromPath(fs, path) {
50
+ const stat = await fs.stat(path);
51
+ if (stat === null) {
52
+ throw new ManifestSourceError(`no such file or directory: "${path}"`);
53
+ }
54
+ const filePath = stat.kind === "directory" ? `${path}/${MANIFEST_FILE_NAME}` : path;
55
+ let bytes;
56
+ try {
57
+ bytes = await fs.readFile(filePath);
58
+ }
59
+ catch (cause) {
60
+ throw new ManifestSourceError(`cannot read "${filePath}": ${cause instanceof Error ? cause.message : String(cause)}`);
61
+ }
62
+ return {
63
+ kind: "path",
64
+ requested: path,
65
+ resolved: filePath,
66
+ bytes,
67
+ text: new TextDecoder("utf-8", { fatal: false }).decode(bytes),
68
+ digest: digestOf(bytes),
69
+ };
70
+ }
71
+ /**
72
+ * Downloads a manifest over https.
73
+ *
74
+ * Redirects are followed but the FINAL url is reported, so a redirect never
75
+ * hides where the bytes came from. The mandatory `--digest` check happens in
76
+ * the caller, against whatever this returns.
77
+ */
78
+ export async function fetchManifestFromUrl(url, options = {}) {
79
+ const parsed = safeParseUrl(url);
80
+ if (parsed === null) {
81
+ throw new ManifestSourceError(`"${url}" is not a valid URL`);
82
+ }
83
+ if (parsed.protocol !== "https:") {
84
+ throw new ManifestSourceError(`refusing to download a manifest over "${parsed.protocol}//" — ` +
85
+ "a manifest describes how to start a program, so the transport must be authenticated. " +
86
+ "Download it yourself and install the local copy with --from <path>");
87
+ }
88
+ const fetchImpl = options.fetchImpl ?? fetch;
89
+ const maxBytes = options.maxBytes ?? MAX_MANIFEST_BYTES;
90
+ const controller = new AbortController();
91
+ const timer = setTimeout(() => {
92
+ controller.abort();
93
+ }, options.timeoutMs ?? FETCH_TIMEOUT_MS);
94
+ options.signal?.addEventListener("abort", () => {
95
+ controller.abort();
96
+ });
97
+ try {
98
+ const response = await fetchImpl(parsed.toString(), {
99
+ redirect: "follow",
100
+ signal: controller.signal,
101
+ headers: { accept: "text/plain, application/toml, */*" },
102
+ });
103
+ if (!response.ok) {
104
+ throw new ManifestSourceError(`${parsed.toString()} answered HTTP ${String(response.status)}; no manifest was installed`);
105
+ }
106
+ const buffer = new Uint8Array(await response.arrayBuffer());
107
+ if (buffer.byteLength > maxBytes) {
108
+ throw new ManifestSourceError(`the response is ${String(buffer.byteLength)} bytes, above the ${String(maxBytes)}-byte ` +
109
+ "ceiling for a manifest; nothing was installed");
110
+ }
111
+ const resolved = typeof response.url === "string" && response.url !== "" ? response.url : parsed.toString();
112
+ return {
113
+ kind: "url",
114
+ requested: url,
115
+ resolved,
116
+ bytes: buffer,
117
+ text: new TextDecoder("utf-8", { fatal: false }).decode(buffer),
118
+ digest: digestOf(buffer),
119
+ };
120
+ }
121
+ catch (cause) {
122
+ if (cause instanceof ManifestSourceError) {
123
+ throw cause;
124
+ }
125
+ if (controller.signal.aborted) {
126
+ throw new ManifestSourceError(`downloading ${parsed.toString()} exceeded the ${String(options.timeoutMs ?? FETCH_TIMEOUT_MS)} ms budget`);
127
+ }
128
+ throw new ManifestSourceError(`cannot download ${parsed.toString()}: ${cause instanceof Error ? cause.message : String(cause)}`);
129
+ }
130
+ finally {
131
+ clearTimeout(timer);
132
+ }
133
+ }
134
+ function safeParseUrl(url) {
135
+ try {
136
+ return new URL(url);
137
+ }
138
+ catch {
139
+ return null;
140
+ }
141
+ }
142
+ //# sourceMappingURL=source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../../src/commands/extensions/source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { FileSystemPort } from "@untangle-code/domain";
2
+ import { ACKNOWLEDGMENT_FILE_NAME, type ExtensionRunV1, type LicenseAcknowledgmentV1 } from "@untangle-code/extension-runtime";
3
+ /** File name of the CLI's own state, next to the acknowledgment file. */
4
+ export declare const CLI_STATE_FILE_NAME = "cli-state.json";
5
+ /** Summary of one finished run — enough for `list`, not a substitute for it. */
6
+ export interface LastRunRecordV1 {
7
+ runId: string;
8
+ startedAt: string;
9
+ finishedAt?: string;
10
+ exitStatus: ExtensionRunV1["exitStatus"];
11
+ findingsTotal: number;
12
+ errorCode?: string;
13
+ }
14
+ export interface CliStateV1 {
15
+ schemaVersion: 1;
16
+ /** Extension ids the user enabled (X1: enabling starts nothing). */
17
+ enabled: string[];
18
+ lastRuns: Record<string, LastRunRecordV1>;
19
+ }
20
+ export declare function summarizeRun(run: ExtensionRunV1): LastRunRecordV1;
21
+ export declare function emptyCliState(): CliStateV1;
22
+ export declare function cliStatePath(userDataDirectory: string): string;
23
+ /** Result of reading a state file: the state plus anything unreadable (E4). */
24
+ export interface LoadedCliStateV1 {
25
+ state: CliStateV1;
26
+ warnings: string[];
27
+ }
28
+ /**
29
+ * Reads the CLI state. A missing file means "nothing enabled, nothing run" —
30
+ * a valid starting state, not an error. A corrupt file is reported and
31
+ * treated as empty rather than crashing the command (X2).
32
+ */
33
+ export declare function loadCliState(fs: FileSystemPort, userDataDirectory: string): Promise<LoadedCliStateV1>;
34
+ export declare function saveCliState(fs: FileSystemPort, userDataDirectory: string, state: CliStateV1): Promise<string>;
35
+ /** Where acknowledgments are written; re-exported so callers need one import. */
36
+ export declare function acknowledgmentPath(userDataDirectory: string): string;
37
+ export { ACKNOWLEDGMENT_FILE_NAME };
38
+ /**
39
+ * Writes the acknowledgment file. Entries are ordered by
40
+ * `(extensionId, ruleset)` via codepoint comparison so the file has one
41
+ * canonical form — a diff between two machines shows real changes only.
42
+ */
43
+ export declare function saveAcknowledgments(fs: FileSystemPort, userDataDirectory: string, acknowledgments: readonly LicenseAcknowledgmentV1[]): Promise<string>;
44
+ /**
45
+ * Replaces the entry for one `(extensionId, ruleset)` pair, keeping the rest.
46
+ * A repeated acknowledgment updates in place instead of stacking duplicates.
47
+ */
48
+ export declare function upsertAcknowledgment(existing: readonly LicenseAcknowledgmentV1[], entry: LicenseAcknowledgmentV1): LicenseAcknowledgmentV1[];
49
+ /**
50
+ * Marks every acknowledgment for one extension as withdrawn (§9.3).
51
+ *
52
+ * The entry is kept and stamped with `revokedAt` rather than deleted. Both
53
+ * shapes refuse the run, so this is not about safety — it is about what the
54
+ * user can be told afterwards. A deleted row makes "you never acknowledged
55
+ * this" and "you acknowledged this and took it back" indistinguishable, and
56
+ * §9.3 asks `status` to be able to show the gate status `revoked`, which a
57
+ * deleted row can never produce.
58
+ */
59
+ export declare function revokeAcknowledgments(existing: readonly LicenseAcknowledgmentV1[], extensionId: string, revokedAt: string): LicenseAcknowledgmentV1[];
60
+ /** Drops every acknowledgment for one extension — used when it is uninstalled. */
61
+ export declare function removeAcknowledgments(existing: readonly LicenseAcknowledgmentV1[], extensionId: string): LicenseAcknowledgmentV1[];
62
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/commands/extensions/state.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EACL,wBAAwB,EAExB,KAAK,cAAc,EAEnB,KAAK,uBAAuB,EAC7B,MAAM,kCAAkC,CAAC;AAE1C,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAEpD,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC;IACzC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,CAAC,CAAC;IACjB,oEAAoE;IACpE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC3C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,eAAe,CASjE;AAED,wBAAgB,aAAa,IAAI,UAAU,CAE1C;AAED,wBAAgB,YAAY,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,+EAA+E;AAC/E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,EAAE,EAAE,cAAc,EAClB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,gBAAgB,CAAC,CAyC3B;AA8BD,wBAAsB,YAAY,CAChC,EAAE,EAAE,cAAc,EAClB,iBAAiB,EAAE,MAAM,EACzB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,MAAM,CAAC,CAWjB;AAED,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,OAAO,EAAE,wBAAwB,EAAE,CAAC;AAEpC;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,cAAc,EAClB,iBAAiB,EAAE,MAAM,EACzB,eAAe,EAAE,SAAS,uBAAuB,EAAE,GAClD,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,SAAS,uBAAuB,EAAE,EAC5C,KAAK,EAAE,uBAAuB,GAC7B,uBAAuB,EAAE,CAO3B;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,SAAS,uBAAuB,EAAE,EAC5C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,uBAAuB,EAAE,CAM3B;AAED,kFAAkF;AAClF,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,SAAS,uBAAuB,EAAE,EAC5C,WAAW,EAAE,MAAM,GAClB,uBAAuB,EAAE,CAE3B"}