@fntio/infra-client 0.0.0-stage → 0.5.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 (940) hide show
  1. package/CHANGELOG.md +193 -0
  2. package/LICENSE +93 -0
  3. package/README.md +875 -2
  4. package/assets/acl-reconciler/index.js +1604 -0
  5. package/assets/api/index.js +9857 -0
  6. package/assets/api/package.json +9 -0
  7. package/assets/api/vendor_modules/.package-lock.json +857 -0
  8. package/assets/api/vendor_modules/accepts/HISTORY.md +243 -0
  9. package/assets/api/vendor_modules/accepts/LICENSE +23 -0
  10. package/assets/api/vendor_modules/accepts/README.md +140 -0
  11. package/assets/api/vendor_modules/accepts/index.js +238 -0
  12. package/assets/api/vendor_modules/accepts/package.json +47 -0
  13. package/assets/api/vendor_modules/array-flatten/LICENSE +21 -0
  14. package/assets/api/vendor_modules/array-flatten/README.md +43 -0
  15. package/assets/api/vendor_modules/array-flatten/array-flatten.js +64 -0
  16. package/assets/api/vendor_modules/array-flatten/package.json +39 -0
  17. package/assets/api/vendor_modules/aws-jwt-verify/LICENSE +175 -0
  18. package/assets/api/vendor_modules/aws-jwt-verify/README.md +1033 -0
  19. package/assets/api/vendor_modules/aws-jwt-verify/asn1.d.ts +20 -0
  20. package/assets/api/vendor_modules/aws-jwt-verify/assert.d.ts +41 -0
  21. package/assets/api/vendor_modules/aws-jwt-verify/cognito-verifier.d.ts +183 -0
  22. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/asn1.js +301 -0
  23. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/assert.js +108 -0
  24. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/cognito-verifier.js +158 -0
  25. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/error.js +131 -0
  26. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/https-common.js +29 -0
  27. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/https-node.js +89 -0
  28. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/https.js +52 -0
  29. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/index.js +9 -0
  30. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/jwk.js +221 -0
  31. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/jwt-model.js +10 -0
  32. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/jwt-rsa.js +397 -0
  33. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/jwt.js +161 -0
  34. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/node-web-compat-node.js +48 -0
  35. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/node-web-compat-web.js +78 -0
  36. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/node-web-compat.js +11 -0
  37. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/package.json +1 -0
  38. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/safe-json-parse.js +34 -0
  39. package/assets/api/vendor_modules/aws-jwt-verify/dist/cjs/typing-util.js +6 -0
  40. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/asn1.js +296 -0
  41. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/assert.js +101 -0
  42. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/cognito-verifier.js +153 -0
  43. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/error.js +101 -0
  44. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/https-common.js +25 -0
  45. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/https-node.js +85 -0
  46. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/https.js +48 -0
  47. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/index.js +4 -0
  48. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/jwk.js +208 -0
  49. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/jwt-model.js +7 -0
  50. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/jwt-rsa.js +389 -0
  51. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/jwt.js +156 -0
  52. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/node-web-compat-node.js +45 -0
  53. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/node-web-compat-web.js +75 -0
  54. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/node-web-compat.js +10 -0
  55. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/package.json +1 -0
  56. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/safe-json-parse.js +29 -0
  57. package/assets/api/vendor_modules/aws-jwt-verify/dist/esm/typing-util.js +5 -0
  58. package/assets/api/vendor_modules/aws-jwt-verify/error.d.ts +108 -0
  59. package/assets/api/vendor_modules/aws-jwt-verify/https-common.d.ts +9 -0
  60. package/assets/api/vendor_modules/aws-jwt-verify/https-node.d.ts +20 -0
  61. package/assets/api/vendor_modules/aws-jwt-verify/https.d.ts +35 -0
  62. package/assets/api/vendor_modules/aws-jwt-verify/index.d.ts +2 -0
  63. package/assets/api/vendor_modules/aws-jwt-verify/jwk.d.ts +76 -0
  64. package/assets/api/vendor_modules/aws-jwt-verify/jwt-model.d.ts +78 -0
  65. package/assets/api/vendor_modules/aws-jwt-verify/jwt-rsa.d.ts +348 -0
  66. package/assets/api/vendor_modules/aws-jwt-verify/jwt.d.ts +51 -0
  67. package/assets/api/vendor_modules/aws-jwt-verify/package.json +136 -0
  68. package/assets/api/vendor_modules/aws-jwt-verify/safe-json-parse.d.ts +18 -0
  69. package/assets/api/vendor_modules/aws-jwt-verify/typing-util.d.ts +38 -0
  70. package/assets/api/vendor_modules/body-parser/HISTORY.md +703 -0
  71. package/assets/api/vendor_modules/body-parser/LICENSE +23 -0
  72. package/assets/api/vendor_modules/body-parser/README.md +476 -0
  73. package/assets/api/vendor_modules/body-parser/index.js +156 -0
  74. package/assets/api/vendor_modules/body-parser/lib/read.js +205 -0
  75. package/assets/api/vendor_modules/body-parser/lib/types/json.js +247 -0
  76. package/assets/api/vendor_modules/body-parser/lib/types/raw.js +105 -0
  77. package/assets/api/vendor_modules/body-parser/lib/types/text.js +125 -0
  78. package/assets/api/vendor_modules/body-parser/lib/types/urlencoded.js +303 -0
  79. package/assets/api/vendor_modules/body-parser/node_modules/qs/.editorconfig +46 -0
  80. package/assets/api/vendor_modules/body-parser/node_modules/qs/.github/FUNDING.yml +12 -0
  81. package/assets/api/vendor_modules/body-parser/node_modules/qs/.github/SECURITY.md +11 -0
  82. package/assets/api/vendor_modules/body-parser/node_modules/qs/.github/THREAT_MODEL.md +80 -0
  83. package/assets/api/vendor_modules/body-parser/node_modules/qs/.nycrc +13 -0
  84. package/assets/api/vendor_modules/body-parser/node_modules/qs/CHANGELOG.md +872 -0
  85. package/assets/api/vendor_modules/body-parser/node_modules/qs/LICENSE.md +29 -0
  86. package/assets/api/vendor_modules/body-parser/node_modules/qs/README.md +804 -0
  87. package/assets/api/vendor_modules/body-parser/node_modules/qs/dist/qs.js +141 -0
  88. package/assets/api/vendor_modules/body-parser/node_modules/qs/eslint.config.mjs +57 -0
  89. package/assets/api/vendor_modules/body-parser/node_modules/qs/lib/formats.js +23 -0
  90. package/assets/api/vendor_modules/body-parser/node_modules/qs/lib/index.js +11 -0
  91. package/assets/api/vendor_modules/body-parser/node_modules/qs/lib/parse.js +503 -0
  92. package/assets/api/vendor_modules/body-parser/node_modules/qs/lib/stringify.js +378 -0
  93. package/assets/api/vendor_modules/body-parser/node_modules/qs/lib/utils.js +512 -0
  94. package/assets/api/vendor_modules/body-parser/node_modules/qs/package.json +95 -0
  95. package/assets/api/vendor_modules/body-parser/node_modules/qs/test/empty-keys-cases.js +267 -0
  96. package/assets/api/vendor_modules/body-parser/node_modules/qs/test/parse.js +2296 -0
  97. package/assets/api/vendor_modules/body-parser/node_modules/qs/test/stringify.js +1995 -0
  98. package/assets/api/vendor_modules/body-parser/node_modules/qs/test/utils.js +822 -0
  99. package/assets/api/vendor_modules/body-parser/package.json +55 -0
  100. package/assets/api/vendor_modules/bytes/History.md +97 -0
  101. package/assets/api/vendor_modules/bytes/LICENSE +23 -0
  102. package/assets/api/vendor_modules/bytes/Readme.md +152 -0
  103. package/assets/api/vendor_modules/bytes/index.js +170 -0
  104. package/assets/api/vendor_modules/bytes/package.json +42 -0
  105. package/assets/api/vendor_modules/call-bind-apply-helpers/.eslintrc +17 -0
  106. package/assets/api/vendor_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
  107. package/assets/api/vendor_modules/call-bind-apply-helpers/.nycrc +9 -0
  108. package/assets/api/vendor_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
  109. package/assets/api/vendor_modules/call-bind-apply-helpers/LICENSE +21 -0
  110. package/assets/api/vendor_modules/call-bind-apply-helpers/README.md +62 -0
  111. package/assets/api/vendor_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
  112. package/assets/api/vendor_modules/call-bind-apply-helpers/actualApply.js +10 -0
  113. package/assets/api/vendor_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
  114. package/assets/api/vendor_modules/call-bind-apply-helpers/applyBind.js +10 -0
  115. package/assets/api/vendor_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
  116. package/assets/api/vendor_modules/call-bind-apply-helpers/functionApply.js +4 -0
  117. package/assets/api/vendor_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
  118. package/assets/api/vendor_modules/call-bind-apply-helpers/functionCall.js +4 -0
  119. package/assets/api/vendor_modules/call-bind-apply-helpers/index.d.ts +64 -0
  120. package/assets/api/vendor_modules/call-bind-apply-helpers/index.js +15 -0
  121. package/assets/api/vendor_modules/call-bind-apply-helpers/package.json +85 -0
  122. package/assets/api/vendor_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
  123. package/assets/api/vendor_modules/call-bind-apply-helpers/reflectApply.js +4 -0
  124. package/assets/api/vendor_modules/call-bind-apply-helpers/test/index.js +63 -0
  125. package/assets/api/vendor_modules/call-bind-apply-helpers/tsconfig.json +9 -0
  126. package/assets/api/vendor_modules/call-bound/.eslintrc +13 -0
  127. package/assets/api/vendor_modules/call-bound/.github/FUNDING.yml +12 -0
  128. package/assets/api/vendor_modules/call-bound/.nycrc +9 -0
  129. package/assets/api/vendor_modules/call-bound/CHANGELOG.md +42 -0
  130. package/assets/api/vendor_modules/call-bound/LICENSE +21 -0
  131. package/assets/api/vendor_modules/call-bound/README.md +53 -0
  132. package/assets/api/vendor_modules/call-bound/index.d.ts +94 -0
  133. package/assets/api/vendor_modules/call-bound/index.js +19 -0
  134. package/assets/api/vendor_modules/call-bound/package.json +99 -0
  135. package/assets/api/vendor_modules/call-bound/test/index.js +61 -0
  136. package/assets/api/vendor_modules/call-bound/tsconfig.json +10 -0
  137. package/assets/api/vendor_modules/content-disposition/HISTORY.md +60 -0
  138. package/assets/api/vendor_modules/content-disposition/LICENSE +22 -0
  139. package/assets/api/vendor_modules/content-disposition/README.md +142 -0
  140. package/assets/api/vendor_modules/content-disposition/index.js +458 -0
  141. package/assets/api/vendor_modules/content-disposition/package.json +44 -0
  142. package/assets/api/vendor_modules/content-type/HISTORY.md +29 -0
  143. package/assets/api/vendor_modules/content-type/LICENSE +22 -0
  144. package/assets/api/vendor_modules/content-type/README.md +94 -0
  145. package/assets/api/vendor_modules/content-type/index.js +225 -0
  146. package/assets/api/vendor_modules/content-type/package.json +42 -0
  147. package/assets/api/vendor_modules/cookie/LICENSE +24 -0
  148. package/assets/api/vendor_modules/cookie/README.md +317 -0
  149. package/assets/api/vendor_modules/cookie/SECURITY.md +25 -0
  150. package/assets/api/vendor_modules/cookie/index.js +335 -0
  151. package/assets/api/vendor_modules/cookie/package.json +44 -0
  152. package/assets/api/vendor_modules/cookie-signature/History.md +42 -0
  153. package/assets/api/vendor_modules/cookie-signature/Readme.md +42 -0
  154. package/assets/api/vendor_modules/cookie-signature/index.js +51 -0
  155. package/assets/api/vendor_modules/cookie-signature/package.json +18 -0
  156. package/assets/api/vendor_modules/debug/.coveralls.yml +1 -0
  157. package/assets/api/vendor_modules/debug/.eslintrc +11 -0
  158. package/assets/api/vendor_modules/debug/.travis.yml +14 -0
  159. package/assets/api/vendor_modules/debug/CHANGELOG.md +362 -0
  160. package/assets/api/vendor_modules/debug/LICENSE +19 -0
  161. package/assets/api/vendor_modules/debug/Makefile +50 -0
  162. package/assets/api/vendor_modules/debug/README.md +312 -0
  163. package/assets/api/vendor_modules/debug/component.json +19 -0
  164. package/assets/api/vendor_modules/debug/karma.conf.js +70 -0
  165. package/assets/api/vendor_modules/debug/node.js +1 -0
  166. package/assets/api/vendor_modules/debug/package.json +49 -0
  167. package/assets/api/vendor_modules/debug/src/browser.js +185 -0
  168. package/assets/api/vendor_modules/debug/src/debug.js +202 -0
  169. package/assets/api/vendor_modules/debug/src/index.js +10 -0
  170. package/assets/api/vendor_modules/debug/src/inspector-log.js +15 -0
  171. package/assets/api/vendor_modules/debug/src/node.js +248 -0
  172. package/assets/api/vendor_modules/depd/History.md +103 -0
  173. package/assets/api/vendor_modules/depd/LICENSE +22 -0
  174. package/assets/api/vendor_modules/depd/Readme.md +280 -0
  175. package/assets/api/vendor_modules/depd/index.js +538 -0
  176. package/assets/api/vendor_modules/depd/lib/browser/index.js +77 -0
  177. package/assets/api/vendor_modules/depd/package.json +45 -0
  178. package/assets/api/vendor_modules/destroy/LICENSE +23 -0
  179. package/assets/api/vendor_modules/destroy/README.md +63 -0
  180. package/assets/api/vendor_modules/destroy/index.js +209 -0
  181. package/assets/api/vendor_modules/destroy/package.json +48 -0
  182. package/assets/api/vendor_modules/dunder-proto/.eslintrc +5 -0
  183. package/assets/api/vendor_modules/dunder-proto/.github/FUNDING.yml +12 -0
  184. package/assets/api/vendor_modules/dunder-proto/.nycrc +13 -0
  185. package/assets/api/vendor_modules/dunder-proto/CHANGELOG.md +24 -0
  186. package/assets/api/vendor_modules/dunder-proto/LICENSE +21 -0
  187. package/assets/api/vendor_modules/dunder-proto/README.md +54 -0
  188. package/assets/api/vendor_modules/dunder-proto/get.d.ts +5 -0
  189. package/assets/api/vendor_modules/dunder-proto/get.js +30 -0
  190. package/assets/api/vendor_modules/dunder-proto/package.json +76 -0
  191. package/assets/api/vendor_modules/dunder-proto/set.d.ts +5 -0
  192. package/assets/api/vendor_modules/dunder-proto/set.js +35 -0
  193. package/assets/api/vendor_modules/dunder-proto/test/get.js +34 -0
  194. package/assets/api/vendor_modules/dunder-proto/test/index.js +4 -0
  195. package/assets/api/vendor_modules/dunder-proto/test/set.js +50 -0
  196. package/assets/api/vendor_modules/dunder-proto/tsconfig.json +9 -0
  197. package/assets/api/vendor_modules/ee-first/LICENSE +22 -0
  198. package/assets/api/vendor_modules/ee-first/README.md +80 -0
  199. package/assets/api/vendor_modules/ee-first/index.js +95 -0
  200. package/assets/api/vendor_modules/ee-first/package.json +29 -0
  201. package/assets/api/vendor_modules/encodeurl/LICENSE +22 -0
  202. package/assets/api/vendor_modules/encodeurl/README.md +109 -0
  203. package/assets/api/vendor_modules/encodeurl/index.js +60 -0
  204. package/assets/api/vendor_modules/encodeurl/package.json +40 -0
  205. package/assets/api/vendor_modules/es-define-property/.eslintrc +13 -0
  206. package/assets/api/vendor_modules/es-define-property/.github/FUNDING.yml +12 -0
  207. package/assets/api/vendor_modules/es-define-property/.nycrc +9 -0
  208. package/assets/api/vendor_modules/es-define-property/CHANGELOG.md +29 -0
  209. package/assets/api/vendor_modules/es-define-property/LICENSE +21 -0
  210. package/assets/api/vendor_modules/es-define-property/README.md +49 -0
  211. package/assets/api/vendor_modules/es-define-property/index.d.ts +3 -0
  212. package/assets/api/vendor_modules/es-define-property/index.js +14 -0
  213. package/assets/api/vendor_modules/es-define-property/package.json +81 -0
  214. package/assets/api/vendor_modules/es-define-property/test/index.js +56 -0
  215. package/assets/api/vendor_modules/es-define-property/tsconfig.json +10 -0
  216. package/assets/api/vendor_modules/es-errors/.eslintrc +5 -0
  217. package/assets/api/vendor_modules/es-errors/.github/FUNDING.yml +12 -0
  218. package/assets/api/vendor_modules/es-errors/CHANGELOG.md +40 -0
  219. package/assets/api/vendor_modules/es-errors/LICENSE +21 -0
  220. package/assets/api/vendor_modules/es-errors/README.md +55 -0
  221. package/assets/api/vendor_modules/es-errors/eval.d.ts +3 -0
  222. package/assets/api/vendor_modules/es-errors/eval.js +4 -0
  223. package/assets/api/vendor_modules/es-errors/index.d.ts +3 -0
  224. package/assets/api/vendor_modules/es-errors/index.js +4 -0
  225. package/assets/api/vendor_modules/es-errors/package.json +80 -0
  226. package/assets/api/vendor_modules/es-errors/range.d.ts +3 -0
  227. package/assets/api/vendor_modules/es-errors/range.js +4 -0
  228. package/assets/api/vendor_modules/es-errors/ref.d.ts +3 -0
  229. package/assets/api/vendor_modules/es-errors/ref.js +4 -0
  230. package/assets/api/vendor_modules/es-errors/syntax.d.ts +3 -0
  231. package/assets/api/vendor_modules/es-errors/syntax.js +4 -0
  232. package/assets/api/vendor_modules/es-errors/test/index.js +19 -0
  233. package/assets/api/vendor_modules/es-errors/tsconfig.json +49 -0
  234. package/assets/api/vendor_modules/es-errors/type.d.ts +3 -0
  235. package/assets/api/vendor_modules/es-errors/type.js +4 -0
  236. package/assets/api/vendor_modules/es-errors/uri.d.ts +3 -0
  237. package/assets/api/vendor_modules/es-errors/uri.js +4 -0
  238. package/assets/api/vendor_modules/es-object-atoms/.eslintrc +16 -0
  239. package/assets/api/vendor_modules/es-object-atoms/.github/FUNDING.yml +12 -0
  240. package/assets/api/vendor_modules/es-object-atoms/CHANGELOG.md +44 -0
  241. package/assets/api/vendor_modules/es-object-atoms/LICENSE +21 -0
  242. package/assets/api/vendor_modules/es-object-atoms/README.md +63 -0
  243. package/assets/api/vendor_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
  244. package/assets/api/vendor_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
  245. package/assets/api/vendor_modules/es-object-atoms/ToObject.d.ts +7 -0
  246. package/assets/api/vendor_modules/es-object-atoms/ToObject.js +10 -0
  247. package/assets/api/vendor_modules/es-object-atoms/index.d.ts +3 -0
  248. package/assets/api/vendor_modules/es-object-atoms/index.js +4 -0
  249. package/assets/api/vendor_modules/es-object-atoms/isObject.d.ts +3 -0
  250. package/assets/api/vendor_modules/es-object-atoms/isObject.js +6 -0
  251. package/assets/api/vendor_modules/es-object-atoms/package.json +79 -0
  252. package/assets/api/vendor_modules/es-object-atoms/test/index.js +38 -0
  253. package/assets/api/vendor_modules/es-object-atoms/tsconfig.json +7 -0
  254. package/assets/api/vendor_modules/escape-html/LICENSE +24 -0
  255. package/assets/api/vendor_modules/escape-html/Readme.md +43 -0
  256. package/assets/api/vendor_modules/escape-html/index.js +78 -0
  257. package/assets/api/vendor_modules/escape-html/package.json +24 -0
  258. package/assets/api/vendor_modules/etag/HISTORY.md +83 -0
  259. package/assets/api/vendor_modules/etag/LICENSE +22 -0
  260. package/assets/api/vendor_modules/etag/README.md +159 -0
  261. package/assets/api/vendor_modules/etag/index.js +131 -0
  262. package/assets/api/vendor_modules/etag/package.json +47 -0
  263. package/assets/api/vendor_modules/express/History.md +3676 -0
  264. package/assets/api/vendor_modules/express/LICENSE +24 -0
  265. package/assets/api/vendor_modules/express/Readme.md +260 -0
  266. package/assets/api/vendor_modules/express/index.js +11 -0
  267. package/assets/api/vendor_modules/express/lib/application.js +661 -0
  268. package/assets/api/vendor_modules/express/lib/express.js +116 -0
  269. package/assets/api/vendor_modules/express/lib/middleware/init.js +43 -0
  270. package/assets/api/vendor_modules/express/lib/middleware/query.js +47 -0
  271. package/assets/api/vendor_modules/express/lib/request.js +525 -0
  272. package/assets/api/vendor_modules/express/lib/response.js +1179 -0
  273. package/assets/api/vendor_modules/express/lib/router/index.js +673 -0
  274. package/assets/api/vendor_modules/express/lib/router/layer.js +181 -0
  275. package/assets/api/vendor_modules/express/lib/router/route.js +230 -0
  276. package/assets/api/vendor_modules/express/lib/utils.js +304 -0
  277. package/assets/api/vendor_modules/express/lib/view.js +182 -0
  278. package/assets/api/vendor_modules/express/package.json +102 -0
  279. package/assets/api/vendor_modules/finalhandler/HISTORY.md +216 -0
  280. package/assets/api/vendor_modules/finalhandler/LICENSE +22 -0
  281. package/assets/api/vendor_modules/finalhandler/README.md +147 -0
  282. package/assets/api/vendor_modules/finalhandler/SECURITY.md +25 -0
  283. package/assets/api/vendor_modules/finalhandler/index.js +341 -0
  284. package/assets/api/vendor_modules/finalhandler/package.json +47 -0
  285. package/assets/api/vendor_modules/forwarded/HISTORY.md +21 -0
  286. package/assets/api/vendor_modules/forwarded/LICENSE +22 -0
  287. package/assets/api/vendor_modules/forwarded/README.md +57 -0
  288. package/assets/api/vendor_modules/forwarded/index.js +90 -0
  289. package/assets/api/vendor_modules/forwarded/package.json +45 -0
  290. package/assets/api/vendor_modules/fresh/HISTORY.md +70 -0
  291. package/assets/api/vendor_modules/fresh/LICENSE +23 -0
  292. package/assets/api/vendor_modules/fresh/README.md +119 -0
  293. package/assets/api/vendor_modules/fresh/index.js +137 -0
  294. package/assets/api/vendor_modules/fresh/package.json +46 -0
  295. package/assets/api/vendor_modules/function-bind/.eslintrc +21 -0
  296. package/assets/api/vendor_modules/function-bind/.github/FUNDING.yml +12 -0
  297. package/assets/api/vendor_modules/function-bind/.github/SECURITY.md +3 -0
  298. package/assets/api/vendor_modules/function-bind/.nycrc +13 -0
  299. package/assets/api/vendor_modules/function-bind/CHANGELOG.md +136 -0
  300. package/assets/api/vendor_modules/function-bind/LICENSE +20 -0
  301. package/assets/api/vendor_modules/function-bind/README.md +46 -0
  302. package/assets/api/vendor_modules/function-bind/implementation.js +84 -0
  303. package/assets/api/vendor_modules/function-bind/index.js +5 -0
  304. package/assets/api/vendor_modules/function-bind/package.json +87 -0
  305. package/assets/api/vendor_modules/function-bind/test/.eslintrc +9 -0
  306. package/assets/api/vendor_modules/function-bind/test/index.js +252 -0
  307. package/assets/api/vendor_modules/get-intrinsic/.eslintrc +42 -0
  308. package/assets/api/vendor_modules/get-intrinsic/.github/FUNDING.yml +12 -0
  309. package/assets/api/vendor_modules/get-intrinsic/.nycrc +9 -0
  310. package/assets/api/vendor_modules/get-intrinsic/CHANGELOG.md +186 -0
  311. package/assets/api/vendor_modules/get-intrinsic/LICENSE +21 -0
  312. package/assets/api/vendor_modules/get-intrinsic/README.md +71 -0
  313. package/assets/api/vendor_modules/get-intrinsic/index.js +378 -0
  314. package/assets/api/vendor_modules/get-intrinsic/package.json +97 -0
  315. package/assets/api/vendor_modules/get-intrinsic/test/GetIntrinsic.js +274 -0
  316. package/assets/api/vendor_modules/get-proto/.eslintrc +10 -0
  317. package/assets/api/vendor_modules/get-proto/.github/FUNDING.yml +12 -0
  318. package/assets/api/vendor_modules/get-proto/.nycrc +9 -0
  319. package/assets/api/vendor_modules/get-proto/CHANGELOG.md +21 -0
  320. package/assets/api/vendor_modules/get-proto/LICENSE +21 -0
  321. package/assets/api/vendor_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
  322. package/assets/api/vendor_modules/get-proto/Object.getPrototypeOf.js +6 -0
  323. package/assets/api/vendor_modules/get-proto/README.md +50 -0
  324. package/assets/api/vendor_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
  325. package/assets/api/vendor_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
  326. package/assets/api/vendor_modules/get-proto/index.d.ts +5 -0
  327. package/assets/api/vendor_modules/get-proto/index.js +27 -0
  328. package/assets/api/vendor_modules/get-proto/package.json +81 -0
  329. package/assets/api/vendor_modules/get-proto/test/index.js +68 -0
  330. package/assets/api/vendor_modules/get-proto/tsconfig.json +9 -0
  331. package/assets/api/vendor_modules/gopd/.eslintrc +16 -0
  332. package/assets/api/vendor_modules/gopd/.github/FUNDING.yml +12 -0
  333. package/assets/api/vendor_modules/gopd/CHANGELOG.md +45 -0
  334. package/assets/api/vendor_modules/gopd/LICENSE +21 -0
  335. package/assets/api/vendor_modules/gopd/README.md +40 -0
  336. package/assets/api/vendor_modules/gopd/gOPD.d.ts +1 -0
  337. package/assets/api/vendor_modules/gopd/gOPD.js +4 -0
  338. package/assets/api/vendor_modules/gopd/index.d.ts +5 -0
  339. package/assets/api/vendor_modules/gopd/index.js +15 -0
  340. package/assets/api/vendor_modules/gopd/package.json +77 -0
  341. package/assets/api/vendor_modules/gopd/test/index.js +36 -0
  342. package/assets/api/vendor_modules/gopd/tsconfig.json +9 -0
  343. package/assets/api/vendor_modules/has-symbols/.eslintrc +11 -0
  344. package/assets/api/vendor_modules/has-symbols/.github/FUNDING.yml +12 -0
  345. package/assets/api/vendor_modules/has-symbols/.nycrc +9 -0
  346. package/assets/api/vendor_modules/has-symbols/CHANGELOG.md +91 -0
  347. package/assets/api/vendor_modules/has-symbols/LICENSE +21 -0
  348. package/assets/api/vendor_modules/has-symbols/README.md +46 -0
  349. package/assets/api/vendor_modules/has-symbols/index.d.ts +3 -0
  350. package/assets/api/vendor_modules/has-symbols/index.js +14 -0
  351. package/assets/api/vendor_modules/has-symbols/package.json +111 -0
  352. package/assets/api/vendor_modules/has-symbols/shams.d.ts +3 -0
  353. package/assets/api/vendor_modules/has-symbols/shams.js +45 -0
  354. package/assets/api/vendor_modules/has-symbols/test/index.js +22 -0
  355. package/assets/api/vendor_modules/has-symbols/test/shams/core-js.js +29 -0
  356. package/assets/api/vendor_modules/has-symbols/test/shams/get-own-property-symbols.js +29 -0
  357. package/assets/api/vendor_modules/has-symbols/test/tests.js +58 -0
  358. package/assets/api/vendor_modules/has-symbols/tsconfig.json +10 -0
  359. package/assets/api/vendor_modules/hasown/.github/FUNDING.yml +12 -0
  360. package/assets/api/vendor_modules/hasown/.nycrc +13 -0
  361. package/assets/api/vendor_modules/hasown/CHANGELOG.md +58 -0
  362. package/assets/api/vendor_modules/hasown/LICENSE +21 -0
  363. package/assets/api/vendor_modules/hasown/README.md +40 -0
  364. package/assets/api/vendor_modules/hasown/eslint.config.mjs +6 -0
  365. package/assets/api/vendor_modules/hasown/index.d.ts +3 -0
  366. package/assets/api/vendor_modules/hasown/index.js +8 -0
  367. package/assets/api/vendor_modules/hasown/package.json +91 -0
  368. package/assets/api/vendor_modules/hasown/tsconfig.json +6 -0
  369. package/assets/api/vendor_modules/http-errors/HISTORY.md +186 -0
  370. package/assets/api/vendor_modules/http-errors/LICENSE +23 -0
  371. package/assets/api/vendor_modules/http-errors/README.md +169 -0
  372. package/assets/api/vendor_modules/http-errors/index.js +290 -0
  373. package/assets/api/vendor_modules/http-errors/package.json +54 -0
  374. package/assets/api/vendor_modules/iconv-lite/Changelog.md +162 -0
  375. package/assets/api/vendor_modules/iconv-lite/LICENSE +21 -0
  376. package/assets/api/vendor_modules/iconv-lite/README.md +156 -0
  377. package/assets/api/vendor_modules/iconv-lite/encodings/dbcs-codec.js +555 -0
  378. package/assets/api/vendor_modules/iconv-lite/encodings/dbcs-data.js +176 -0
  379. package/assets/api/vendor_modules/iconv-lite/encodings/index.js +22 -0
  380. package/assets/api/vendor_modules/iconv-lite/encodings/internal.js +188 -0
  381. package/assets/api/vendor_modules/iconv-lite/encodings/sbcs-codec.js +72 -0
  382. package/assets/api/vendor_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
  383. package/assets/api/vendor_modules/iconv-lite/encodings/sbcs-data.js +174 -0
  384. package/assets/api/vendor_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
  385. package/assets/api/vendor_modules/iconv-lite/encodings/tables/cp936.json +264 -0
  386. package/assets/api/vendor_modules/iconv-lite/encodings/tables/cp949.json +273 -0
  387. package/assets/api/vendor_modules/iconv-lite/encodings/tables/cp950.json +177 -0
  388. package/assets/api/vendor_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
  389. package/assets/api/vendor_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
  390. package/assets/api/vendor_modules/iconv-lite/encodings/tables/gbk-added.json +55 -0
  391. package/assets/api/vendor_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
  392. package/assets/api/vendor_modules/iconv-lite/encodings/utf16.js +177 -0
  393. package/assets/api/vendor_modules/iconv-lite/encodings/utf7.js +290 -0
  394. package/assets/api/vendor_modules/iconv-lite/lib/bom-handling.js +52 -0
  395. package/assets/api/vendor_modules/iconv-lite/lib/extend-node.js +217 -0
  396. package/assets/api/vendor_modules/iconv-lite/lib/index.d.ts +24 -0
  397. package/assets/api/vendor_modules/iconv-lite/lib/index.js +153 -0
  398. package/assets/api/vendor_modules/iconv-lite/lib/streams.js +121 -0
  399. package/assets/api/vendor_modules/iconv-lite/package.json +46 -0
  400. package/assets/api/vendor_modules/inherits/LICENSE +16 -0
  401. package/assets/api/vendor_modules/inherits/README.md +42 -0
  402. package/assets/api/vendor_modules/inherits/inherits.js +9 -0
  403. package/assets/api/vendor_modules/inherits/inherits_browser.js +27 -0
  404. package/assets/api/vendor_modules/inherits/package.json +29 -0
  405. package/assets/api/vendor_modules/ipaddr.js/LICENSE +19 -0
  406. package/assets/api/vendor_modules/ipaddr.js/README.md +233 -0
  407. package/assets/api/vendor_modules/ipaddr.js/ipaddr.min.js +1 -0
  408. package/assets/api/vendor_modules/ipaddr.js/lib/ipaddr.js +673 -0
  409. package/assets/api/vendor_modules/ipaddr.js/lib/ipaddr.js.d.ts +68 -0
  410. package/assets/api/vendor_modules/ipaddr.js/package.json +35 -0
  411. package/assets/api/vendor_modules/math-intrinsics/.eslintrc +16 -0
  412. package/assets/api/vendor_modules/math-intrinsics/.github/FUNDING.yml +12 -0
  413. package/assets/api/vendor_modules/math-intrinsics/CHANGELOG.md +24 -0
  414. package/assets/api/vendor_modules/math-intrinsics/LICENSE +21 -0
  415. package/assets/api/vendor_modules/math-intrinsics/README.md +50 -0
  416. package/assets/api/vendor_modules/math-intrinsics/abs.d.ts +1 -0
  417. package/assets/api/vendor_modules/math-intrinsics/abs.js +4 -0
  418. package/assets/api/vendor_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
  419. package/assets/api/vendor_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
  420. package/assets/api/vendor_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
  421. package/assets/api/vendor_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
  422. package/assets/api/vendor_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
  423. package/assets/api/vendor_modules/math-intrinsics/constants/maxValue.js +5 -0
  424. package/assets/api/vendor_modules/math-intrinsics/floor.d.ts +1 -0
  425. package/assets/api/vendor_modules/math-intrinsics/floor.js +4 -0
  426. package/assets/api/vendor_modules/math-intrinsics/isFinite.d.ts +3 -0
  427. package/assets/api/vendor_modules/math-intrinsics/isFinite.js +12 -0
  428. package/assets/api/vendor_modules/math-intrinsics/isInteger.d.ts +3 -0
  429. package/assets/api/vendor_modules/math-intrinsics/isInteger.js +16 -0
  430. package/assets/api/vendor_modules/math-intrinsics/isNaN.d.ts +1 -0
  431. package/assets/api/vendor_modules/math-intrinsics/isNaN.js +6 -0
  432. package/assets/api/vendor_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
  433. package/assets/api/vendor_modules/math-intrinsics/isNegativeZero.js +6 -0
  434. package/assets/api/vendor_modules/math-intrinsics/max.d.ts +1 -0
  435. package/assets/api/vendor_modules/math-intrinsics/max.js +4 -0
  436. package/assets/api/vendor_modules/math-intrinsics/min.d.ts +1 -0
  437. package/assets/api/vendor_modules/math-intrinsics/min.js +4 -0
  438. package/assets/api/vendor_modules/math-intrinsics/mod.d.ts +3 -0
  439. package/assets/api/vendor_modules/math-intrinsics/mod.js +9 -0
  440. package/assets/api/vendor_modules/math-intrinsics/package.json +86 -0
  441. package/assets/api/vendor_modules/math-intrinsics/pow.d.ts +1 -0
  442. package/assets/api/vendor_modules/math-intrinsics/pow.js +4 -0
  443. package/assets/api/vendor_modules/math-intrinsics/round.d.ts +1 -0
  444. package/assets/api/vendor_modules/math-intrinsics/round.js +4 -0
  445. package/assets/api/vendor_modules/math-intrinsics/sign.d.ts +3 -0
  446. package/assets/api/vendor_modules/math-intrinsics/sign.js +11 -0
  447. package/assets/api/vendor_modules/math-intrinsics/test/index.js +192 -0
  448. package/assets/api/vendor_modules/math-intrinsics/tsconfig.json +3 -0
  449. package/assets/api/vendor_modules/media-typer/HISTORY.md +22 -0
  450. package/assets/api/vendor_modules/media-typer/LICENSE +22 -0
  451. package/assets/api/vendor_modules/media-typer/README.md +81 -0
  452. package/assets/api/vendor_modules/media-typer/index.js +270 -0
  453. package/assets/api/vendor_modules/media-typer/package.json +26 -0
  454. package/assets/api/vendor_modules/merge-descriptors/HISTORY.md +21 -0
  455. package/assets/api/vendor_modules/merge-descriptors/LICENSE +23 -0
  456. package/assets/api/vendor_modules/merge-descriptors/README.md +49 -0
  457. package/assets/api/vendor_modules/merge-descriptors/index.js +60 -0
  458. package/assets/api/vendor_modules/merge-descriptors/package.json +39 -0
  459. package/assets/api/vendor_modules/methods/HISTORY.md +29 -0
  460. package/assets/api/vendor_modules/methods/LICENSE +24 -0
  461. package/assets/api/vendor_modules/methods/README.md +51 -0
  462. package/assets/api/vendor_modules/methods/index.js +69 -0
  463. package/assets/api/vendor_modules/methods/package.json +36 -0
  464. package/assets/api/vendor_modules/mime/CHANGELOG.md +164 -0
  465. package/assets/api/vendor_modules/mime/LICENSE +21 -0
  466. package/assets/api/vendor_modules/mime/README.md +90 -0
  467. package/assets/api/vendor_modules/mime/cli.js +8 -0
  468. package/assets/api/vendor_modules/mime/mime.js +108 -0
  469. package/assets/api/vendor_modules/mime/package.json +44 -0
  470. package/assets/api/vendor_modules/mime/src/build.js +53 -0
  471. package/assets/api/vendor_modules/mime/src/test.js +60 -0
  472. package/assets/api/vendor_modules/mime/types.json +1 -0
  473. package/assets/api/vendor_modules/mime-db/HISTORY.md +507 -0
  474. package/assets/api/vendor_modules/mime-db/LICENSE +23 -0
  475. package/assets/api/vendor_modules/mime-db/README.md +100 -0
  476. package/assets/api/vendor_modules/mime-db/db.json +8519 -0
  477. package/assets/api/vendor_modules/mime-db/index.js +12 -0
  478. package/assets/api/vendor_modules/mime-db/package.json +60 -0
  479. package/assets/api/vendor_modules/mime-types/HISTORY.md +397 -0
  480. package/assets/api/vendor_modules/mime-types/LICENSE +23 -0
  481. package/assets/api/vendor_modules/mime-types/README.md +113 -0
  482. package/assets/api/vendor_modules/mime-types/index.js +188 -0
  483. package/assets/api/vendor_modules/mime-types/package.json +44 -0
  484. package/assets/api/vendor_modules/ms/index.js +152 -0
  485. package/assets/api/vendor_modules/ms/license.md +21 -0
  486. package/assets/api/vendor_modules/ms/package.json +37 -0
  487. package/assets/api/vendor_modules/ms/readme.md +51 -0
  488. package/assets/api/vendor_modules/negotiator/HISTORY.md +108 -0
  489. package/assets/api/vendor_modules/negotiator/LICENSE +24 -0
  490. package/assets/api/vendor_modules/negotiator/README.md +203 -0
  491. package/assets/api/vendor_modules/negotiator/index.js +82 -0
  492. package/assets/api/vendor_modules/negotiator/lib/charset.js +169 -0
  493. package/assets/api/vendor_modules/negotiator/lib/encoding.js +184 -0
  494. package/assets/api/vendor_modules/negotiator/lib/language.js +179 -0
  495. package/assets/api/vendor_modules/negotiator/lib/mediaType.js +294 -0
  496. package/assets/api/vendor_modules/negotiator/package.json +42 -0
  497. package/assets/api/vendor_modules/object-inspect/.eslintrc +53 -0
  498. package/assets/api/vendor_modules/object-inspect/.github/FUNDING.yml +12 -0
  499. package/assets/api/vendor_modules/object-inspect/.nycrc +13 -0
  500. package/assets/api/vendor_modules/object-inspect/CHANGELOG.md +424 -0
  501. package/assets/api/vendor_modules/object-inspect/LICENSE +21 -0
  502. package/assets/api/vendor_modules/object-inspect/example/all.js +23 -0
  503. package/assets/api/vendor_modules/object-inspect/example/circular.js +6 -0
  504. package/assets/api/vendor_modules/object-inspect/example/fn.js +5 -0
  505. package/assets/api/vendor_modules/object-inspect/example/inspect.js +10 -0
  506. package/assets/api/vendor_modules/object-inspect/index.js +544 -0
  507. package/assets/api/vendor_modules/object-inspect/package-support.json +20 -0
  508. package/assets/api/vendor_modules/object-inspect/package.json +105 -0
  509. package/assets/api/vendor_modules/object-inspect/readme.markdown +84 -0
  510. package/assets/api/vendor_modules/object-inspect/test/bigint.js +58 -0
  511. package/assets/api/vendor_modules/object-inspect/test/browser/dom.js +15 -0
  512. package/assets/api/vendor_modules/object-inspect/test/circular.js +16 -0
  513. package/assets/api/vendor_modules/object-inspect/test/deep.js +12 -0
  514. package/assets/api/vendor_modules/object-inspect/test/element.js +53 -0
  515. package/assets/api/vendor_modules/object-inspect/test/err.js +48 -0
  516. package/assets/api/vendor_modules/object-inspect/test/fakes.js +29 -0
  517. package/assets/api/vendor_modules/object-inspect/test/fn.js +76 -0
  518. package/assets/api/vendor_modules/object-inspect/test/global.js +17 -0
  519. package/assets/api/vendor_modules/object-inspect/test/has.js +15 -0
  520. package/assets/api/vendor_modules/object-inspect/test/holes.js +15 -0
  521. package/assets/api/vendor_modules/object-inspect/test/indent-option.js +271 -0
  522. package/assets/api/vendor_modules/object-inspect/test/inspect.js +139 -0
  523. package/assets/api/vendor_modules/object-inspect/test/lowbyte.js +12 -0
  524. package/assets/api/vendor_modules/object-inspect/test/number.js +58 -0
  525. package/assets/api/vendor_modules/object-inspect/test/quoteStyle.js +26 -0
  526. package/assets/api/vendor_modules/object-inspect/test/toStringTag.js +40 -0
  527. package/assets/api/vendor_modules/object-inspect/test/undef.js +12 -0
  528. package/assets/api/vendor_modules/object-inspect/test/values.js +261 -0
  529. package/assets/api/vendor_modules/object-inspect/test-core-js.js +26 -0
  530. package/assets/api/vendor_modules/object-inspect/util.inspect.js +1 -0
  531. package/assets/api/vendor_modules/on-finished/HISTORY.md +98 -0
  532. package/assets/api/vendor_modules/on-finished/LICENSE +23 -0
  533. package/assets/api/vendor_modules/on-finished/README.md +162 -0
  534. package/assets/api/vendor_modules/on-finished/index.js +234 -0
  535. package/assets/api/vendor_modules/on-finished/package.json +39 -0
  536. package/assets/api/vendor_modules/parseurl/HISTORY.md +58 -0
  537. package/assets/api/vendor_modules/parseurl/LICENSE +24 -0
  538. package/assets/api/vendor_modules/parseurl/README.md +133 -0
  539. package/assets/api/vendor_modules/parseurl/index.js +158 -0
  540. package/assets/api/vendor_modules/parseurl/package.json +40 -0
  541. package/assets/api/vendor_modules/path-to-regexp/LICENSE +21 -0
  542. package/assets/api/vendor_modules/path-to-regexp/Readme.md +35 -0
  543. package/assets/api/vendor_modules/path-to-regexp/index.js +158 -0
  544. package/assets/api/vendor_modules/path-to-regexp/package.json +30 -0
  545. package/assets/api/vendor_modules/proxy-addr/HISTORY.md +167 -0
  546. package/assets/api/vendor_modules/proxy-addr/LICENSE +22 -0
  547. package/assets/api/vendor_modules/proxy-addr/README.md +139 -0
  548. package/assets/api/vendor_modules/proxy-addr/index.js +359 -0
  549. package/assets/api/vendor_modules/proxy-addr/package.json +51 -0
  550. package/assets/api/vendor_modules/qs/.editorconfig +46 -0
  551. package/assets/api/vendor_modules/qs/.github/FUNDING.yml +12 -0
  552. package/assets/api/vendor_modules/qs/.github/SECURITY.md +11 -0
  553. package/assets/api/vendor_modules/qs/.github/THREAT_MODEL.md +78 -0
  554. package/assets/api/vendor_modules/qs/.nycrc +13 -0
  555. package/assets/api/vendor_modules/qs/CHANGELOG.md +833 -0
  556. package/assets/api/vendor_modules/qs/LICENSE.md +29 -0
  557. package/assets/api/vendor_modules/qs/README.md +758 -0
  558. package/assets/api/vendor_modules/qs/dist/qs.js +141 -0
  559. package/assets/api/vendor_modules/qs/eslint.config.mjs +57 -0
  560. package/assets/api/vendor_modules/qs/lib/formats.js +23 -0
  561. package/assets/api/vendor_modules/qs/lib/index.js +11 -0
  562. package/assets/api/vendor_modules/qs/lib/parse.js +414 -0
  563. package/assets/api/vendor_modules/qs/lib/stringify.js +363 -0
  564. package/assets/api/vendor_modules/qs/lib/utils.js +381 -0
  565. package/assets/api/vendor_modules/qs/package.json +95 -0
  566. package/assets/api/vendor_modules/qs/test/empty-keys-cases.js +267 -0
  567. package/assets/api/vendor_modules/qs/test/parse.js +1933 -0
  568. package/assets/api/vendor_modules/qs/test/stringify.js +1448 -0
  569. package/assets/api/vendor_modules/qs/test/utils.js +626 -0
  570. package/assets/api/vendor_modules/range-parser/HISTORY.md +56 -0
  571. package/assets/api/vendor_modules/range-parser/LICENSE +23 -0
  572. package/assets/api/vendor_modules/range-parser/README.md +84 -0
  573. package/assets/api/vendor_modules/range-parser/index.js +162 -0
  574. package/assets/api/vendor_modules/range-parser/package.json +44 -0
  575. package/assets/api/vendor_modules/raw-body/LICENSE +22 -0
  576. package/assets/api/vendor_modules/raw-body/README.md +223 -0
  577. package/assets/api/vendor_modules/raw-body/index.d.ts +87 -0
  578. package/assets/api/vendor_modules/raw-body/index.js +336 -0
  579. package/assets/api/vendor_modules/raw-body/package.json +47 -0
  580. package/assets/api/vendor_modules/safe-buffer/LICENSE +21 -0
  581. package/assets/api/vendor_modules/safe-buffer/README.md +584 -0
  582. package/assets/api/vendor_modules/safe-buffer/index.d.ts +187 -0
  583. package/assets/api/vendor_modules/safe-buffer/index.js +65 -0
  584. package/assets/api/vendor_modules/safe-buffer/package.json +51 -0
  585. package/assets/api/vendor_modules/safer-buffer/LICENSE +21 -0
  586. package/assets/api/vendor_modules/safer-buffer/Porting-Buffer.md +268 -0
  587. package/assets/api/vendor_modules/safer-buffer/Readme.md +156 -0
  588. package/assets/api/vendor_modules/safer-buffer/dangerous.js +58 -0
  589. package/assets/api/vendor_modules/safer-buffer/package.json +34 -0
  590. package/assets/api/vendor_modules/safer-buffer/safer.js +77 -0
  591. package/assets/api/vendor_modules/safer-buffer/tests.js +406 -0
  592. package/assets/api/vendor_modules/send/HISTORY.md +538 -0
  593. package/assets/api/vendor_modules/send/LICENSE +23 -0
  594. package/assets/api/vendor_modules/send/README.md +327 -0
  595. package/assets/api/vendor_modules/send/SECURITY.md +24 -0
  596. package/assets/api/vendor_modules/send/index.js +1142 -0
  597. package/assets/api/vendor_modules/send/node_modules/ms/index.js +162 -0
  598. package/assets/api/vendor_modules/send/node_modules/ms/license.md +21 -0
  599. package/assets/api/vendor_modules/send/node_modules/ms/package.json +38 -0
  600. package/assets/api/vendor_modules/send/node_modules/ms/readme.md +59 -0
  601. package/assets/api/vendor_modules/send/package.json +62 -0
  602. package/assets/api/vendor_modules/serve-static/HISTORY.md +493 -0
  603. package/assets/api/vendor_modules/serve-static/LICENSE +25 -0
  604. package/assets/api/vendor_modules/serve-static/README.md +257 -0
  605. package/assets/api/vendor_modules/serve-static/index.js +209 -0
  606. package/assets/api/vendor_modules/serve-static/package.json +42 -0
  607. package/assets/api/vendor_modules/serverless-http/LICENSE.txt +33 -0
  608. package/assets/api/vendor_modules/serverless-http/README.md +117 -0
  609. package/assets/api/vendor_modules/serverless-http/lib/finish.js +42 -0
  610. package/assets/api/vendor_modules/serverless-http/lib/framework/get-framework.js +79 -0
  611. package/assets/api/vendor_modules/serverless-http/lib/provider/aws/clean-up-event.js +98 -0
  612. package/assets/api/vendor_modules/serverless-http/lib/provider/aws/create-request.js +110 -0
  613. package/assets/api/vendor_modules/serverless-http/lib/provider/aws/format-response.js +45 -0
  614. package/assets/api/vendor_modules/serverless-http/lib/provider/aws/index.js +15 -0
  615. package/assets/api/vendor_modules/serverless-http/lib/provider/aws/is-binary.js +42 -0
  616. package/assets/api/vendor_modules/serverless-http/lib/provider/aws/sanitize-headers.js +21 -0
  617. package/assets/api/vendor_modules/serverless-http/lib/provider/azure/clean-up-request.js +41 -0
  618. package/assets/api/vendor_modules/serverless-http/lib/provider/azure/create-request.js +45 -0
  619. package/assets/api/vendor_modules/serverless-http/lib/provider/azure/format-response.js +18 -0
  620. package/assets/api/vendor_modules/serverless-http/lib/provider/azure/index.js +13 -0
  621. package/assets/api/vendor_modules/serverless-http/lib/provider/azure/is-binary.js +42 -0
  622. package/assets/api/vendor_modules/serverless-http/lib/provider/azure/sanitize-headers.js +23 -0
  623. package/assets/api/vendor_modules/serverless-http/lib/provider/azure/set-cookie.json +1 -0
  624. package/assets/api/vendor_modules/serverless-http/lib/provider/get-provider.js +17 -0
  625. package/assets/api/vendor_modules/serverless-http/lib/request.js +38 -0
  626. package/assets/api/vendor_modules/serverless-http/lib/response.js +135 -0
  627. package/assets/api/vendor_modules/serverless-http/package.json +93 -0
  628. package/assets/api/vendor_modules/serverless-http/serverless-http.d.ts +41 -0
  629. package/assets/api/vendor_modules/serverless-http/serverless-http.js +23 -0
  630. package/assets/api/vendor_modules/setprototypeof/LICENSE +13 -0
  631. package/assets/api/vendor_modules/setprototypeof/README.md +31 -0
  632. package/assets/api/vendor_modules/setprototypeof/index.d.ts +2 -0
  633. package/assets/api/vendor_modules/setprototypeof/index.js +17 -0
  634. package/assets/api/vendor_modules/setprototypeof/package.json +38 -0
  635. package/assets/api/vendor_modules/setprototypeof/test/index.js +24 -0
  636. package/assets/api/vendor_modules/side-channel/.editorconfig +9 -0
  637. package/assets/api/vendor_modules/side-channel/.eslintrc +12 -0
  638. package/assets/api/vendor_modules/side-channel/.github/FUNDING.yml +12 -0
  639. package/assets/api/vendor_modules/side-channel/.nycrc +13 -0
  640. package/assets/api/vendor_modules/side-channel/CHANGELOG.md +120 -0
  641. package/assets/api/vendor_modules/side-channel/LICENSE +21 -0
  642. package/assets/api/vendor_modules/side-channel/README.md +61 -0
  643. package/assets/api/vendor_modules/side-channel/index.d.ts +14 -0
  644. package/assets/api/vendor_modules/side-channel/index.js +46 -0
  645. package/assets/api/vendor_modules/side-channel/package.json +85 -0
  646. package/assets/api/vendor_modules/side-channel/test/index.js +120 -0
  647. package/assets/api/vendor_modules/side-channel/tsconfig.json +9 -0
  648. package/assets/api/vendor_modules/side-channel-list/.editorconfig +9 -0
  649. package/assets/api/vendor_modules/side-channel-list/.eslintrc +11 -0
  650. package/assets/api/vendor_modules/side-channel-list/.github/FUNDING.yml +12 -0
  651. package/assets/api/vendor_modules/side-channel-list/.nycrc +13 -0
  652. package/assets/api/vendor_modules/side-channel-list/CHANGELOG.md +36 -0
  653. package/assets/api/vendor_modules/side-channel-list/LICENSE +21 -0
  654. package/assets/api/vendor_modules/side-channel-list/README.md +62 -0
  655. package/assets/api/vendor_modules/side-channel-list/index.d.ts +13 -0
  656. package/assets/api/vendor_modules/side-channel-list/index.js +111 -0
  657. package/assets/api/vendor_modules/side-channel-list/list.d.ts +14 -0
  658. package/assets/api/vendor_modules/side-channel-list/package.json +77 -0
  659. package/assets/api/vendor_modules/side-channel-list/test/index.js +154 -0
  660. package/assets/api/vendor_modules/side-channel-list/tsconfig.json +9 -0
  661. package/assets/api/vendor_modules/side-channel-map/.editorconfig +9 -0
  662. package/assets/api/vendor_modules/side-channel-map/.eslintrc +11 -0
  663. package/assets/api/vendor_modules/side-channel-map/.github/FUNDING.yml +12 -0
  664. package/assets/api/vendor_modules/side-channel-map/.nycrc +13 -0
  665. package/assets/api/vendor_modules/side-channel-map/CHANGELOG.md +22 -0
  666. package/assets/api/vendor_modules/side-channel-map/LICENSE +21 -0
  667. package/assets/api/vendor_modules/side-channel-map/README.md +62 -0
  668. package/assets/api/vendor_modules/side-channel-map/index.d.ts +15 -0
  669. package/assets/api/vendor_modules/side-channel-map/index.js +68 -0
  670. package/assets/api/vendor_modules/side-channel-map/package.json +80 -0
  671. package/assets/api/vendor_modules/side-channel-map/test/index.js +114 -0
  672. package/assets/api/vendor_modules/side-channel-map/tsconfig.json +9 -0
  673. package/assets/api/vendor_modules/side-channel-weakmap/.editorconfig +9 -0
  674. package/assets/api/vendor_modules/side-channel-weakmap/.eslintrc +12 -0
  675. package/assets/api/vendor_modules/side-channel-weakmap/.github/FUNDING.yml +12 -0
  676. package/assets/api/vendor_modules/side-channel-weakmap/.nycrc +13 -0
  677. package/assets/api/vendor_modules/side-channel-weakmap/CHANGELOG.md +28 -0
  678. package/assets/api/vendor_modules/side-channel-weakmap/LICENSE +21 -0
  679. package/assets/api/vendor_modules/side-channel-weakmap/README.md +62 -0
  680. package/assets/api/vendor_modules/side-channel-weakmap/index.d.ts +15 -0
  681. package/assets/api/vendor_modules/side-channel-weakmap/index.js +84 -0
  682. package/assets/api/vendor_modules/side-channel-weakmap/package.json +87 -0
  683. package/assets/api/vendor_modules/side-channel-weakmap/test/index.js +114 -0
  684. package/assets/api/vendor_modules/side-channel-weakmap/tsconfig.json +9 -0
  685. package/assets/api/vendor_modules/statuses/HISTORY.md +87 -0
  686. package/assets/api/vendor_modules/statuses/LICENSE +23 -0
  687. package/assets/api/vendor_modules/statuses/README.md +139 -0
  688. package/assets/api/vendor_modules/statuses/codes.json +65 -0
  689. package/assets/api/vendor_modules/statuses/index.js +146 -0
  690. package/assets/api/vendor_modules/statuses/package.json +49 -0
  691. package/assets/api/vendor_modules/toidentifier/HISTORY.md +9 -0
  692. package/assets/api/vendor_modules/toidentifier/LICENSE +21 -0
  693. package/assets/api/vendor_modules/toidentifier/README.md +61 -0
  694. package/assets/api/vendor_modules/toidentifier/index.js +32 -0
  695. package/assets/api/vendor_modules/toidentifier/package.json +38 -0
  696. package/assets/api/vendor_modules/type-is/HISTORY.md +259 -0
  697. package/assets/api/vendor_modules/type-is/LICENSE +23 -0
  698. package/assets/api/vendor_modules/type-is/README.md +170 -0
  699. package/assets/api/vendor_modules/type-is/index.js +266 -0
  700. package/assets/api/vendor_modules/type-is/package.json +45 -0
  701. package/assets/api/vendor_modules/unpipe/HISTORY.md +4 -0
  702. package/assets/api/vendor_modules/unpipe/LICENSE +22 -0
  703. package/assets/api/vendor_modules/unpipe/README.md +43 -0
  704. package/assets/api/vendor_modules/unpipe/index.js +69 -0
  705. package/assets/api/vendor_modules/unpipe/package.json +27 -0
  706. package/assets/api/vendor_modules/utils-merge/LICENSE +20 -0
  707. package/assets/api/vendor_modules/utils-merge/README.md +34 -0
  708. package/assets/api/vendor_modules/utils-merge/index.js +23 -0
  709. package/assets/api/vendor_modules/utils-merge/package.json +40 -0
  710. package/assets/api/vendor_modules/vary/HISTORY.md +39 -0
  711. package/assets/api/vendor_modules/vary/LICENSE +22 -0
  712. package/assets/api/vendor_modules/vary/README.md +101 -0
  713. package/assets/api/vendor_modules/vary/index.js +149 -0
  714. package/assets/api/vendor_modules/vary/package.json +43 -0
  715. package/assets/federation-presignup/index.js +108 -0
  716. package/assets/firstadmin/index.js +361 -0
  717. package/assets/headscale-apikey/index.js +140 -0
  718. package/assets/invoke-relay/index.js +96 -0
  719. package/assets/issuer-canary/index.js +71 -0
  720. package/assets/issuer-publish/index.js +87 -0
  721. package/assets/keyminter/index.js +209 -0
  722. package/assets/plugin-authorizer/index.js +1740 -0
  723. package/assets/plugin-catalog/index.js +881 -0
  724. package/assets/reapproval/index.js +3761 -0
  725. package/assets/sg-manager/index.js +176 -0
  726. package/assets/tailnet-resolver/index.js +55 -0
  727. package/assets/web/chunk-2MOGDYK4.js +1 -0
  728. package/assets/web/chunk-2SO4BVIT.js +1 -0
  729. package/assets/web/chunk-2V6RSAAC.js +1 -0
  730. package/assets/web/chunk-32GNBTAL.js +1 -0
  731. package/assets/web/chunk-33SYY2JB.js +1 -0
  732. package/assets/web/chunk-3VWYT7AX.js +1 -0
  733. package/assets/web/chunk-4FG4DAWU.js +4 -0
  734. package/assets/web/chunk-4N2IUS6T.js +1 -0
  735. package/assets/web/chunk-4SK6XQ6C.js +1 -0
  736. package/assets/web/chunk-65WE5MXA.js +8 -0
  737. package/assets/web/chunk-6D7SSSJF.js +1 -0
  738. package/assets/web/chunk-6KFR7DYY.js +1 -0
  739. package/assets/web/chunk-A4WHI3ZG.js +8 -0
  740. package/assets/web/chunk-BNFKRZTP.js +1 -0
  741. package/assets/web/chunk-CG56PH3M.js +1 -0
  742. package/assets/web/chunk-CGO25AIM.js +1 -0
  743. package/assets/web/chunk-CP4XZPOA.js +1 -0
  744. package/assets/web/chunk-CV7EODPO.js +1 -0
  745. package/assets/web/chunk-D7TR2ORJ.js +1 -0
  746. package/assets/web/chunk-DCOFBAKJ.js +1 -0
  747. package/assets/web/chunk-DOLRLYW7.js +1 -0
  748. package/assets/web/chunk-EEJ3X466.js +1 -0
  749. package/assets/web/chunk-EQ4PF25J.js +1 -0
  750. package/assets/web/chunk-EVP5UVDQ.js +1 -0
  751. package/assets/web/chunk-EW2VMNHE.js +1 -0
  752. package/assets/web/chunk-FIUVIKAN.js +1 -0
  753. package/assets/web/chunk-GHEU25TG.js +1 -0
  754. package/assets/web/chunk-GK2T2SMO.js +1 -0
  755. package/assets/web/chunk-GKI3R2JB.js +1 -0
  756. package/assets/web/chunk-GPKKIOHD.js +2 -0
  757. package/assets/web/chunk-H4AVFUDM.js +1 -0
  758. package/assets/web/chunk-H5H727H6.js +1 -0
  759. package/assets/web/chunk-HGVFH6YM.js +1 -0
  760. package/assets/web/chunk-HHPIANBK.js +1 -0
  761. package/assets/web/chunk-HK56COCB.js +1 -0
  762. package/assets/web/chunk-HZUB7LFV.js +1 -0
  763. package/assets/web/chunk-I7NTNTBA.js +1 -0
  764. package/assets/web/chunk-IKK5DQ3Z.js +1 -0
  765. package/assets/web/chunk-IMH56UBX.js +1 -0
  766. package/assets/web/chunk-J3SSPCFV.js +1 -0
  767. package/assets/web/chunk-J4C7C5KO.js +1 -0
  768. package/assets/web/chunk-J57JB4MU.js +1 -0
  769. package/assets/web/chunk-JMBXRK3I.js +4 -0
  770. package/assets/web/chunk-KCCEQIXX.js +1 -0
  771. package/assets/web/chunk-KEBESIXR.js +1 -0
  772. package/assets/web/chunk-KPNHT4MK.js +1 -0
  773. package/assets/web/chunk-LMLXTVZG.js +1 -0
  774. package/assets/web/chunk-M6OAYNRE.js +1 -0
  775. package/assets/web/chunk-M7MGX5I4.js +1 -0
  776. package/assets/web/chunk-MU2VNTNY.js +1 -0
  777. package/assets/web/chunk-NABAVDRL.js +1 -0
  778. package/assets/web/chunk-NO5D6WDF.js +1 -0
  779. package/assets/web/chunk-O4QSFUXB.js +1 -0
  780. package/assets/web/chunk-OATVFQXO.js +1 -0
  781. package/assets/web/chunk-P5WRM37W.js +5 -0
  782. package/assets/web/chunk-PCP6D2SM.js +1 -0
  783. package/assets/web/chunk-PMMBJK7Q.js +1 -0
  784. package/assets/web/chunk-PSMER3HX.js +1 -0
  785. package/assets/web/chunk-QPBWZLCT.js +1 -0
  786. package/assets/web/chunk-QVABVDO5.js +1 -0
  787. package/assets/web/chunk-RI77LE5V.js +1 -0
  788. package/assets/web/chunk-RKGUEXZ2.js +1 -0
  789. package/assets/web/chunk-RMFH2YTZ.js +1 -0
  790. package/assets/web/chunk-RROPCBUH.js +1 -0
  791. package/assets/web/chunk-SJMLX5AT.js +1 -0
  792. package/assets/web/chunk-TKVALOE4.js +2 -0
  793. package/assets/web/chunk-TM43WUKM.js +1 -0
  794. package/assets/web/chunk-VKWV3ANT.js +1 -0
  795. package/assets/web/chunk-VTMYG6YW.js +1 -0
  796. package/assets/web/chunk-VWW4SA5R.js +1 -0
  797. package/assets/web/chunk-WEDAFMID.js +1 -0
  798. package/assets/web/chunk-WFIHWVQO.js +1 -0
  799. package/assets/web/chunk-XJM3HDJQ.js +1 -0
  800. package/assets/web/chunk-YVJV2RUY.js +1 -0
  801. package/assets/web/chunk-Z3KONI7L.js +1 -0
  802. package/assets/web/chunk-ZDCURXPS.js +1 -0
  803. package/assets/web/favicon.ico +0 -0
  804. package/assets/web/index.html +63 -0
  805. package/assets/web/main-S6E3BC5O.js +2 -0
  806. package/assets/web/polyfills-7RSNIJ6J.js +2 -0
  807. package/assets/web/styles-R6ZUWC6K.css +1 -0
  808. package/dist/index.d.ts +27 -0
  809. package/dist/index.js +66 -0
  810. package/dist/lambdacode/api/services/brandingShapes.d.ts +5 -0
  811. package/dist/lambdacode/api/services/brandingShapes.js +15 -0
  812. package/dist/lambdacode/issuer/objects.d.ts +8 -0
  813. package/dist/lambdacode/issuer/objects.js +11 -0
  814. package/dist/lambdacode/network/naming.d.ts +52 -0
  815. package/dist/lambdacode/network/naming.js +67 -0
  816. package/dist/lib/access-portal-hub.d.ts +53 -0
  817. package/dist/lib/access-portal-hub.js +87 -0
  818. package/dist/lib/access-portal.d.ts +32 -0
  819. package/dist/lib/access-portal.js +174 -0
  820. package/dist/lib/audit-log.d.ts +18 -0
  821. package/dist/lib/audit-log.js +25 -0
  822. package/dist/lib/connector-stack.d.ts +28 -0
  823. package/dist/lib/connector-stack.js +81 -0
  824. package/dist/lib/constructs/app-function.d.ts +14 -0
  825. package/dist/lib/constructs/app-function.js +84 -0
  826. package/dist/lib/constructs/app-table.d.ts +12 -0
  827. package/dist/lib/constructs/app-table.js +58 -0
  828. package/dist/lib/constructs/mirrored-image.d.ts +12 -0
  829. package/dist/lib/constructs/mirrored-image.js +80 -0
  830. package/dist/lib/constructs/monitoring.d.ts +21 -0
  831. package/dist/lib/constructs/monitoring.js +133 -0
  832. package/dist/lib/constructs/oidc-issuer.d.ts +44 -0
  833. package/dist/lib/constructs/oidc-issuer.js +234 -0
  834. package/dist/lib/constructs/scratch-tmpfs.d.ts +5 -0
  835. package/dist/lib/constructs/scratch-tmpfs.js +48 -0
  836. package/dist/lib/constructs/sg-manager.d.ts +27 -0
  837. package/dist/lib/constructs/sg-manager.js +88 -0
  838. package/dist/lib/constructs/tailnet-connector.d.ts +29 -0
  839. package/dist/lib/constructs/tailnet-connector.js +177 -0
  840. package/dist/lib/constructs/tailnet-resolver.d.ts +30 -0
  841. package/dist/lib/constructs/tailnet-resolver.js +71 -0
  842. package/dist/lib/constructs/target-account-trust.d.ts +32 -0
  843. package/dist/lib/constructs/target-account-trust.js +81 -0
  844. package/dist/lib/constructs/vending-api.d.ts +103 -0
  845. package/dist/lib/constructs/vending-api.js +203 -0
  846. package/dist/lib/constructs/web-acl.d.ts +61 -0
  847. package/dist/lib/constructs/web-acl.js +213 -0
  848. package/dist/lib/constructs/web-identity.d.ts +49 -0
  849. package/dist/lib/constructs/web-identity.js +116 -0
  850. package/dist/lib/creds-stack.d.ts +151 -0
  851. package/dist/lib/creds-stack.js +592 -0
  852. package/dist/lib/data-stack.d.ts +53 -0
  853. package/dist/lib/data-stack.js +282 -0
  854. package/dist/lib/dimensions-validation.d.ts +20 -0
  855. package/dist/lib/dimensions-validation.js +51 -0
  856. package/dist/lib/federation.d.ts +113 -0
  857. package/dist/lib/federation.js +254 -0
  858. package/dist/lib/managed-login-branding.json +450 -0
  859. package/dist/lib/network-stack.d.ts +58 -0
  860. package/dist/lib/network-stack.js +776 -0
  861. package/dist/lib/network-validation.d.ts +54 -0
  862. package/dist/lib/network-validation.js +220 -0
  863. package/dist/lib/pkg-paths.d.ts +3 -0
  864. package/dist/lib/pkg-paths.js +51 -0
  865. package/dist/lib/plugins/plugin-api.d.ts +40 -0
  866. package/dist/lib/plugins/plugin-api.js +125 -0
  867. package/dist/lib/plugins/plugin-catalog-activation.d.ts +31 -0
  868. package/dist/lib/plugins/plugin-catalog-activation.js +109 -0
  869. package/dist/lib/plugins/registration.d.ts +41 -0
  870. package/dist/lib/plugins/registration.js +121 -0
  871. package/dist/lib/plugins/runtime.d.ts +10 -0
  872. package/dist/lib/plugins/runtime.js +17 -0
  873. package/dist/lib/project-config.d.ts +164 -0
  874. package/dist/lib/project-config.js +2 -0
  875. package/dist/lib/target-account-stack.d.ts +15 -0
  876. package/dist/lib/target-account-stack.js +59 -0
  877. package/dist/lib/target-account-template.d.ts +13 -0
  878. package/dist/lib/target-account-template.js +64 -0
  879. package/dist/lib/web-cert-stack.d.ts +30 -0
  880. package/dist/lib/web-cert-stack.js +90 -0
  881. package/dist/lib/web-stack.d.ts +103 -0
  882. package/dist/lib/web-stack.js +540 -0
  883. package/node_modules/@fntio/infra-client-plugin-sdk/README.md +303 -0
  884. package/node_modules/@fntio/infra-client-plugin-sdk/dist/backend/context.d.ts +31 -0
  885. package/node_modules/@fntio/infra-client-plugin-sdk/dist/backend/context.js +58 -0
  886. package/node_modules/@fntio/infra-client-plugin-sdk/dist/backend/index.d.ts +9 -0
  887. package/node_modules/@fntio/infra-client-plugin-sdk/dist/backend/index.js +26 -0
  888. package/node_modules/@fntio/infra-client-plugin-sdk/dist/browser/client.d.ts +59 -0
  889. package/node_modules/@fntio/infra-client-plugin-sdk/dist/browser/client.js +290 -0
  890. package/node_modules/@fntio/infra-client-plugin-sdk/dist/browser/errors.d.ts +14 -0
  891. package/node_modules/@fntio/infra-client-plugin-sdk/dist/browser/errors.js +32 -0
  892. package/node_modules/@fntio/infra-client-plugin-sdk/dist/browser/http.d.ts +72 -0
  893. package/node_modules/@fntio/infra-client-plugin-sdk/dist/browser/http.js +170 -0
  894. package/node_modules/@fntio/infra-client-plugin-sdk/dist/browser/index.d.ts +11 -0
  895. package/node_modules/@fntio/infra-client-plugin-sdk/dist/browser/index.js +28 -0
  896. package/node_modules/@fntio/infra-client-plugin-sdk/dist/browser/theme-apply.d.ts +22 -0
  897. package/node_modules/@fntio/infra-client-plugin-sdk/dist/browser/theme-apply.js +22 -0
  898. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/access.d.ts +14 -0
  899. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/access.js +41 -0
  900. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/authorizer.d.ts +17 -0
  901. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/authorizer.js +44 -0
  902. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/canonical.d.ts +2 -0
  903. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/canonical.js +21 -0
  904. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/catalog.d.ts +39 -0
  905. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/catalog.js +18 -0
  906. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/discovery.d.ts +78 -0
  907. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/discovery.js +48 -0
  908. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/fields.d.ts +7 -0
  909. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/fields.js +2 -0
  910. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/manifest.d.ts +59 -0
  911. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/manifest.js +19 -0
  912. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/messages.d.ts +111 -0
  913. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/messages.js +109 -0
  914. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/paths.d.ts +20 -0
  915. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/paths.js +49 -0
  916. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/theme.d.ts +21 -0
  917. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/theme.js +60 -0
  918. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/transport.d.ts +14 -0
  919. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/transport.js +10 -0
  920. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/validate.d.ts +27 -0
  921. package/node_modules/@fntio/infra-client-plugin-sdk/dist/contracts/validate.js +321 -0
  922. package/node_modules/@fntio/infra-client-plugin-sdk/dist/fixtures/devHost.d.ts +61 -0
  923. package/node_modules/@fntio/infra-client-plugin-sdk/dist/fixtures/devHost.js +99 -0
  924. package/node_modules/@fntio/infra-client-plugin-sdk/dist/fixtures/fakeDocument.d.ts +12 -0
  925. package/node_modules/@fntio/infra-client-plugin-sdk/dist/fixtures/fakeDocument.js +22 -0
  926. package/node_modules/@fntio/infra-client-plugin-sdk/dist/fixtures/fakeWindows.d.ts +22 -0
  927. package/node_modules/@fntio/infra-client-plugin-sdk/dist/fixtures/fakeWindows.js +46 -0
  928. package/node_modules/@fntio/infra-client-plugin-sdk/dist/fixtures/index.d.ts +4 -0
  929. package/node_modules/@fntio/infra-client-plugin-sdk/dist/fixtures/index.js +20 -0
  930. package/node_modules/@fntio/infra-client-plugin-sdk/dist/fixtures/samples.d.ts +37 -0
  931. package/node_modules/@fntio/infra-client-plugin-sdk/dist/fixtures/samples.js +228 -0
  932. package/node_modules/@fntio/infra-client-plugin-sdk/dist/host/host.d.ts +47 -0
  933. package/node_modules/@fntio/infra-client-plugin-sdk/dist/host/host.js +121 -0
  934. package/node_modules/@fntio/infra-client-plugin-sdk/dist/host/index.d.ts +5 -0
  935. package/node_modules/@fntio/infra-client-plugin-sdk/dist/host/index.js +22 -0
  936. package/node_modules/@fntio/infra-client-plugin-sdk/dist/index.d.ts +10 -0
  937. package/node_modules/@fntio/infra-client-plugin-sdk/dist/index.js +28 -0
  938. package/node_modules/@fntio/infra-client-plugin-sdk/package.json +99 -0
  939. package/openapi.yaml +4284 -0
  940. package/package.json +124 -4
package/README.md CHANGED
@@ -1,3 +1,876 @@
1
- # Temporary Holding Version
1
+ # @fntio/infra-client
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ A self-hosted AWS access portal, delivered as CDK stacks and constructs. Your
4
+ team signs in to a web app under your own domain, gets short-lived credentials
5
+ for the AWS accounts and roles you allow, and optionally reaches private
6
+ resources (databases, internal web servers) over a built-in VPN. Everything
7
+ runs inside your own AWS accounts.
8
+
9
+ This package is the whole product. You write one small CDK app, point it at a
10
+ typed config object, and deploy. Nothing is built on your machine: the Lambda
11
+ code is prebundled and the web app is already compiled.
12
+
13
+ - [What is in the tarball](#what-is-in-the-tarball)
14
+ - [Requirements](#requirements)
15
+ - [Install](#install)
16
+ - [Your deployment project](#your-deployment-project)
17
+ - [The config file](#the-config-file)
18
+ - [The app file](#the-app-file)
19
+ - [Deploy](#deploy)
20
+ - [Upgrade](#upgrade)
21
+ - [Decisions you make once](#decisions-you-make-once)
22
+ - [Security Hub](#security-hub)
23
+ - [Activity log](#activity-log)
24
+ - [Public API](#public-api)
25
+ - [Plugins](#plugins)
26
+ - [Plugin permissions](#plugin-permissions)
27
+ - [Bring your own web build](#bring-your-own-web-build)
28
+ - [HTTP API](#http-api)
29
+ - [License](#license)
30
+
31
+ ## What is in the tarball
32
+
33
+ ```
34
+ fntio-infra-client-<version>.tgz
35
+ └── package/
36
+ ├── package.json
37
+ ├── README.md this file
38
+ ├── CHANGELOG.md what each version changed
39
+ ├── LICENSE Elastic License 2.0
40
+ ├── openapi.yaml the portal's HTTP API contract (OpenAPI 3.1)
41
+ ├── dist/ compiled stacks + constructs, with .d.ts types
42
+ │ └── index.js the import surface: import { ... } from "@fntio/infra-client"
43
+ └── assets/
44
+ ├── api/ the portal API Lambda, prebundled
45
+ │ ├── index.js
46
+ │ └── vendor_modules/ its runtime dependencies (express and friends)
47
+ ├── issuer-publish/ writes the OIDC discovery document + JWKS to the issuer bucket at deploy time
48
+ ├── issuer-canary/ issuer health probe (alarms)
49
+ ├── reapproval/ standing-access review sweeps
50
+ ├── firstadmin/ creates the first admin during the deploy
51
+ ├── federation-presignup/ SSO: Cognito pre-sign-up trigger that links a first federated sign-in to the invited user
52
+ ├── plugin-authorizer/ plugins: the shared REQUEST authorizer on every plugin route
53
+ ├── plugin-catalog/ plugins: writes each registered plugin's catalog record at deploy time
54
+ ├── headscale-apikey/ VPN control-plane bootstrap
55
+ ├── sg-manager/ VPN: per-resource security-group automation
56
+ ├── tailnet-resolver/ VPN: in-VPC DNS for private names
57
+ ├── keyminter/ VPN: device and connector key minting
58
+ ├── acl-reconciler/ VPN: grants → network ACLs
59
+ ├── invoke-relay/ VPN: the reconciler's relay to SG-managers and resolvers in another region
60
+ └── web/ the built web app (index.html, main-*.js, styles)
61
+ ```
62
+
63
+ Every Lambda folder is a single `index.js` that CDK uploads as-is when you
64
+ synthesize. `assets/web` is served by `WebStack`; the `config.json` the app
65
+ reads at runtime is generated from your config during the deploy, so the
66
+ tarball never contains another deployment's values.
67
+
68
+ Source code (`.ts`) is not in the package. The compiled stacks in `dist/`
69
+ are readable as shipped (browse them at
70
+ [unpkg.com/browse/@fntio/infra-client/](https://unpkg.com/browse/@fntio/infra-client/));
71
+ the target-account stack a security team usually wants to read is
72
+ `dist/lib/target-account-stack.js` with `dist/lib/constructs/target-account-trust.js`.
73
+
74
+ ## Requirements
75
+
76
+ - **Node.js 20 or newer** and the AWS CDK CLI on the machine you deploy from.
77
+ - **`aws-cdk-lib` 2.263 or newer and `constructs` 10.x** in your project.
78
+ Both are peer dependencies; the install step below adds them.
79
+ - **A hub AWS account** with administrator credentials. The portal, sign-in,
80
+ credential issuer, and optional VPN control plane deploy here.
81
+ - **A Route 53 hosted zone** in the hub account for a domain or subdomain you
82
+ control, for example `access.acme.com`. The app, the sign-in page, the
83
+ issuer, and the VPN all get names under it.
84
+ - **CDK bootstrap in two regions** of the hub account: your deploy region and
85
+ `us-east-1`. CloudFront only accepts certificates and WAF web ACLs from
86
+ `us-east-1`, so a small certificate stack always deploys there (the
87
+ credential issuer's certificate lives in it).
88
+ - One workload account per set of roles you want to hand out, each with its
89
+ own credentials for the deploy.
90
+
91
+ Two AWS-side approvals take up to a day. File them before the first deploy:
92
+
93
+ - **Lambda concurrency raise** in the hub account. Fresh accounts cap
94
+ concurrent executions at 10, and the deploy's own custom resources can hit
95
+ that.
96
+
97
+ ```bash
98
+ aws service-quotas request-service-quota-increase \
99
+ --service-code lambda --quota-code L-B99A9384 --desired-value 1000
100
+ ```
101
+
102
+ - **SES production access** in the hub account, only if you set the `email`
103
+ block. In the SES sandbox, mail reaches verified addresses only, and the
104
+ first-admin invite is sent during the deploy.
105
+
106
+ ## Install
107
+
108
+ ### From npm
109
+
110
+ ```bash
111
+ mkdir acme-access && cd acme-access
112
+ npm init -y
113
+ npm install @fntio/infra-client aws-cdk-lib constructs
114
+ npm install -D typescript ts-node @types/node aws-cdk
115
+ ```
116
+
117
+ Public package, no token. Pin the exact version in `package.json` if your
118
+ deployments are rolled out deliberately; `npm install @fntio/infra-client@<version>`
119
+ is the upgrade.
120
+
121
+ ### From a tarball
122
+
123
+ Every version is also attached to its GitHub Release as
124
+ `fntio-infra-client-<version>.tgz` on
125
+ [FNTIO/aws-infrastructure-client](https://github.com/FNTIO/aws-infrastructure-client/releases),
126
+ for deployment repositories that vendor dependencies. Commit it and depend on
127
+ it with a `file:` spec; CI installs it like any other dependency.
128
+
129
+ ```bash
130
+ mkdir vendor && cp ~/Downloads/fntio-infra-client-<version>.tgz vendor/
131
+ npm install ./vendor/fntio-infra-client-<version>.tgz aws-cdk-lib constructs
132
+ ```
133
+
134
+ `package.json` then carries
135
+ `"@fntio/infra-client": "file:vendor/fntio-infra-client-<version>.tgz"`.
136
+ Upgrading is replacing the file and the version in that line; moving to the
137
+ registry is swapping the `file:` spec for a semver range.
138
+
139
+ ## Your deployment project
140
+
141
+ ```
142
+ acme-access/
143
+ ├── package.json
144
+ ├── cdk.json
145
+ ├── tsconfig.json
146
+ ├── bin/app.ts the CDK app: hub stacks + one stack per workload account
147
+ ├── config/project.ts everything specific to your deployment, typed
148
+ └── vendor/ the tarball, only if you vendor it
149
+ ```
150
+
151
+ `cdk.json`:
152
+
153
+ ```json
154
+ {
155
+ "app": "npx ts-node --prefer-ts-exts bin/app.ts",
156
+ "context": {
157
+ "@aws-cdk/aws-iam:minimizePolicies": true,
158
+ "@aws-cdk/core:defaultCrossStackReferences": "strong"
159
+ }
160
+ }
161
+ ```
162
+
163
+ `tsconfig.json` needs `"module": "commonjs"`, `"target": "ES2022"`,
164
+ `"strict": true`, `"esModuleInterop": true`, and `"types": ["node"]`.
165
+
166
+ ## The config file
167
+
168
+ `config/project.ts` is one exported `ProjectConfig` object. Every field is
169
+ typed and documented in your editor. Values that would fail at deploy time
170
+ (a trailing dot on a zone name, an account id that is not 12 digits, an
171
+ overlapping VPC range between two sites) fail at synth with a plain error.
172
+
173
+ ```ts
174
+ // config/project.ts
175
+ import * as iam from "aws-cdk-lib/aws-iam";
176
+ import { InfraClientRoles, type ProjectConfig } from "@fntio/infra-client";
177
+
178
+ const ZONE = { hostedZoneId: "Z0ABC12DEF34GH", zoneName: "access.acme.com" };
179
+
180
+ export const PROJECT: ProjectConfig = {
181
+ projectName: "Acme Access",
182
+
183
+ // The hub account. Explicit on purpose: nothing depends on whose
184
+ // credentials run the synth.
185
+ env: { account: "111122223333", region: "eu-central-1" },
186
+
187
+ // true = tables (with point-in-time recovery and deletion protection), the
188
+ // user pool, and the issuer signing keys are RETAINED on teardown, and every
189
+ // hub stack gets termination protection. Use true for anything real.
190
+ prod: true,
191
+
192
+ // Ops alarms go here: one address or a list. AWS emails each address a
193
+ // subscription confirmation on the first deploy. Click it or alarms go nowhere.
194
+ alertEmail: "platform@acme.com",
195
+
196
+ // Optional. Prefix for every by-name cross-account resource, 15 chars max.
197
+ // SET ONCE before the first deploy; renaming later breaks all of them.
198
+ // Default "infra-client".
199
+ resourcePrefix: "acme-access",
200
+
201
+ // PERMANENT. https://<domainName> is baked into every workload account's
202
+ // trust policy. Changing it later breaks credential issuing everywhere.
203
+ // keyVersions / signerVersion default to [1] / 1; they exist for key rotation.
204
+ issuer: { ...ZONE, domainName: "issuer.access.acme.com" },
205
+
206
+ // Sign-in methods. Every field is listed so none is missed; the first three
207
+ // are the choices users see on the sign-in page.
208
+ loginMethods: {
209
+ password: true, // always on: Cognito requires it
210
+ passkey: true, // Touch ID / Windows Hello / security keys; needs the `web` block
211
+ emailOtp: true, // passwordless one-time code by email
212
+ mfa: "optional", // TOTP on password sign-ins, "optional" | "required"; a password-only pool must set it
213
+ threatProtection: false, // Cognito threat protection (PLUS plan, about $0.02 per active user); needs mfa
214
+ federation: [], // your own OIDC provider(s): wiki Runbooks-Users, "Federated sign-in (SSO)"
215
+ },
216
+
217
+ // Created in the admins group by the deploy and emailed a set-your-password
218
+ // link. Lowercase, a real mailbox. Bump `resend` to re-send an unclaimed invite.
219
+ firstAdmin: { email: "you@acme.com" },
220
+
221
+ // Optional. All portal mail (codes, invites, resets) from your own domain
222
+ // via SES; DKIM/SPF/DMARC records are created for you. fromAddress must be
223
+ // under zoneName. Omit to use Cognito's built-in sender (about 50/day).
224
+ email: {
225
+ ...ZONE,
226
+ fromAddress: "no-reply@access.acme.com",
227
+ fromName: "Acme Access",
228
+ dmarcReportEmail: "platform@acme.com",
229
+ },
230
+
231
+ // Optional. The app on domainName, sign-in on authDomainName, which must be
232
+ // a child of domainName. Omit to run on the CloudFront and Cognito default hosts.
233
+ web: {
234
+ ...ZONE,
235
+ domainName: "access.acme.com",
236
+ authDomainName: "auth.access.acme.com",
237
+ },
238
+
239
+ // Optional. WAF on CloudFront and the API. ON by default (about $26/month);
240
+ // rateLimit = /api/* requests per client IP per 5 minutes before a 429 (one
241
+ // office NAT is one IP, so size for the office); perTokenRateLimit = API
242
+ // requests per bearer token per 5 minutes — a ceiling on a runaway or
243
+ // leaked token, sized above the product's own bulk bursts.
244
+ waf: { enabled: true, rateLimit: 5000, perTokenRateLimit: 2000 },
245
+
246
+ // Optional. How long the activity log keeps each row (30–3650 days).
247
+ // Default 400, which outlasts the yearly access review.
248
+ audit: { retentionDays: 400 },
249
+
250
+ // First impression only. Admins can restyle in the app afterwards.
251
+ // brandShow: "logo" | "project" | "company" | "logo-and-project" | "logo-and-company".
252
+ branding: {
253
+ logoUrl: "https://acme.com/logo.svg", // or logoFile: "assets/logo.svg", a local file (no public URL)
254
+ primaryColor: "#0E7490",
255
+ accentColor: "#F59E0B",
256
+ companyName: "Acme",
257
+ brandShow: "logo-and-project",
258
+ },
259
+
260
+ // The roles users can get, per workload account. Deployed by
261
+ // TargetAccountStack (see the app file) and registered in the portal's
262
+ // Accounts page. Role names are pinned into trust policies: never rename.
263
+ rolesByAccount: {
264
+ "444455556666": [
265
+ InfraClientRoles.READ_ONLY,
266
+ InfraClientRoles.FULL_ADMIN,
267
+ {
268
+ ...InfraClientRoles.READ_ONLY,
269
+ roleName: "InfraAuditor",
270
+ description: "Read-only for the external audit team.",
271
+ },
272
+ ],
273
+ "777788889999": [
274
+ {
275
+ roleName: "BillingViewer",
276
+ managedPolicies: [
277
+ iam.ManagedPolicy.fromAwsManagedPolicyName("job-function/Billing"),
278
+ ],
279
+ },
280
+ ],
281
+ },
282
+
283
+ // Optional. The private network. Omit it and no VPN stack deploys and the
284
+ // portal shows no Network pages. One site = one routing domain; most
285
+ // deployments need exactly one. Site ids are PERMANENT once a device enrolls.
286
+ network: {
287
+ ...ZONE,
288
+ subdomain: "network", // sites live at <site>.network.access.acme.com
289
+ // containerInsights: true, // CloudWatch Container Insights on the VPN cluster; defaults to `prod`
290
+ sites: {
291
+ main: {
292
+ displayName: "Acme",
293
+ // Every account belongs to exactly one site.
294
+ accounts: ["444455556666", "777788889999"],
295
+ // Accounts allowed to run a connector (machine keys only).
296
+ connectorAccounts: ["444455556666"],
297
+ // VPCs joined by ConnectorStack, keyed by account. Drives the deploy
298
+ // and the per-site CIDR overlap check. Add `region` for a VPC outside
299
+ // the hub's region.
300
+ connectorVpcs: {
301
+ "444455556666": { vpcId: "vpc-0abc1234def567890", routes: ["10.20.0.0/16"] },
302
+ // Several VPCs in one account: a list, every entry but one named — the
303
+ // name suffixes that connector's hostname, stack id and function names.
304
+ // "444455556666": [
305
+ // { vpcId: "vpc-0abc1234def567890", routes: ["10.20.0.0/16"] },
306
+ // { vpcId: "vpc-0def5678abc123456", routes: ["10.50.0.0/16"], name: "sandbox" },
307
+ // ],
308
+ },
309
+ // Private DNS names resolved inside that VPC (its resolver = CIDR base + 2).
310
+ splitDns: { "corp.internal": ["10.20.0.2"] },
311
+ },
312
+ },
313
+ },
314
+ };
315
+ ```
316
+
317
+ The blocks at a glance:
318
+
319
+ | Block | Required | Changeable later | What it controls |
320
+ | --- | --- | --- | --- |
321
+ | `projectName`, `env`, `prod`, `alertEmail` | yes | `prod` and `alertEmail` yes; `env` no | Identity of the deployment |
322
+ | `resourcePrefix` | no | **no** | Names of every cross-account resource |
323
+ | `issuer` | yes | **no** (`keyVersions`/`signerVersion` yes) | The credential issuer host every account trusts |
324
+ | `loginMethods` | yes | yes | Password, passkey, email code, TOTP second factor, threat protection, federated sign-in |
325
+ | `firstAdmin` | no | yes | The admin account the deploy creates |
326
+ | `email` | no | yes | Portal mail from your own domain |
327
+ | `web` | no | add yes; change or remove **no** in practice | Custom app and sign-in domains; also the passkey relying-party id (a change orphans every registered passkey) and the us-east-1 certificate `WebStack` imports across regions |
328
+ | `waf` | no | yes | Web ACLs on CloudFront and the API |
329
+ | `audit` | no | yes (rows already written keep their retention) | Activity-log retention |
330
+ | `branding` | yes (may be `{}`) | yes | Logo and colors until an admin restyles in-app |
331
+ | `rolesByAccount` | yes | add yes, rename **no** | Roles per workload account |
332
+ | `network` | no | add sites yes, rename site ids **no** | The VPN |
333
+ | `plugins` | no | yes (remove registrations one deploy before turning it off) | The customer-plugin runtime |
334
+
335
+ ## The app file
336
+
337
+ `bin/app.ts` turns the config into stacks. The hub stacks and one small stack
338
+ per workload account live in the same app; deploys pick stacks by name and
339
+ run with that account's credentials.
340
+
341
+ ```ts
342
+ // bin/app.ts
343
+ import { App } from "aws-cdk-lib";
344
+ import {
345
+ addAccessPortal,
346
+ AccessPortalHub,
347
+ ConnectorStack,
348
+ DEFAULT_RESOURCE_PREFIX,
349
+ resolveSites,
350
+ TargetAccountStack,
351
+ } from "@fntio/infra-client";
352
+ import { PROJECT } from "../config/project";
353
+
354
+ const app = new App();
355
+ const resourcePrefix = PROJECT.resourcePrefix ?? DEFAULT_RESOURCE_PREFIX;
356
+ const { account, region } = PROJECT.env;
357
+
358
+ // Validates the sites (slugs, one site per account, CIDR overlap) and fails
359
+ // the synth with the reason. Required whenever `network` is set.
360
+ const sites = PROJECT.network ? resolveSites(PROJECT.network) : undefined;
361
+
362
+ // The hub: DataStack, CredsStack, WebCertStack (us-east-1), WebStack, and
363
+ // NetworkStack when `network` is set. Deploy these with hub credentials.
364
+ addAccessPortal(app, { project: PROJECT, resourcePrefix, sites });
365
+
366
+ // The same hub as cross-account stacks see it: every well-known name and ARN
367
+ // derives from these attributes, so you never assemble one by hand.
368
+ const hub = AccessPortalHub.fromAttributes({
369
+ account,
370
+ region,
371
+ resourcePrefix,
372
+ issuerDomain: PROJECT.issuer.domainName,
373
+ network: PROJECT.network
374
+ ? { zoneName: PROJECT.network.zoneName, subdomain: PROJECT.network.subdomain }
375
+ : undefined,
376
+ });
377
+
378
+ // One stack per workload account: an OIDC provider trusting the hub's ISSUER
379
+ // (never the hub account) plus the listed roles. Nothing else. Deploy each
380
+ // with that account's credentials.
381
+ for (const [targetAccount, roles] of Object.entries(PROJECT.rolesByAccount)) {
382
+ new TargetAccountStack(app, `AccessTarget-${targetAccount}`, {
383
+ env: { account: targetAccount, region },
384
+ issuerUrl: hub.issuerUrl!,
385
+ roles,
386
+ });
387
+ }
388
+
389
+ // One stack per connector VPC (VPN only). The site decides its control plane
390
+ // and which key minter it may call.
391
+ for (const site of sites ?? []) {
392
+ for (const [connectorAccount, vpcs] of Object.entries(site.connectorVpcs)) {
393
+ for (const vpc of vpcs) {
394
+ const suffix = vpc.name ? `-${vpc.name}` : "";
395
+ new ConnectorStack(app, `Connector-${connectorAccount}${suffix}`, {
396
+ env: { account: connectorAccount, region: vpc.region ?? region },
397
+ hub,
398
+ site: site.id,
399
+ vpcId: vpc.vpcId,
400
+ routes: [...vpc.routes],
401
+ name: vpc.name,
402
+ });
403
+ }
404
+ }
405
+ }
406
+ ```
407
+
408
+ Prefer to build the IAM roles yourself? Skip `TargetAccountStack`: create the
409
+ provider once with `createIssuerProvider(scope, id, issuerUrl)` and use
410
+ `webIdentityPrincipal(provider, roleName)` as `assumedBy` on any `iam.Role`.
411
+ The role's `roleName` must equal the name passed to `webIdentityPrincipal`;
412
+ the trust policy pins it. The same applies to the VPN: `TailnetConnector` and
413
+ `SgManager` compose into a stack you already own instead of `ConnectorStack`.
414
+
415
+ ## Deploy
416
+
417
+ ### 1. Bootstrap the hub account, both regions
418
+
419
+ ```bash
420
+ export AWS_PROFILE=acme-hub
421
+ npx cdk bootstrap aws://111122223333/eu-central-1
422
+ npx cdk bootstrap aws://111122223333/us-east-1
423
+ ```
424
+
425
+ ### 2. Deploy the hub
426
+
427
+ Deploy by name. `--all` would also try the workload-account stacks with the
428
+ wrong credentials.
429
+
430
+ ```bash
431
+ npx cdk deploy DataStack CredsStack WebStack # WebCertStack deploys as a dependency
432
+ npx cdk deploy NetworkStack # only with a `network` block
433
+ ```
434
+
435
+ The first run takes 15 to 30 minutes; certificate issuing and DNS dominate.
436
+ While it runs, confirm the SNS subscription that lands in `alertEmail`.
437
+
438
+ When it finishes, read the outputs:
439
+
440
+ - `CredsStack.FirstAdminInviteSent`: `sent` means check the first admin's
441
+ inbox (the link is valid 7 days). `suppressed` means the account exists but
442
+ the mail could not go out, almost always SES still in its sandbox; get
443
+ production access or verify the address, then bump `firstAdmin.resend` and
444
+ redeploy. `already-active` means nothing to do.
445
+ - `WebStack.WebUrl`: your portal.
446
+
447
+ Sign in. The first admin is offered a theme wizard; anything set there
448
+ overrides the deploy-time `branding` without a redeploy.
449
+
450
+ ### 3. Connect a workload account
451
+
452
+ ```bash
453
+ export AWS_PROFILE=acme-sandbox
454
+ npx cdk bootstrap aws://444455556666/eu-central-1 # once per account
455
+ npx cdk deploy AccessTarget-444455556666
456
+ ```
457
+
458
+ Then, in the portal as an admin: **Accounts → Add account** with the account
459
+ number and a friendly name, and add the roles you just deployed. Role names
460
+ must match `rolesByAccount` exactly; the portal cannot verify them across
461
+ accounts. Grant yourself one role, click **Get credentials** on its card, and
462
+ run `aws sts get-caller-identity`. It should report the workload account.
463
+
464
+ ### 4. Join a VPC to the VPN (optional)
465
+
466
+ ```bash
467
+ export AWS_PROFILE=acme-sandbox
468
+ npx cdk deploy Connector-444455556666
469
+ ```
470
+
471
+ The connector looks the VPC up at synth, so the command needs credentials for
472
+ that account. A VPC outside the hub's region (`connectorVpcs.<account>.region`)
473
+ deploys there, so bootstrap the account in that region first
474
+ (`npx cdk bootstrap aws://444455556666/eu-west-1`). An account's second VPC
475
+ carries a `name` in config and deploys as `Connector-444455556666-<name>`.
476
+ Back in the portal, register private resources (host and port)
477
+ on the **Network** page and grant them like roles. End users click
478
+ **Connect**; a guided setup installs the standard Tailscale client on first use.
479
+
480
+ ### Tear down
481
+
482
+ `npx cdk destroy` per stack, in reverse order. With `prod: true` every hub
483
+ stack has termination protection and the VPN load balancer has deletion
484
+ protection, so lift both first:
485
+
486
+ ```bash
487
+ aws cloudformation update-termination-protection --no-enable-termination-protection --stack-name <stack>
488
+ aws elbv2 modify-load-balancer-attributes --load-balancer-arn <arn> --attributes Key=deletion_protection.enabled,Value=false
489
+ ```
490
+
491
+ The tables, user pool, and signing keys are retained and must be deleted by
492
+ hand (tables keep deletion protection until you turn it off), and so is the
493
+ VPN control plane's EFS file system (Headscale state): delete its mount
494
+ targets, then the file system. A removed VPN site also leaves its API-key
495
+ secret (`<prefix>/headscale-apikey-<site>`) in Secrets Manager on purpose;
496
+ delete it once nothing uses that site.
497
+
498
+ ## Upgrade
499
+
500
+ ```bash
501
+ npm install @fntio/infra-client@<version> # vendored: replace the .tgz and the file: spec, then npm install
502
+ npx cdk diff DataStack CredsStack WebStack # review before anything changes
503
+ npx cdk deploy DataStack CredsStack WebStack
504
+ ```
505
+
506
+ Deploy the hub stacks together. The web app and the API version together, and
507
+ if one stack fails partway, some admin pages error until the failed stack
508
+ deploys cleanly. Browsers and the desktop app can keep an old web bundle
509
+ cached for a while; desktop users quit from the tray icon and relaunch.
510
+
511
+ Workload-account stacks rarely need redeploying. Their job is deliberately
512
+ frozen so hub upgrades do not cascade into every account. Redeploy one when
513
+ you add or change its roles.
514
+
515
+ ### Upgrading to 0.1.17 — the activity log and pop-up notifications
516
+
517
+ Nothing to migrate: older vend rows are read in the new shape. The deploy
518
+ adds one index to the audit table (`byActor`); it rides the normal hub
519
+ deploy. The reconciler writes VPN session, firewall-rule and connector rows
520
+ only after a manual `NetworkStack` deploy (it needs the table and the
521
+ retention in its environment). Set `audit.retentionDays` if the 400-day
522
+ default is not what your policy says; rows already written keep the
523
+ retention they were written with. Desktop users get the pop-up changes
524
+ (Windows toasts, click-to-open, wake refresh, VPN-drop notice) with the next
525
+ desktop build; the web app works with older shells.
526
+
527
+ ### Upgrading to 0.1.16 — several connector VPCs per account
528
+
529
+ `connectorVpcs.<account>` may be a list, every entry but one carrying a
530
+ `name`. A single VPC per account needs nothing. Deploy `NetworkStack` first
531
+ (its reconciler now addresses each VPC's SG-manager and resolver by name), and
532
+ when an account gains a second VPC redeploy its existing `Connector-<account>`
533
+ alongside the new `Connector-<account>-<name>`: the existing SG-manager learns
534
+ which VPC is its own and answers `other-vpc` for groups elsewhere.
535
+
536
+ ### Upgrading to 0.1.8 — the issuer moves onto CloudFront
537
+
538
+ The credential issuer (`https://issuer.<your zone>`) is served from a
539
+ private S3 bucket behind CloudFront instead of an API Gateway HTTP API. The
540
+ hostname, the signing keys and every workload account's trust are unchanged;
541
+ the deploy migrates in one CloudFormation update (new endpoint first, DNS
542
+ flipped in place, the API deleted last — about 15 minutes). Before you
543
+ deploy it:
544
+
545
+ - `us-east-1` must be CDK-bootstrapped in the hub account even if you run
546
+ without `web` and with WAF off — the issuer's certificate now lives in
547
+ the us-east-1 companion stack. Step 1 of "Deploy" covers it.
548
+ - Do not combine it with a `keyVersions` / `signerVersion` change.
549
+
550
+ After it: fetch `https://issuer.<your zone>/.well-known/openid-configuration`
551
+ and `…/.well-known/jwks.json`, then get credentials for one role from the
552
+ portal — that is the real proof (STS read the new JWKS). Delete the old
553
+ regional ACM certificate if CloudFormation left it behind, and suppress the
554
+ new CloudFront.17 finding for the issuer distribution if you run Security
555
+ Hub ("Security Hub" below). With WAF on, a third web ACL `<prefix>-issuer`
556
+ appears — observe-only, it never blocks, about $8/month.
557
+
558
+ ## Decisions you make once
559
+
560
+ | Value | Where | Why it is permanent |
561
+ | --- | --- | --- |
562
+ | Issuer hostname | `issuer.domainName` | In every workload account's trust policy |
563
+ | Resource prefix | `resourcePrefix` | Names every cross-account resource |
564
+ | Role names | `rolesByAccount[*].roleName` | Pinned into each role's trust condition |
565
+ | VPN site ids | keys of `network.sites` | The login hostname of every enrolled device and connector |
566
+ | Hub account and region | `env` | Everything else derives from it |
567
+
568
+ Everything else — branding, login methods, the list of sites and VPCs —
569
+ changes with a redeploy. The app's own web address (`web`) can be added
570
+ later, but changing or removing it orphans registered passkeys (see the
571
+ config table).
572
+
573
+ ## Security Hub
574
+
575
+ Deployments pass the AWS Foundational Security Best Practices controls that
576
+ apply to their resources by construction, or with `prod: true`. A few are
577
+ deliberate cost trade-offs or by-design exceptions (CloudFront distributions
578
+ without origin failover or signed-URL key groups) that you suppress once per
579
+ account. The source repository's runbook lists every control and its status
580
+ under "Security posture" in the deployment README.
581
+
582
+ ## Activity log
583
+
584
+ Every action that changes or uses access writes one row to the audit table:
585
+ who did it (a person, a service user, or `system:reapproval`,
586
+ `system:reconciler`, `system:deploy`, `system:expiry`), the action
587
+ (`object.verb`: `role.grant`, `request.approve`, `credentials.vend`,
588
+ `vpn.connect`, `admin.access`, …), whom or what it was about, the outcome
589
+ (`OK`, `DENIED`, `FAILED`) and a caller-safe reason. Group, cascade and bulk
590
+ changes also write derived rows per affected person (`access.gain`,
591
+ `access.lose`) from the same effective-access diff that produces the bell's
592
+ notices, linked to the primary row by a batch id — one per target, or one
593
+ per person carrying a `count` when a group or cascade change moves more than
594
+ five targets for them (the same threshold bundles the bell notice). The actor is bound per
595
+ request by the auth middleware and per job by the Lambda entry point; services
596
+ never take an actor parameter, so a row cannot name the wrong identity.
597
+
598
+ The log is advisory: nothing reads it to decide access. It is read by the
599
+ Activity page (`GET /admin/audit`, filters and a time cursor), by the yearly
600
+ review for a role's usage count, and by the setup checklist. Retention is
601
+ `audit.retentionDays` (30–3650, default 400). VPN sessions, firewall rules
602
+ and connector changes come from the reconciler's five-minute pass (five-minute granularity,
603
+ derived from Headscale's online state, so they cover every client). Refused
604
+ admin calls and refused plugin calls are rows too; anonymous 401s, reads and
605
+ preferences are not, and neither is a catalog or branding save that changes
606
+ nothing. A direct revoke whose access continues through a group names the
607
+ group(s) on its row. Name lists on a row (`affected`, `unchanged`) stop at 50
608
+ entries with the full count kept — the per-user rows carry every person;
609
+ reasons are cut at 300 characters and notes at 500. `GET /admin/access-report`
610
+ exports the current state the log explains: one CSV row per person and target
611
+ they hold.
612
+
613
+ ## Public API
614
+
615
+ Everything a consuming CDK app needs is exported from the package root. Deep
616
+ imports into `dist/` are not part of the contract.
617
+
618
+ | Export | Kind | Use |
619
+ | --- | --- | --- |
620
+ | `ProjectConfig`, `SiteConfig` | types | Your config file |
621
+ | `addAccessPortal(scope, props)` | function | The hub stacks, written into your app |
622
+ | `AccessPortalHub.fromAttributes(attrs)` | class | The hub as cross-account stacks see it: `issuerUrl`, `controlUrl(site)`, `connectorKeyMinter(scope, site)`, `aclReconcilerPrincipal()`, `aclReconcilerRelayPrincipal()` (what an SG-manager or resolver outside the hub's region trusts) |
623
+ | `resolveSites(network)` | function | Validated, deploy-ready sites for `addAccessPortal` and `ConnectorStack` |
624
+ | `TargetAccountStack` | stack | Trust plus roles in a workload account |
625
+ | `InfraClientRoles`, `TargetRoleSpec` | constants, type | `READ_ONLY`, `POWER_USER`, `FULL_ADMIN`; plain data you can spread and tweak |
626
+ | `createIssuerProvider`, `webIdentityPrincipal` | functions | Hand-built roles trusting the issuer |
627
+ | `ConnectorStack` | stack | One VPC joined to the VPN (`name` tells an account's second VPC from its first) |
628
+ | `TailnetConnector`, `SgManager`, `TailnetResolver` | constructs | The connector pieces for a stack you already own |
629
+ | `DataStack`, `CredsStack`, `WebStack`, `WebCertStack`, `NetworkStack` | stacks | The hub stacks individually, if you need to reach into one |
630
+ | `WebAcl`, `WafConfig`, `WafLimits` | construct, types | The WAF pieces |
631
+ | `DEFAULT_RESOURCE_PREFIX`, `assertValidResourcePrefix`, the `*FnName` and `*RoleName` helpers | constants, functions | The raw by-name contracts, for consumers who need the names |
632
+
633
+ Opinionated only where the security model requires it: the trust conditions
634
+ (`aud` plus a role-scoped `sub` pin), role name equals the pinned name, the
635
+ `connector-<account>[-<name>]` hostname contract, and the well-known resource names.
636
+ Everything else is ordinary CDK. `TargetRoleSpec.maxSessionDuration` defaults
637
+ to 12 hours; the per-role session length an admin sets in the portal is the
638
+ effective limit.
639
+
640
+ ## Plugins
641
+
642
+ Customer plugins are small apps a deployment bolts onto the portal: a
643
+ frontend of any framework shown in an iframe, Lambda routes behind the
644
+ portal's authorizer, and two permission levels (`user`, `admin`) granted from
645
+ the usual Users and Groups screens. The permission rules are in
646
+ [Plugin permissions](#plugin-permissions); this section is the deploy side.
647
+
648
+ **Trust model, before turning it on.** A plugin page is served from the
649
+ portal's own origin and framed without a sandbox (the design the epic
650
+ chose so the page can use the portal's session directly). That means an
651
+ installed plugin runs with the signed-in user's full authority: it could
652
+ read the portal's tokens, call any core API as that user, and on the
653
+ desktop reach the shell bridge. The `user`/`admin` permissions decide who
654
+ sees a plugin, not what its code may do. Install plugins you would trust
655
+ with the portal bundle itself, and review their dependencies the same way.
656
+ A Content-Security-Policy on `/plugin-assets/*` lets a plugin page load
657
+ from and talk to the portal only (no third-party scripts, no sending data
658
+ elsewhere); the app pages send their own enforced policy (the portal, the
659
+ region's Cognito API and the hosted-UI domain).
660
+
661
+ **Turn the feature on** with a `plugins` block in the config:
662
+
663
+ ```ts
664
+ plugins: { enabled: true }, // discoveryRefreshSeconds: 60 by default (15–300)
665
+ accountDimensions: { enabled: true }, // tenant/project/stage off account names; labels + stage map optional (wiki: Configuration Reference)
666
+ ```
667
+
668
+ `enabled: true` creates the `/api/plugins/…` route tree on the core API (the
669
+ core keeps every other `/api/*` path), the `/plugin-assets/*` CloudFront
670
+ behavior (same-origin framing allowed, no SPA rewrite), the discovery
671
+ settings the portal reads, and, per registered plugin, the asset upload and
672
+ the catalog record. Off or absent: none of that exists, and any plugin
673
+ permission rows stay dormant. The catalog table itself always exists, so
674
+ flipping the flag never adds or removes a cross-stack export. Registrations
675
+ passed while the flag is off fail at synth.
676
+
677
+ **Register a plugin** by passing `definePlugin(...)` results (from
678
+ `@fntio/infra-client-plugin-cdk`) to `addAccessPortal`:
679
+
680
+ ```ts
681
+ addAccessPortal(app, { project, resourcePrefix, plugins: [parameters] });
682
+ ```
683
+
684
+ Composing the stacks yourself? `resolvePlugins`, `PluginApi` and `PluginCatalogActivation` are exported; all
685
+ three live on the CredsStack side.
686
+
687
+ **What a deploy does, in order.** Handler factories run inside CredsStack and
688
+ each route becomes a gateway method under
689
+ `/api/plugins/<id>/accounts/{accountNumber}<path>`; the plugin's resource
690
+ carries the shared REQUEST authorizer as its default, so every method under it
691
+ is authorized by construction (result cache 0). The UI uploads to the plugin-assets bucket
692
+ (DataStack) under `<id>/<version>-<hash>/`, served as `/plugin-assets/…`; the
693
+ hash is the content hash, so changed bytes under the same version get a new
694
+ URL, and earlier revisions are never pruned. Last, a
695
+ `Custom::PluginCatalogRecord` in CredsStack writes the catalog row, after the
696
+ upload, the API stage and the plugin's methods. Because it depends on the
697
+ methods, CloudFormation also tombstones it *before* removing them. Rollback of
698
+ a failed activation restores the previous record through the same provider.
699
+
700
+ One routing fact to know. Express owns `/api/plugins` (every verb) and any
701
+ path under it that no registered method claims — an unknown plugin id, and an
702
+ unmatched path under a registered one, both reach the core app and get its
703
+ JSON 404. A plugin's handler is reachable only through a method it registered,
704
+ which is what stops an unknown route touching plugin code.
705
+
706
+ **Authorization.** The shared REQUEST authorizer
707
+ (`lambdacode/plugins/authorizer.ts`) runs on every plugin method with a zero
708
+ result cache. It verifies the bearer token with the verifier Express uses
709
+ (`services/tokenVerifier.ts`: a Cognito ID token for people; an access token
710
+ with the service scope plus a live registry row for service users, read
711
+ strongly consistently through `services/serviceUserRegistry.ts`), resolves the route
712
+ from the catalog by method and gateway resource template, takes the account
713
+ from the `{accountNumber}` path parameter, and asks `checkPluginPermission`.
714
+ Nothing the client names is trusted. Missing or invalid credentials: 401.
715
+ Authenticated but no available grant, an unknown route or method, a
716
+ malformed account or resource, a disabled or removed plugin: 403 (a `Deny`
717
+ on the invoked method ARN; `context.reason` says why). Signing keys or a
718
+ table unreachable: the gateway's 5xx. None of the three invokes the handler.
719
+ An allow is scoped to the exact method ARN and carries the typed context
720
+ (`PluginAuthorizerContextV1`: plugin, revision, route, account, required
721
+ permission, subject, principal type, correlation id), never a token. Every
722
+ decision is one JSON line in the authorizer's log group. Revocation limits:
723
+ a check that begins after a revoke completed sees it; a request already
724
+ authorized finishes; an accepted job runs until the plugin's own cancellation
725
+ rules stop it; there is no atomic snapshot across unrelated concurrent grant
726
+ edits.
727
+
728
+ Two more limits worth knowing. A deploy that adds a route makes the gateway
729
+ method live before the catalog record naming it: calls to the new route answer
730
+ 403 `route-unknown` until the activation resource completes, which is why the
731
+ UI that uses a new route ships in the same deploy rather than ahead of it. And
732
+ the authorizer only reads, so a service user that calls nothing but plugin
733
+ routes never advances its `lastUsedAt`; the access reviews see it as unused
734
+ even while it works.
735
+
736
+ **Update, disable, remove, reinstall.** Changing the definition rewrites the
737
+ record with a new revision. `enabled: false` on a plugin keeps everything but
738
+ suppresses discovery and denies calls. Removing the registration tombstones
739
+ the record (labels kept, grant rows kept, holders noticed), then the routes
740
+ and assets go. Registering the same id again restores still-valid grants on
741
+ purpose. Records are owned by the CloudFormation stack that wrote them; a
742
+ different stack claiming an installed id fails the deploy with "already
743
+ installed by …" — if that is you after moving the activation to another stack,
744
+ delete the row from the catalog table by hand (`aws dynamodb delete-item`) and
745
+ redeploy. To switch the whole feature off, remove the registrations first (one
746
+ deploy), then set `enabled: false`; the table and bucket stay, with their
747
+ exports, so that second deploy cannot fail on an export in use.
748
+
749
+ **Handlers and IAM.** Plugin Lambdas live in the hub account and region and
750
+ run under the execution role you give them; core grants decide who may call
751
+ a route, your IAM decides what the handler may touch. Every Lambda that reads
752
+ the catalog also gets the Accounts table name and read access (the API
753
+ handler, the reapproval sweeper, the catalog provider) — `pluginRuntimeEnv`
754
+ and `grantPluginRuntimeRead` are exported for custom compositions.
755
+
756
+ **Packaging.** The compiled stacks import `@fntio/infra-client-plugin-sdk`,
757
+ which ships inside this package's tarball (bundled dependency), so a vendored
758
+ tarball install keeps working with no second package to fetch. A
759
+ plugin author's own code imports the SDK directly, so they install the plugin
760
+ tarballs too: every GitHub Release from v0.1.18 carries them beside this one.
761
+
762
+ ### Troubleshooting
763
+
764
+ Five failures seen so far, each with its cause and the fix.
765
+
766
+ - **A route answers 403 with `context.reason` `route-unknown` while a deploy
767
+ runs.** The gateway method goes live before the catalog record that names
768
+ it (the activation resource depends on the methods, so it is written last).
769
+ Wait for the deploy to finish; ship the UI that calls a new route in the
770
+ same deploy as the route, never ahead of it.
771
+ - **Plugin assets answer 403.** `/plugin-assets/*` is CloudFront over the
772
+ private assets bucket with a GetObject-only policy and no SPA rewrite, so a
773
+ key that does not exist answers 403 — a real error, never `index.html`. The
774
+ object key must equal the URL path: the usual cause is a plugin registered
775
+ with its frontend not built (an empty or stale `ui.assets` directory) or an
776
+ `entry` that names a file outside it. Build the frontend before synth and
777
+ redeploy.
778
+ - **"This plugin was built for a different version of the portal."** The
779
+ frame speaks another message protocol version than the installed portal
780
+ (0.1.x pages against a 0.2.0 portal, or the reverse). Rebuild the plugin
781
+ against the plugin packages of the installed `@fntio/infra-client` version
782
+ and redeploy; see the SDK README's Versioning section.
783
+ - **"Its page loaded but never connected to the portal"** (the handshake
784
+ timeout). The page never posted `ready`: the `entry` path names the wrong
785
+ file, or the plugin-assets Content-Security-Policy blocked a script the
786
+ page needs — that policy allows the portal only, so a bundle that loads
787
+ anything from a third-party host never runs. Open the frame URL in a tab
788
+ and read the console for CSP violations; bundle every dependency.
789
+ - **Token refresh fails inside a frame.** The host owns the session; the
790
+ SDK never signs in itself. After an authentication-layer 401 it asks the
791
+ host to renew and retries exactly once; if that fails, the plugin surfaces
792
+ the error and the portal's own session-end flow applies (`sessionEnded`
793
+ with reason `expired` at the 12 h wall). A plugin Lambda that answers 401
794
+ for a business failure triggers the same retry, so answer domain 4xx codes
795
+ instead.
796
+
797
+ ## Plugin permissions
798
+
799
+ Customer plugins (Epic 5) hold their grants in the same Access table as roles,
800
+ as `plugin#<pluginId>#<accountNumber>#<user|admin>` rows on users and groups.
801
+ What such a row *means* is decided in one place, `lambdacode/api/services/pluginAccess.ts`:
802
+
803
+ - **Availability.** A row authorizes only while the plugin's catalog record is
804
+ installed and enabled, the permission is declared by the plugin, and the
805
+ account is both bound by the plugin and registered in the Accounts catalog.
806
+ A row that fails any of these is *dormant*: visible and revocable in the
807
+ grant editor, never authorizing, never renewable.
808
+ - **Implication.** `admin` includes `user` only when the plugin declares
809
+ `user`. It is applied when capabilities are derived, never stored, so an
810
+ admin grant is stored as admin and a user capability may cite it.
811
+ - **No bypass.** App admins and service users are ordinary principals here;
812
+ a service user's grants live on its own `user#<clientId>` rows.
813
+ - **Notices.** Loss notices for plugins diff *available capabilities*, not
814
+ rows: revoking a user row while an admin row still implies it is silent;
815
+ a plugin going dormant is a `PLUGIN` revocation (`via: CASCADE`).
816
+ - **Retention.** Removing or disabling a plugin keeps its rows so that
817
+ re-enabling or reinstalling the same id deliberately restores still-valid
818
+ access; deleting an account removes that account's plugin rows (with
819
+ notices) like the role cascade does. The yearly review sweep raises
820
+ reviews only for available rows, but a review already open on a row that
821
+ went dormant still lapses, and approving a review of a dormant row is
822
+ refused (409).
823
+ - **Reads on the authorization path** are strongly consistent (catalog,
824
+ accounts, access), with unprocessed batch keys retried a bounded number of
825
+ times and never read as "no grant".
826
+
827
+ **Two discovery views, on purpose.** `GET /api/plugins` answers the signed-in
828
+ caller: only plugins where they hold an available capability, only the UI
829
+ entries whose own permission is available somewhere, and account names from the
830
+ Accounts catalog, so someone holding nothing but a plugin grant still sees the
831
+ account. It is per-caller and never cached. `GET /api/admin/plugins` answers the
832
+ grant editor: every definition, including disabled, unavailable and tombstoned
833
+ ones, independent of the admin's own plugin grants, so a binding nobody holds
834
+ yet is still assignable. Neither returns handler internals, and an empty list
835
+ always means empty — a storage failure is an error, never a fabricated empty
836
+ catalog.
837
+
838
+ **Assignment and review operations.** Admins assign and revoke on
839
+ `/api/admin/plugins/{pluginId}/accounts/{accountNumber}/grants`: `PUT` with a
840
+ principal (`{kind:"user",userId}` or `{kind:"group",groupId}`), a permission and
841
+ an optional `durationHours` for users; `DELETE` with the principal and
842
+ permission. Both are idempotent. Assignment refuses an unavailable binding (409),
843
+ an unknown plugin or unbound account (404), and an undeclared permission or a
844
+ group expiry (400). Revocation is unconditional on purpose, so a stale row on a
845
+ disabled or removed plugin stays removable. A user's plugin access has its own
846
+ view, `GET /api/admin/users/{userId}/plugin-grants`, alongside the resource-grants
847
+ one; a group carries its plugin references in the groups list. Either way one call
848
+ covers every plugin, so no page sweeps per-plugin endpoints, and a plugin problem
849
+ never takes a user's role grants down with it. Plugin rows join the
850
+ existing yearly review lifecycle: reviews are raised only for available rows,
851
+ approving a review of a dormant row is refused (409), and losing a capability
852
+ produces the usual revocation notice.
853
+
854
+ The catalog is deployment-written; how it gets there is [Plugins](#plugins).
855
+
856
+ ## Bring your own web build
857
+
858
+ `addAccessPortal` accepts `webAssetPath`, a directory with an `index.html`,
859
+ to serve a web bundle other than the one baked into the package. The deploy
860
+ still generates `config.json` from your config, so the bundle must be a build
861
+ of this product's frontend, not an arbitrary site.
862
+
863
+ ## HTTP API
864
+
865
+ `openapi.yaml` in the package root describes every route of the portal API
866
+ (OpenAPI 3.1): the two token kinds (a Cognito ID token for people, a
867
+ `client_credentials` access token for service users, who are admins),
868
+ request and response shapes, and status codes. The route inventory is
869
+ drift-tested against the mounted routes in the package's test suite; the
870
+ shapes are maintained by hand alongside the code. Requests go to
871
+ `https://<web domain>/api/…`.
872
+
873
+ ## License
874
+
875
+ Elastic License 2.0. Commercial use is allowed; offering the product to
876
+ third parties as a managed or hosted service is not.