gina 0.6.2 → 0.6.3

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 (570) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +41 -12
  3. package/ROADMAP.md +3 -2
  4. package/bin/cli +19 -2
  5. package/framework/v0.6.3/VERSION +1 -0
  6. package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +6 -0
  7. package/framework/v0.6.3/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  8. package/framework/v0.6.3/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  9. package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/inspector/index.html +1 -0
  10. package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +50 -1
  11. package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +457 -57
  12. package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/js/gina.js +1457 -58
  13. package/framework/v0.6.3/core/asset/plugin/dist/vendor/gina/js/gina.min.js +625 -0
  14. package/framework/v0.6.3/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  15. package/framework/v0.6.3/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  16. package/framework/{v0.6.2 → v0.6.3}/core/connectors/couchbase/index.js +114 -0
  17. package/framework/{v0.6.2 → v0.6.3}/core/connectors/couchbase/lib/connector.js +14 -3
  18. package/framework/{v0.6.2 → v0.6.3}/core/connectors/couchbase/lib/session-store.js +14 -3
  19. package/framework/{v0.6.2 → v0.6.3}/core/connectors/couchbase/lib/session-store.v3.js +29 -2
  20. package/framework/{v0.6.2 → v0.6.3}/core/connectors/couchbase/lib/session-store.v4.js +29 -2
  21. package/framework/{v0.6.2 → v0.6.3}/core/connectors/mongodb/lib/session-store.js +24 -2
  22. package/framework/{v0.6.2 → v0.6.3}/core/connectors/redis/lib/session-store.js +33 -9
  23. package/framework/{v0.6.2 → v0.6.3}/core/connectors/scylladb/lib/session-store.js +25 -2
  24. package/framework/{v0.6.2 → v0.6.3}/core/connectors/sqlite/lib/session-store.js +26 -2
  25. package/framework/{v0.6.2 → v0.6.3}/core/controller/controller.js +201 -21
  26. package/framework/{v0.6.2 → v0.6.3}/core/controller/controller.render-nunjucks.js +8 -0
  27. package/framework/{v0.6.2 → v0.6.3}/core/controller/controller.render-swig.js +85 -4
  28. package/framework/{v0.6.2 → v0.6.3}/core/gna.js +23 -1
  29. package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/csrf/src/main.js +9 -5
  30. package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/hide-powered-by/README.md +20 -0
  31. package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/validator/src/form-validator.js +119 -43
  32. package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/validator/src/main.js +451 -9
  33. package/framework/{v0.6.2 → v0.6.3}/core/server.isaac.js +50 -54
  34. package/framework/{v0.6.2 → v0.6.3}/core/server.js +240 -3
  35. package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle/index.js +6 -4
  36. package/framework/{v0.6.2 → v0.6.3}/core/template/conf/settings.json +10 -0
  37. package/framework/{v0.6.2 → v0.6.3}/lib/cache/README.md +9 -1
  38. package/framework/{v0.6.2 → v0.6.3}/lib/cmd/audit/verify.js +11 -9
  39. package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/mcp-start.js +21 -12
  40. package/framework/{v0.6.2 → v0.6.3}/lib/cmd/connector/help.txt +1 -1
  41. package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/init.js +13 -1
  42. package/framework/{v0.6.2 → v0.6.3}/lib/dto/src/main.js +18 -11
  43. package/framework/{v0.6.2 → v0.6.3}/lib/logger/src/containers/file/index.js +29 -1
  44. package/framework/{v0.6.2 → v0.6.3}/lib/logger/src/containers/mq/speaker.js +30 -1
  45. package/framework/{v0.6.2 → v0.6.3}/lib/math/index.js +57 -6
  46. package/framework/{v0.6.2 → v0.6.3}/lib/merge/src/main.js +34 -5
  47. package/framework/{v0.6.2 → v0.6.3}/lib/render-cache/src/main.js +77 -4
  48. package/framework/{v0.6.2 → v0.6.3}/lib/routing/src/main.js +13 -1
  49. package/framework/{v0.6.2 → v0.6.3}/lib/routing-introspect/src/main.js +64 -2
  50. package/framework/v0.6.3/lib/secrets/src/backends/env.js +75 -0
  51. package/framework/{v0.6.2 → v0.6.3}/package.json +1 -1
  52. package/gna.js +5 -4
  53. package/llms.txt +19 -17
  54. package/package.json +5 -4
  55. package/schema/connectors.json +2 -2
  56. package/schema/routing.json +5 -0
  57. package/schema/settings.json +6 -1
  58. package/script/generate_gna_types.js +1 -1
  59. package/script/soak/couchbase-soak.js +1316 -0
  60. package/types/globals.d.ts +2 -0
  61. package/types/gna.d.ts +5 -0
  62. package/types/index.d.ts +1 -0
  63. package/utils/helper.js +38 -7
  64. package/framework/v0.6.2/VERSION +0 -1
  65. package/framework/v0.6.2/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  66. package/framework/v0.6.2/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  67. package/framework/v0.6.2/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -603
  68. package/framework/v0.6.2/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  69. package/framework/v0.6.2/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  70. package/framework/v0.6.2/lib/secrets/src/backends/env.js +0 -60
  71. /package/framework/{v0.6.2 → v0.6.3}/AUTHORS +0 -0
  72. /package/framework/{v0.6.2 → v0.6.3}/LICENSE +0 -0
  73. /package/framework/{v0.6.2 → v0.6.3}/core/asset/html/nolayout.html +0 -0
  74. /package/framework/{v0.6.2 → v0.6.3}/core/asset/html/static.html +0 -0
  75. /package/framework/{v0.6.2 → v0.6.3}/core/asset/img/android-chrome-192x192.png +0 -0
  76. /package/framework/{v0.6.2 → v0.6.3}/core/asset/img/android-chrome-512x512.png +0 -0
  77. /package/framework/{v0.6.2 → v0.6.3}/core/asset/img/apple-touch-icon.png +0 -0
  78. /package/framework/{v0.6.2 → v0.6.3}/core/asset/img/favicon-16x16.png +0 -0
  79. /package/framework/{v0.6.2 → v0.6.3}/core/asset/img/favicon-32x32.png +0 -0
  80. /package/framework/{v0.6.2 → v0.6.3}/core/asset/img/favicon.ico +0 -0
  81. /package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/README.md +0 -0
  82. /package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  83. /package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  84. /package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  85. /package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  86. /package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  87. /package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  88. /package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  89. /package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  90. /package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  91. /package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  92. /package/framework/{v0.6.2 → v0.6.3}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  93. /package/framework/{v0.6.2 → v0.6.3}/core/config.js +0 -0
  94. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/ai/index.js +0 -0
  95. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/ai/lib/connector.js +0 -0
  96. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  97. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  98. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/couchbase/lib/n1ql.js +0 -0
  99. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/duckdb/index.js +0 -0
  100. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/duckdb/lib/connector.js +0 -0
  101. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/mongodb/index.js +0 -0
  102. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/mongodb/lib/connector.js +0 -0
  103. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/mongodb/lib/job-store.js +0 -0
  104. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
  105. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/mysql/index.js +0 -0
  106. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/mysql/lib/connector.js +0 -0
  107. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/postgresql/index.js +0 -0
  108. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/postgresql/lib/connector.js +0 -0
  109. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/redis/index.js +0 -0
  110. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/redis/lib/connector.js +0 -0
  111. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/redis/lib/job-store.js +0 -0
  112. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/redis/lib/render-cache-store.js +0 -0
  113. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/scylladb/index.js +0 -0
  114. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/scylladb/lib/connector.js +0 -0
  115. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/sql-parser.js +0 -0
  116. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/sqlite/index.js +0 -0
  117. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/sqlite/lib/connector.js +0 -0
  118. /package/framework/{v0.6.2 → v0.6.3}/core/connectors/sqlite/lib/job-store.js +0 -0
  119. /package/framework/{v0.6.2 → v0.6.3}/core/content.encoding +0 -0
  120. /package/framework/{v0.6.2 → v0.6.3}/core/controller/controller.framework.js +0 -0
  121. /package/framework/{v0.6.2 → v0.6.3}/core/controller/controller.render-json.js +0 -0
  122. /package/framework/{v0.6.2 → v0.6.3}/core/controller/controller.render-nunjucks-async.js +0 -0
  123. /package/framework/{v0.6.2 → v0.6.3}/core/controller/controller.render-stream.js +0 -0
  124. /package/framework/{v0.6.2 → v0.6.3}/core/controller/controller.render-swig-async.js +0 -0
  125. /package/framework/{v0.6.2 → v0.6.3}/core/controller/controller.render-v1.js +0 -0
  126. /package/framework/{v0.6.2 → v0.6.3}/core/controller/index.js +0 -0
  127. /package/framework/{v0.6.2 → v0.6.3}/core/controller/inspector-window-emit.js +0 -0
  128. /package/framework/{v0.6.2 → v0.6.3}/core/controller/release-banner.js +0 -0
  129. /package/framework/{v0.6.2 → v0.6.3}/core/dev/index.js +0 -0
  130. /package/framework/{v0.6.2 → v0.6.3}/core/dev/lib/class.js +0 -0
  131. /package/framework/{v0.6.2 → v0.6.3}/core/dev/lib/factory.js +0 -0
  132. /package/framework/{v0.6.2 → v0.6.3}/core/dev/lib/tools.js +0 -0
  133. /package/framework/{v0.6.2 → v0.6.3}/core/locales/README.md +0 -0
  134. /package/framework/{v0.6.2 → v0.6.3}/core/locales/currency.json +0 -0
  135. /package/framework/{v0.6.2 → v0.6.3}/core/locales/dist/language/en.json +0 -0
  136. /package/framework/{v0.6.2 → v0.6.3}/core/locales/dist/language/fr.json +0 -0
  137. /package/framework/{v0.6.2 → v0.6.3}/core/locales/dist/region/en.json +0 -0
  138. /package/framework/{v0.6.2 → v0.6.3}/core/locales/dist/region/fr.json +0 -0
  139. /package/framework/{v0.6.2 → v0.6.3}/core/locales/index.js +0 -0
  140. /package/framework/{v0.6.2 → v0.6.3}/core/mime.types +0 -0
  141. /package/framework/{v0.6.2 → v0.6.3}/core/model/entity.js +0 -0
  142. /package/framework/{v0.6.2 → v0.6.3}/core/model/index.js +0 -0
  143. /package/framework/{v0.6.2 → v0.6.3}/core/model/template/entityFactory.js +0 -0
  144. /package/framework/{v0.6.2 → v0.6.3}/core/model/template/index.js +0 -0
  145. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/README.md +0 -0
  146. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/index.js +0 -0
  147. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/csrf/README.md +0 -0
  148. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/csrf/package.json +0 -0
  149. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/README.md +0 -0
  150. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/coep/README.md +0 -0
  151. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/coep/package.json +0 -0
  152. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
  153. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/coop/README.md +0 -0
  154. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/coop/package.json +0 -0
  155. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
  156. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/corp/README.md +0 -0
  157. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/corp/package.json +0 -0
  158. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
  159. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/csp/README.md +0 -0
  160. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/csp/package.json +0 -0
  161. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
  162. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
  163. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
  164. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/hsts/README.md +0 -0
  165. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/hsts/package.json +0 -0
  166. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
  167. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
  168. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
  169. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
  170. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/package.json +0 -0
  171. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
  172. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
  173. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
  174. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/src/main.js +0 -0
  175. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
  176. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
  177. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
  178. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
  179. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
  180. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
  181. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
  182. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
  183. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
  184. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
  185. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
  186. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
  187. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
  188. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
  189. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
  190. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
  191. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
  192. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
  193. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/session/README.md +0 -0
  194. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/session/package.json +0 -0
  195. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/session/src/main.js +0 -0
  196. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/storage/README.md +0 -0
  197. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/storage/build.json +0 -0
  198. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/storage/package.json +0 -0
  199. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/storage/src/main.js +0 -0
  200. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/validator/README.md +0 -0
  201. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/validator/build.json +0 -0
  202. /package/framework/{v0.6.2 → v0.6.3}/core/plugins/lib/validator/package.json +0 -0
  203. /package/framework/{v0.6.2 → v0.6.3}/core/router.js +0 -0
  204. /package/framework/{v0.6.2 → v0.6.3}/core/server.express.js +0 -0
  205. /package/framework/{v0.6.2 → v0.6.3}/core/status.codes +0 -0
  206. /package/framework/{v0.6.2 → v0.6.3}/core/template/_gitignore +0 -0
  207. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle/config/app.json +0 -0
  208. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  209. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle/config/routing.json +0 -0
  210. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle/config/settings.json +0 -0
  211. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  212. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle/config/templates.json +0 -0
  213. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  214. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  215. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  216. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  217. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle/locales/en.json +0 -0
  218. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  219. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  220. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  221. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  222. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  223. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
  224. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  225. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
  226. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_public/readme.md +0 -0
  227. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_public/sw.js +0 -0
  228. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  229. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  230. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  231. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  232. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
  233. /package/framework/{v0.6.2 → v0.6.3}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  234. /package/framework/{v0.6.2 → v0.6.3}/core/template/command/gina.bat.tpl +0 -0
  235. /package/framework/{v0.6.2 → v0.6.3}/core/template/command/gina.tpl +0 -0
  236. /package/framework/{v0.6.2 → v0.6.3}/core/template/conf/env.json +0 -0
  237. /package/framework/{v0.6.2 → v0.6.3}/core/template/conf/manifest.json +0 -0
  238. /package/framework/{v0.6.2 → v0.6.3}/core/template/conf/package.json +0 -0
  239. /package/framework/{v0.6.2 → v0.6.3}/core/template/conf/statics.json +0 -0
  240. /package/framework/{v0.6.2 → v0.6.3}/core/template/conf/templates.json +0 -0
  241. /package/framework/{v0.6.2 → v0.6.3}/core/template/error/client/json/401.json +0 -0
  242. /package/framework/{v0.6.2 → v0.6.3}/core/template/error/client/json/403.json +0 -0
  243. /package/framework/{v0.6.2 → v0.6.3}/core/template/error/client/json/404.json +0 -0
  244. /package/framework/{v0.6.2 → v0.6.3}/core/template/error/server/html/50x.html +0 -0
  245. /package/framework/{v0.6.2 → v0.6.3}/core/template/error/server/json/500.json +0 -0
  246. /package/framework/{v0.6.2 → v0.6.3}/core/template/error/server/json/503.json +0 -0
  247. /package/framework/{v0.6.2 → v0.6.3}/core/template/extensions/logger/config.json +0 -0
  248. /package/framework/{v0.6.2 → v0.6.3}/helpers/console.js +0 -0
  249. /package/framework/{v0.6.2 → v0.6.3}/helpers/context.js +0 -0
  250. /package/framework/{v0.6.2 → v0.6.3}/helpers/data/LICENSE +0 -0
  251. /package/framework/{v0.6.2 → v0.6.3}/helpers/data/README.md +0 -0
  252. /package/framework/{v0.6.2 → v0.6.3}/helpers/data/package.json +0 -0
  253. /package/framework/{v0.6.2 → v0.6.3}/helpers/data/src/main.js +0 -0
  254. /package/framework/{v0.6.2 → v0.6.3}/helpers/dateFormat.js +0 -0
  255. /package/framework/{v0.6.2 → v0.6.3}/helpers/index.js +0 -0
  256. /package/framework/{v0.6.2 → v0.6.3}/helpers/json/LICENSE +0 -0
  257. /package/framework/{v0.6.2 → v0.6.3}/helpers/json/README.md +0 -0
  258. /package/framework/{v0.6.2 → v0.6.3}/helpers/json/package.json +0 -0
  259. /package/framework/{v0.6.2 → v0.6.3}/helpers/json/src/main.js +0 -0
  260. /package/framework/{v0.6.2 → v0.6.3}/helpers/path.js +0 -0
  261. /package/framework/{v0.6.2 → v0.6.3}/helpers/plugins/README.md +0 -0
  262. /package/framework/{v0.6.2 → v0.6.3}/helpers/plugins/package.json +0 -0
  263. /package/framework/{v0.6.2 → v0.6.3}/helpers/plugins/src/api-error.js +0 -0
  264. /package/framework/{v0.6.2 → v0.6.3}/helpers/plugins/src/main.js +0 -0
  265. /package/framework/{v0.6.2 → v0.6.3}/helpers/prototypes.js +0 -0
  266. /package/framework/{v0.6.2 → v0.6.3}/helpers/task.js +0 -0
  267. /package/framework/{v0.6.2 → v0.6.3}/helpers/text.js +0 -0
  268. /package/framework/{v0.6.2 → v0.6.3}/lib/admin/package.json +0 -0
  269. /package/framework/{v0.6.2 → v0.6.3}/lib/admin/src/main.js +0 -0
  270. /package/framework/{v0.6.2 → v0.6.3}/lib/archiver/README.md +0 -0
  271. /package/framework/{v0.6.2 → v0.6.3}/lib/archiver/build.json +0 -0
  272. /package/framework/{v0.6.2 → v0.6.3}/lib/archiver/package.json +0 -0
  273. /package/framework/{v0.6.2 → v0.6.3}/lib/archiver/src/dep/jszip.min.js +0 -0
  274. /package/framework/{v0.6.2 → v0.6.3}/lib/archiver/src/main.js +0 -0
  275. /package/framework/{v0.6.2 → v0.6.3}/lib/async/package.json +0 -0
  276. /package/framework/{v0.6.2 → v0.6.3}/lib/async/src/main.js +0 -0
  277. /package/framework/{v0.6.2 → v0.6.3}/lib/audit/package.json +0 -0
  278. /package/framework/{v0.6.2 → v0.6.3}/lib/audit/src/main.js +0 -0
  279. /package/framework/{v0.6.2 → v0.6.3}/lib/audit-store.js +0 -0
  280. /package/framework/{v0.6.2 → v0.6.3}/lib/authn/package.json +0 -0
  281. /package/framework/{v0.6.2 → v0.6.3}/lib/authn/src/lockout.js +0 -0
  282. /package/framework/{v0.6.2 → v0.6.3}/lib/authn/src/main.js +0 -0
  283. /package/framework/{v0.6.2 → v0.6.3}/lib/authn/src/totp.js +0 -0
  284. /package/framework/{v0.6.2 → v0.6.3}/lib/authz-gate/package.json +0 -0
  285. /package/framework/{v0.6.2 → v0.6.3}/lib/authz-gate/src/main.js +0 -0
  286. /package/framework/{v0.6.2 → v0.6.3}/lib/cache/build.json +0 -0
  287. /package/framework/{v0.6.2 → v0.6.3}/lib/cache/package.json +0 -0
  288. /package/framework/{v0.6.2 → v0.6.3}/lib/cache/src/main.js +0 -0
  289. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/aliases.json +0 -0
  290. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/audit/arguments.json +0 -0
  291. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/audit/help.txt +0 -0
  292. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/add.js +0 -0
  293. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/arguments.json +0 -0
  294. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/build.js +0 -0
  295. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/copy.js +0 -0
  296. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/cp.js +0 -0
  297. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/help.js +0 -0
  298. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/help.txt +0 -0
  299. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
  300. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/list.js +0 -0
  301. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/man.js +0 -0
  302. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/mcp.js +0 -0
  303. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/oas.js +0 -0
  304. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/openapi.js +0 -0
  305. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/remove.js +0 -0
  306. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/rename.js +0 -0
  307. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/restart.js +0 -0
  308. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/rm.js +0 -0
  309. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/start.js +0 -0
  310. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/status.js +0 -0
  311. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/stop.js +0 -0
  312. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/bundle/types.js +0 -0
  313. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/cache/arguments.json +0 -0
  314. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/cache/clear.js +0 -0
  315. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/cache/help.txt +0 -0
  316. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/cache/stats.js +0 -0
  317. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/connector/add.js +0 -0
  318. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/connector/arguments.json +0 -0
  319. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/connector/help.js +0 -0
  320. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/connector/infer.js +0 -0
  321. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/connector/list.js +0 -0
  322. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/connector/migrate.js +0 -0
  323. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/connector/models.js +0 -0
  324. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/connector/remove.js +0 -0
  325. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/connector/rm.js +0 -0
  326. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/connector/test.js +0 -0
  327. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/container/arguments.json +0 -0
  328. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/container/help.js +0 -0
  329. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/container/help.txt +0 -0
  330. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/container/man.js +0 -0
  331. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/container/ps.js +0 -0
  332. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/container/stop.js +0 -0
  333. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/controller/add.js +0 -0
  334. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/controller/arguments.json +0 -0
  335. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/controller/help.txt +0 -0
  336. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/controller/inc/args.js +0 -0
  337. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/controller/inc/namespace.js +0 -0
  338. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
  339. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/controller/inc/reference-scan.js +0 -0
  340. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/controller/inc/scaffold.js +0 -0
  341. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/controller/remove.js +0 -0
  342. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/controller/rename.js +0 -0
  343. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/controller/rm.js +0 -0
  344. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/env/add.js +0 -0
  345. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/env/get.js +0 -0
  346. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/env/help.js +0 -0
  347. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/env/help.txt +0 -0
  348. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/env/link-dev.js +0 -0
  349. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/env/list.js +0 -0
  350. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/env/remove.js +0 -0
  351. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/env/rm.js +0 -0
  352. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/env/set.js +0 -0
  353. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/env/unset.js +0 -0
  354. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/env/use.js +0 -0
  355. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/add.js +0 -0
  356. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/arguments.json +0 -0
  357. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/build.js +0 -0
  358. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/dot.js +0 -0
  359. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/get.js +0 -0
  360. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/help.js +0 -0
  361. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/help.txt +0 -0
  362. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/link-node-modules.js +0 -0
  363. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/link.js +0 -0
  364. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/list.js +0 -0
  365. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/man.js +0 -0
  366. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/msg.json +0 -0
  367. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/open.js +0 -0
  368. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/remove.js +0 -0
  369. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/reset.js +0 -0
  370. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/restart.js +0 -0
  371. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/set.js +0 -0
  372. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/start.js +0 -0
  373. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/status.js +0 -0
  374. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/stop.js +0 -0
  375. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/tail.js +0 -0
  376. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/update.js +0 -0
  377. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/framework/version.js +0 -0
  378. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/gina-dev.1.md +0 -0
  379. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/gina-framework.1.md +0 -0
  380. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/gina.1.md +0 -0
  381. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/helper.js +0 -0
  382. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/i18n/add.js +0 -0
  383. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/i18n/arguments.json +0 -0
  384. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/i18n/export.js +0 -0
  385. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/i18n/help.js +0 -0
  386. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/i18n/help.txt +0 -0
  387. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/i18n/import.js +0 -0
  388. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/i18n/scan.js +0 -0
  389. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/image/_host.js +0 -0
  390. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/image/arguments.json +0 -0
  391. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/image/build.js +0 -0
  392. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/image/help.js +0 -0
  393. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/image/help.txt +0 -0
  394. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/image/list.js +0 -0
  395. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/image/man.js +0 -0
  396. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/image/rm.js +0 -0
  397. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/image/run.js +0 -0
  398. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/index.js +0 -0
  399. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/inspector/help.js +0 -0
  400. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/inspector/help.txt +0 -0
  401. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/inspector/open.js +0 -0
  402. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/man-render.js +0 -0
  403. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/minion/arguments.json +0 -0
  404. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/minion/help.js +0 -0
  405. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/minion/help.txt +0 -0
  406. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/minion/kill.js +0 -0
  407. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/minion/list.js +0 -0
  408. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/msg.json +0 -0
  409. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/port/help.js +0 -0
  410. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/port/help.txt +0 -0
  411. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/port/inc/scan.js +0 -0
  412. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/port/list.js +0 -0
  413. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/port/reset.js +0 -0
  414. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/port/set.js +0 -0
  415. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/add.js +0 -0
  416. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/arguments.json +0 -0
  417. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/backup.js +0 -0
  418. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/build.js +0 -0
  419. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/help.js +0 -0
  420. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/help.txt +0 -0
  421. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/import.js +0 -0
  422. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/list.js +0 -0
  423. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/man.js +0 -0
  424. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/move.js +0 -0
  425. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/remove.js +0 -0
  426. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/rename.js +0 -0
  427. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/restart.js +0 -0
  428. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/restore.js +0 -0
  429. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/rm.js +0 -0
  430. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/start.js +0 -0
  431. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/status.js +0 -0
  432. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/project/stop.js +0 -0
  433. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/protocol/arguments.json +0 -0
  434. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/protocol/help.js +0 -0
  435. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/protocol/help.txt +0 -0
  436. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/protocol/list.js +0 -0
  437. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/protocol/remove.js +0 -0
  438. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/protocol/set.js +0 -0
  439. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/scope/add.js +0 -0
  440. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/scope/help.js +0 -0
  441. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/scope/help.txt +0 -0
  442. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/scope/link-local.js +0 -0
  443. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/scope/link-production.js +0 -0
  444. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/scope/list.js +0 -0
  445. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/scope/remove.js +0 -0
  446. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/scope/rm.js +0 -0
  447. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/scope/use.js +0 -0
  448. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/secrets/arguments.json +0 -0
  449. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/secrets/check.js +0 -0
  450. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/secrets/help.js +0 -0
  451. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/secrets/help.txt +0 -0
  452. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/secrets/scan.js +0 -0
  453. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/service/help.js +0 -0
  454. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/service/help.txt +0 -0
  455. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/service/list.js +0 -0
  456. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/service/man.js +0 -0
  457. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/service/start.js +0 -0
  458. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd/view/add.js +0 -0
  459. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd-status-format/package.json +0 -0
  460. /package/framework/{v0.6.2 → v0.6.3}/lib/cmd-status-format/src/main.js +0 -0
  461. /package/framework/{v0.6.2 → v0.6.3}/lib/collection/README.md +0 -0
  462. /package/framework/{v0.6.2 → v0.6.3}/lib/collection/build.json +0 -0
  463. /package/framework/{v0.6.2 → v0.6.3}/lib/collection/package.json +0 -0
  464. /package/framework/{v0.6.2 → v0.6.3}/lib/collection/src/main.js +0 -0
  465. /package/framework/{v0.6.2 → v0.6.3}/lib/config.js +0 -0
  466. /package/framework/{v0.6.2 → v0.6.3}/lib/connector-config/package.json +0 -0
  467. /package/framework/{v0.6.2 → v0.6.3}/lib/connector-config/src/main.js +0 -0
  468. /package/framework/{v0.6.2 → v0.6.3}/lib/connector-error/package.json +0 -0
  469. /package/framework/{v0.6.2 → v0.6.3}/lib/connector-error/src/main.js +0 -0
  470. /package/framework/{v0.6.2 → v0.6.3}/lib/connector-registry/package.json +0 -0
  471. /package/framework/{v0.6.2 → v0.6.3}/lib/connector-registry/src/main.js +0 -0
  472. /package/framework/{v0.6.2 → v0.6.3}/lib/cron/README.md +0 -0
  473. /package/framework/{v0.6.2 → v0.6.3}/lib/cron/package.json +0 -0
  474. /package/framework/{v0.6.2 → v0.6.3}/lib/cron/src/main.js +0 -0
  475. /package/framework/{v0.6.2 → v0.6.3}/lib/domain/LICENSE +0 -0
  476. /package/framework/{v0.6.2 → v0.6.3}/lib/domain/README.md +0 -0
  477. /package/framework/{v0.6.2 → v0.6.3}/lib/domain/package.json +0 -0
  478. /package/framework/{v0.6.2 → v0.6.3}/lib/domain/src/main.js +0 -0
  479. /package/framework/{v0.6.2 → v0.6.3}/lib/dto/package.json +0 -0
  480. /package/framework/{v0.6.2 → v0.6.3}/lib/dto-pipe/package.json +0 -0
  481. /package/framework/{v0.6.2 → v0.6.3}/lib/dto-pipe/src/main.js +0 -0
  482. /package/framework/{v0.6.2 → v0.6.3}/lib/dto-types/package.json +0 -0
  483. /package/framework/{v0.6.2 → v0.6.3}/lib/dto-types/src/main.js +0 -0
  484. /package/framework/{v0.6.2 → v0.6.3}/lib/generator/index.js +0 -0
  485. /package/framework/{v0.6.2 → v0.6.3}/lib/i18n/package.json +0 -0
  486. /package/framework/{v0.6.2 → v0.6.3}/lib/i18n/src/main.js +0 -0
  487. /package/framework/{v0.6.2 → v0.6.3}/lib/image-build/package.json +0 -0
  488. /package/framework/{v0.6.2 → v0.6.3}/lib/image-build/src/main.js +0 -0
  489. /package/framework/{v0.6.2 → v0.6.3}/lib/index.js +0 -0
  490. /package/framework/{v0.6.2 → v0.6.3}/lib/inherits/LICENSE +0 -0
  491. /package/framework/{v0.6.2 → v0.6.3}/lib/inherits/README.md +0 -0
  492. /package/framework/{v0.6.2 → v0.6.3}/lib/inherits/package.json +0 -0
  493. /package/framework/{v0.6.2 → v0.6.3}/lib/inherits/src/main.js +0 -0
  494. /package/framework/{v0.6.2 → v0.6.3}/lib/inspector-events/package.json +0 -0
  495. /package/framework/{v0.6.2 → v0.6.3}/lib/inspector-events/src/main.js +0 -0
  496. /package/framework/{v0.6.2 → v0.6.3}/lib/inspector-redact/package.json +0 -0
  497. /package/framework/{v0.6.2 → v0.6.3}/lib/inspector-redact/src/main.js +0 -0
  498. /package/framework/{v0.6.2 → v0.6.3}/lib/instrument/package.json +0 -0
  499. /package/framework/{v0.6.2 → v0.6.3}/lib/instrument/src/main.js +0 -0
  500. /package/framework/{v0.6.2 → v0.6.3}/lib/job/package.json +0 -0
  501. /package/framework/{v0.6.2 → v0.6.3}/lib/job/src/main.js +0 -0
  502. /package/framework/{v0.6.2 → v0.6.3}/lib/job-store.js +0 -0
  503. /package/framework/{v0.6.2 → v0.6.3}/lib/json-config-header/package.json +0 -0
  504. /package/framework/{v0.6.2 → v0.6.3}/lib/json-config-header/src/main.js +0 -0
  505. /package/framework/{v0.6.2 → v0.6.3}/lib/logger/README.md +0 -0
  506. /package/framework/{v0.6.2 → v0.6.3}/lib/logger/package.json +0 -0
  507. /package/framework/{v0.6.2 → v0.6.3}/lib/logger/src/containers/default/index.js +0 -0
  508. /package/framework/{v0.6.2 → v0.6.3}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  509. /package/framework/{v0.6.2 → v0.6.3}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  510. /package/framework/{v0.6.2 → v0.6.3}/lib/logger/src/containers/mq/index.js +0 -0
  511. /package/framework/{v0.6.2 → v0.6.3}/lib/logger/src/containers/mq/listener.js +0 -0
  512. /package/framework/{v0.6.2 → v0.6.3}/lib/logger/src/helper.js +0 -0
  513. /package/framework/{v0.6.2 → v0.6.3}/lib/logger/src/main.js +0 -0
  514. /package/framework/{v0.6.2 → v0.6.3}/lib/mcp-dispatch/package.json +0 -0
  515. /package/framework/{v0.6.2 → v0.6.3}/lib/mcp-dispatch/src/main.js +0 -0
  516. /package/framework/{v0.6.2 → v0.6.3}/lib/mcp-http/package.json +0 -0
  517. /package/framework/{v0.6.2 → v0.6.3}/lib/mcp-http/src/main.js +0 -0
  518. /package/framework/{v0.6.2 → v0.6.3}/lib/mcp-server/package.json +0 -0
  519. /package/framework/{v0.6.2 → v0.6.3}/lib/mcp-server/src/main.js +0 -0
  520. /package/framework/{v0.6.2 → v0.6.3}/lib/merge/README.md +0 -0
  521. /package/framework/{v0.6.2 → v0.6.3}/lib/merge/package.json +0 -0
  522. /package/framework/{v0.6.2 → v0.6.3}/lib/metrics/package.json +0 -0
  523. /package/framework/{v0.6.2 → v0.6.3}/lib/metrics/src/main.js +0 -0
  524. /package/framework/{v0.6.2 → v0.6.3}/lib/model.js +0 -0
  525. /package/framework/{v0.6.2 → v0.6.3}/lib/net-locality/package.json +0 -0
  526. /package/framework/{v0.6.2 → v0.6.3}/lib/net-locality/src/main.js +0 -0
  527. /package/framework/{v0.6.2 → v0.6.3}/lib/nunjucks-filters/README.md +0 -0
  528. /package/framework/{v0.6.2 → v0.6.3}/lib/nunjucks-filters/package.json +0 -0
  529. /package/framework/{v0.6.2 → v0.6.3}/lib/nunjucks-filters/src/main.js +0 -0
  530. /package/framework/{v0.6.2 → v0.6.3}/lib/nunjucks-resolver/package.json +0 -0
  531. /package/framework/{v0.6.2 → v0.6.3}/lib/nunjucks-resolver/src/main.js +0 -0
  532. /package/framework/{v0.6.2 → v0.6.3}/lib/proc.js +0 -0
  533. /package/framework/{v0.6.2 → v0.6.3}/lib/release-watch/package.json +0 -0
  534. /package/framework/{v0.6.2 → v0.6.3}/lib/release-watch/src/main.js +0 -0
  535. /package/framework/{v0.6.2 → v0.6.3}/lib/render-cache/package.json +0 -0
  536. /package/framework/{v0.6.2 → v0.6.3}/lib/render-cache-store.js +0 -0
  537. /package/framework/{v0.6.2 → v0.6.3}/lib/routing/README.md +0 -0
  538. /package/framework/{v0.6.2 → v0.6.3}/lib/routing/build.json +0 -0
  539. /package/framework/{v0.6.2 → v0.6.3}/lib/routing/package.json +0 -0
  540. /package/framework/{v0.6.2 → v0.6.3}/lib/routing/src/radix.js +0 -0
  541. /package/framework/{v0.6.2 → v0.6.3}/lib/routing-introspect/package.json +0 -0
  542. /package/framework/{v0.6.2 → v0.6.3}/lib/secrets/package.json +0 -0
  543. /package/framework/{v0.6.2 → v0.6.3}/lib/secrets/src/main.js +0 -0
  544. /package/framework/{v0.6.2 → v0.6.3}/lib/session-store.js +0 -0
  545. /package/framework/{v0.6.2 → v0.6.3}/lib/shell.js +0 -0
  546. /package/framework/{v0.6.2 → v0.6.3}/lib/sqlite-driver.js +0 -0
  547. /package/framework/{v0.6.2 → v0.6.3}/lib/state.js +0 -0
  548. /package/framework/{v0.6.2 → v0.6.3}/lib/swig-filters/README.md +0 -0
  549. /package/framework/{v0.6.2 → v0.6.3}/lib/swig-filters/package.json +0 -0
  550. /package/framework/{v0.6.2 → v0.6.3}/lib/swig-filters/src/main.js +0 -0
  551. /package/framework/{v0.6.2 → v0.6.3}/lib/swig-resolver/package.json +0 -0
  552. /package/framework/{v0.6.2 → v0.6.3}/lib/swig-resolver/src/main.js +0 -0
  553. /package/framework/{v0.6.2 → v0.6.3}/lib/template-loaders/package.json +0 -0
  554. /package/framework/{v0.6.2 → v0.6.3}/lib/template-loaders/src/loaders/http.js +0 -0
  555. /package/framework/{v0.6.2 → v0.6.3}/lib/template-loaders/src/loaders/memory.js +0 -0
  556. /package/framework/{v0.6.2 → v0.6.3}/lib/template-loaders/src/main.js +0 -0
  557. /package/framework/{v0.6.2 → v0.6.3}/lib/url/README.md +0 -0
  558. /package/framework/{v0.6.2 → v0.6.3}/lib/url/index.js +0 -0
  559. /package/framework/{v0.6.2 → v0.6.3}/lib/url/routing.json +0 -0
  560. /package/framework/{v0.6.2 → v0.6.3}/lib/uuid/package.json +0 -0
  561. /package/framework/{v0.6.2 → v0.6.3}/lib/uuid/src/main.js +0 -0
  562. /package/framework/{v0.6.2 → v0.6.3}/lib/validator.js +0 -0
  563. /package/framework/{v0.6.2 → v0.6.3}/lib/watcher/package.json +0 -0
  564. /package/framework/{v0.6.2 → v0.6.3}/lib/watcher/src/main.js +0 -0
  565. /package/framework/{v0.6.2 → v0.6.3}/lib/ws-framing/package.json +0 -0
  566. /package/framework/{v0.6.2 → v0.6.3}/lib/ws-framing/src/main.js +0 -0
  567. /package/framework/{v0.6.2 → v0.6.3}/lib/ws-query/package.json +0 -0
  568. /package/framework/{v0.6.2 → v0.6.3}/lib/ws-query/src/main.js +0 -0
  569. /package/framework/{v0.6.2 → v0.6.3}/lib/ws-session/package.json +0 -0
  570. /package/framework/{v0.6.2 → v0.6.3}/lib/ws-session/src/main.js +0 -0
@@ -310,7 +310,8 @@ const slice = Array.prototype.slice;
310
310
  * @param {string} options.cachePath - Absolute path to the bundle cache directory
311
311
  * @param {boolean} options.isCacheless - True in dev mode; clears local cache on startup
312
312
  * @param {object} options.credentials - TLS credentials (privateKey, certificate, ca, passphrase)
313
- * @param {object} options.allRoutes - Full routing map (used for frontend routing cache)
313
+ * @param {object} options.allRoutes - Full routing map (no longer read here — the client maps arrive pre-built, see clientRoutingAssets)
314
+ * @param {{full: object, stripped: object}} options.clientRoutingAssets - Client-served routing maps built once by core/server.js `buildClientRoutingAssets` (#B212) — the full map and the #B66 host-stripped variant; isaac writes them to disk and serves the precompressed files as its fast-path
314
315
  * @param {string} options.preferedCompressionEncodingOrder - Ordered list of accepted encodings
315
316
  * @param {number} [options.keepAliveTimeout] - Server keep-alive timeout in ms
316
317
  * @param {number} [options.headersTimeout] - Server headers timeout in ms
@@ -360,56 +361,20 @@ function ServerEngineClass(options) {
360
361
  localCachePathObj.rmSync();
361
362
  }
362
363
  // For frontend template routing if needed
363
- // TODO - Used `options.routing` instead after having filtered `options.allRoutes` vs `options.formsRules` to use only external routes exposed by `"query"` validation
364
- // replaced: delete operator + for...in — destructuring rest builds clean objects (#P21, #P22)
365
- var _routing = JSON.clone(options.allRoutes);
366
- // var _routing = JSON.clone(options.routing);
367
- var _routingKeys = Object.keys(_routing);
368
- for (var ri = 0; ri < _routingKeys.length; ++ri) {
369
- const { _comment, middleware, ...clean } = _routing[_routingKeys[ri]];
370
- // #COMPLY1 — the authorization keys are server-side contracts, stripped from
371
- // the client-served map: `roles` (and later `policy`) name the bundle's
372
- // authorization model — a disclosure to the browser — and `requireAuth`
373
- // rides along for consistency. The browser bundle reads none of them
374
- // (measured: zero readers in the client src AND in the built artifacts).
375
- // `_routing` is a JSON.clone, so rebuilding `param` here can never touch the
376
- // live config; the #B66 stripped variant below is cloned FROM this map, so
377
- // it inherits the strip.
378
- if ( clean.param && typeof(clean.param) == 'object' ) {
379
- const { requireAuth, roles, policy, ...cleanParam } = clean.param;
380
- // #COMPLY10 — `public` is an authorization key too: under deny-by-default
381
- // the set of public routes IS the authentication surface, so serving the
382
- // markers hands an anonymous client a free recon map of what it can reach.
383
- // Stripped with `delete` rather than by joining the destructuring above,
384
- // for two independent reasons: `public` is a strict-mode RESERVED WORD, so
385
- // the bare binding form is a SyntaxError (only a renamed binding compiles);
386
- // and a separate statement leaves the destructuring line byte-identical to
387
- // what the #COMPLY1 tests pin. The `#P21`/`#P22` note at the top of this
388
- // loop moved AWAY from `delete` for V8 hidden-class reasons on hot paths —
389
- // this loop runs once at boot over a bounded route table, so that rationale
390
- // does not apply here.
391
- delete cleanParam.public;
392
- clean.param = cleanParam;
393
- }
394
- _routing[_routingKeys[ri]] = clean;
395
-
396
- // reverseRouting is done on the frontend side
397
-
398
- }// EO for routing keys
399
-
400
- // #B66 — a host-stripped variant of the routing map, served to PROXIED clients
401
- // so the browser never receives any bundle's INTERNAL scheme://host:port (an
402
- // information disclosure) and cross-bundle client toUrl resolves same-origin.
403
- // Drop each route's `host` + `hostname`; KEEP `webroot` (the client toUrl path
404
- // relies on it). Proxy-host-agnostic + boot-static like the full map above; the
405
- // serve-time handler picks stripped-vs-full per request on request._ginaIsProxyHost.
406
- // See the #B66 handler branch below.
407
- var _routingStripped = JSON.clone(_routing);
408
- var _routingStrippedKeys = Object.keys(_routingStripped);
409
- for (var si = 0; si < _routingStrippedKeys.length; ++si) {
410
- const { host, hostname, ...cleanStripped } = _routingStripped[_routingStrippedKeys[si]];
411
- _routingStripped[_routingStrippedKeys[si]] = cleanStripped;
412
- }// EO for stripped routing keys
364
+ // #B212 — the client-served maps (the full map + the #B66 host-stripped
365
+ // variant, #COMPLY1/#COMPLY10 strip included) are now built ONCE, engine-
366
+ // agnostically, by core/server.js (buildClientRoutingAssets) and handed to
367
+ // every engine via options.clientRoutingAssets — one builder, two consumers:
368
+ // server.js serves the pre-stringified maps from memory in its onRequest
369
+ // catch-all (the express path, which used to 404 here), while isaac writes
370
+ // them to disk below and serves the precompressed files as its fast-path.
371
+ // Rebuilding the maps here would re-create the exact writer/reader drift
372
+ // the #C3 lesson warns about.
373
+ var _routing = ( options.clientRoutingAssets && options.clientRoutingAssets.full ) || null;
374
+ var _routingStripped = ( options.clientRoutingAssets && options.clientRoutingAssets.stripped ) || null;
375
+ if ( !_routing ) {
376
+ console.warn('[ SERVER ][ isaac ] options.clientRoutingAssets missing — the client routing assets (routing.json / routing.stripped.json) will not be written for this boot.');
377
+ }
413
378
 
414
379
  // Checking if brotli is installed
415
380
  var brotliBin = null;
@@ -2092,20 +2057,39 @@ function ServerEngineClass(options) {
2092
2057
  localAsset = _strippedRoutingAsset;
2093
2058
  }
2094
2059
  }
2060
+ // Slice 3 (SPA Tier 1) — per-variant weak ETag, computed once at init by
2061
+ // core/server.js beside the maps themselves (#B212 single-builder);
2062
+ // ONE weak tag per variant covers this fast-path's content-encoded
2063
+ // file representations too. Kept in sync with the engine-agnostic
2064
+ // server.js handler per the /_gina/* endpoint rule.
2065
+ var _routingAssetEtag = ( request._ginaIsProxyHost === true && options.clientRoutingAssets )
2066
+ ? options.clientRoutingAssets.strippedEtag
2067
+ : ( options.clientRoutingAssets ? options.clientRoutingAssets.fullEtag : null );
2095
2068
  response.setHeader('content-type', localAsset.mime);
2096
2069
  response.setHeader('vary', 'Origin');
2097
2070
  // #B66 — a shared cache must not cross-serve the stripped (proxied) and
2098
- // full (raw) variants under the same URL; mark the proxied variant private.
2099
- response.setHeader('cache-control', ( request._ginaIsProxyHost === true ) ? 'private, max-age=86400' : 'public, max-age=86400');
2071
+ // full (raw) variants under the same URL; mark the proxied variant
2072
+ // private. Slice 3 (SPA Tier 1): `no-cache` = revalidate-before-use — each
2073
+ // page boot costs one conditional GET (usually a 304), so a restart's
2074
+ // new route table reaches returning browsers immediately instead of
2075
+ // after the old 24h max-age window.
2076
+ response.setHeader('cache-control', ( request._ginaIsProxyHost === true ) ? 'private, no-cache' : 'public, no-cache');
2100
2077
  response.setHeader('x-content-type-options', 'nosniff');
2101
2078
  response.setHeader('x-frame-options', 'DENY');
2102
2079
  response.setHeader('x-xss-protection', '1; mode=block');
2080
+ if (_routingAssetEtag) {
2081
+ response.setHeader('etag', _routingAssetEtag);
2082
+ }
2103
2083
  // #HDR8 Phase 2 — gated on settings.json > server.hidePoweredBy
2104
2084
  // (inline form because this site uses setHeader instead of the
2105
2085
  // writeHead object-literal headers shape that _setPoweredByHeader covers)
2106
2086
  if (!options.hidePoweredBy) {
2107
2087
  response.setHeader('X-Powered-By', 'Gina/'+ GINA_VERSION);
2108
2088
  }
2089
+ if ( _routingAssetEtag && request.headers['if-none-match'] === _routingAssetEtag ) {
2090
+ response.statusCode = 304;
2091
+ return response.end();
2092
+ }
2109
2093
 
2110
2094
  var filename = _(localAsset.path +'/'+ localAsset.file, true);
2111
2095
  if (acceptEncodingArr) {
@@ -2151,7 +2135,11 @@ function ServerEngineClass(options) {
2151
2135
  if ( request.method.toUpperCase() === 'GET' ) {
2152
2136
  var cacheStatus = null;
2153
2137
  if ( String(server._cacheIsEnabled).toLowerCase() === 'true' ) {
2154
- cacheStatus = 'gina-cache';
2138
+ // #B238 — identifier from the boot-resolved stamp (server.js
2139
+ // stamps `instance._cacheName` beside `_cacheIsEnabled`; was
2140
+ // the literal 'gina-cache'). Same value as the shared handle()
2141
+ // read's mints — the engines agree on the wire by construction.
2142
+ cacheStatus = server._cacheName;
2155
2143
  }
2156
2144
 
2157
2145
  // Importing cache handler (render/output cache goes through the strategy dispatcher)
@@ -2159,6 +2147,14 @@ function ServerEngineClass(options) {
2159
2147
  // after a restart (the Map is empty on boot): has()/get() fall back to the disk
2160
2148
  // body + its `.meta` sidecar. == server.cache.path (the writer's opt.path) by
2161
2149
  // default — both resolve to the top-level `${cachePath}` (${projectPath}/cache).
2150
+ // #SPA1 — NOTE for anyone adding a per-route guard here: this read
2151
+ // is PRE-ROUTING. It keys off the raw `request.url` and there is no
2152
+ // `request.routing` in scope yet, so a `request.routing.negotiate`
2153
+ // check at this site would be a control that can never fire. A
2154
+ // negotiable route is kept out of the cache by the WRITERS refusing
2155
+ // to store it (render-swig / render-nunjucks writeCache) — which is
2156
+ // precisely why that refusal is load-bearing rather than belt-and-
2157
+ // braces. Do not "fix" this by adding a dead guard.
2162
2158
  renderCache.from(server._cached, options.cachePath);
2163
2159
  var cacheKey = null
2164
2160
  , hasCachedKey = false
@@ -433,6 +433,124 @@ function _readInstrumentBody(req, cb) {
433
433
  req.on('error', function(e) { _finish(e); });
434
434
  }
435
435
 
436
+ /**
437
+ * Builds the client-served routing maps from the boot-time global route
438
+ * table: the full map, and the #B66 host-stripped variant served to proxied
439
+ * clients.
440
+ *
441
+ * #B212 — this is the ONE engine-agnostic builder. It moved here verbatim
442
+ * from the isaac engine constructor (`server.isaac.js`), where it lived
443
+ * isaac-only — leaving `/_gina/assets/routing.json` a 404 under any other
444
+ * engine, in violation of the `/_gina/*` endpoint-sync rule (and the client,
445
+ * lacking a `response.ok` check — #B213 — then installed the 404 JSON body AS
446
+ * its routing table). Two consumers, one source of truth: `init()` hands the
447
+ * maps to the engine via `serverOpt.clientRoutingAssets` (isaac writes them to
448
+ * disk and serves the precompressed files as its fast-path) and keeps
449
+ * pre-stringified copies on `self._clientRoutingAssets` for the engine-
450
+ * agnostic `onRequest` handler (the express path). Rebuilding per engine
451
+ * would re-create the writer/reader drift the #C3 lesson warns about.
452
+ *
453
+ * Runs once at boot over a bounded route table — not a hot path.
454
+ *
455
+ * Slice 3 (#SPA1) rebuilt the cut as an ALLOWLIST. The previous shape was a
456
+ * destructuring-rest DENYLIST (strip `_comment`/`middleware`, then the
457
+ * #COMPLY1 `requireAuth`/`roles`/`policy` + #COMPLY10 `public` authorization
458
+ * keys) — but `schema/routing.json` is `additionalProperties: true` at both
459
+ * the route and `param` levels, so under a denylist every FUTURE key shipped
460
+ * to any anonymous browser by default; that is exactly how `csrfExempt`,
461
+ * `param.dto` and `queryTimeout` reached the wire. Under the allowlist the
462
+ * authorization strip is structural: a key that is not named simply never
463
+ * ships. The client contract kept here is the MEASURED reader set — client
464
+ * `getRoute`/`toUrl` read `url`/`webroot`/`bundle`/`hostname` (+ `host` on
465
+ * raw deployments), iterate `param` for URL-placeholder bindings, test
466
+ * `requirements` key-presence, and branch on the route being a redirect;
467
+ * `negotiate` is the content-negotiation capability flag the navigation
468
+ * layer needs. Everything else — dispatch keys (`param.control`/`file`/
469
+ * `path`/`title`/…), `cache`, `csrfExempt`, `scopes`, `namespace`,
470
+ * `middlewareIgnored`, `validator::` requirement bodies — is a server-side
471
+ * contract and stays home.
472
+ *
473
+ * @private
474
+ * @param {object} allRoutes - The boot-time global (all-bundles) route table (`options.conf.routing`)
475
+ * @returns {{full: object, stripped: object}} The client-safe full map and the #B66 host-stripped variant (both fresh clones — the live config is never touched)
476
+ */
477
+ function buildClientRoutingAssets(allRoutes) {
478
+ var _all = JSON.clone(allRoutes);
479
+ var _routing = {};
480
+ // Route-level allowlist — the measured client contract (see the JSDoc above).
481
+ var _clientRouteKeys = ['url', 'method', 'webroot', 'bundle', 'hostname', 'host', 'negotiate'];
482
+ var _routingKeys = Object.keys(_all);
483
+ for (var ri = 0; ri < _routingKeys.length; ++ri) {
484
+ var _src = _all[_routingKeys[ri]];
485
+ var _clean = {};
486
+ if ( !_src || typeof(_src) != 'object' ) {
487
+ _routing[_routingKeys[ri]] = _src;
488
+ continue;
489
+ }
490
+ for (var ki = 0; ki < _clientRouteKeys.length; ++ki) {
491
+ if ( typeof(_src[_clientRouteKeys[ki]]) != 'undefined' ) {
492
+ _clean[_clientRouteKeys[ki]] = _src[_clientRouteKeys[ki]];
493
+ }
494
+ }
495
+ // `requirements` — plain-regex entries only: the client toUrl reads KEY
496
+ // PRESENCE (to keep a declared URL variable out of the query string);
497
+ // a `validator::{...}` body is a server-side validation spec and a
498
+ // disclosure of the bundle's validation model.
499
+ if ( _src.requirements && typeof(_src.requirements) == 'object' ) {
500
+ var _cleanReq = {};
501
+ var _reqKeys = Object.keys(_src.requirements);
502
+ for (var qi = 0; qi < _reqKeys.length; ++qi) {
503
+ if ( !/^validator\:\:/i.test(String(_src.requirements[_reqKeys[qi]])) ) {
504
+ _cleanReq[_reqKeys[qi]] = _src.requirements[_reqKeys[qi]];
505
+ }
506
+ }
507
+ _clean.requirements = _cleanReq;
508
+ }
509
+ // `param` — URL-placeholder BINDINGS only. A param entry is a binding
510
+ // iff the route's own url declares `:key` (the client getRoute uses the
511
+ // binding regex to split URL variables from appended query params);
512
+ // every other param key is dispatch/authorization vocabulary
513
+ // (`control`, `file`, `path`, `title`, the #COMPLY1/#COMPLY10 keys, …)
514
+ // and is a server-side contract. The one dispatch FACT the client
515
+ // toUrl branches on — "is this a redirect route" — ships as the
516
+ // derived boolean `isRedirect` instead of the `control` value.
517
+ if ( _src.param && typeof(_src.param) == 'object' ) {
518
+ var _bindings = {};
519
+ var _urlVars = String(_src.url || '').match(/\:[-_a-zA-Z0-9]+/g) || [];
520
+ for (var vi = 0; vi < _urlVars.length; ++vi) {
521
+ var _varName = _urlVars[vi].substr(1);
522
+ if ( typeof(_src.param[_varName]) != 'undefined' ) {
523
+ _bindings[_varName] = _src.param[_varName];
524
+ }
525
+ }
526
+ _clean.param = _bindings;
527
+ if ( typeof(_src.param.control) == 'string' && /^redirect$/i.test(_src.param.control) ) {
528
+ _clean.isRedirect = true;
529
+ }
530
+ }
531
+ _routing[_routingKeys[ri]] = _clean;
532
+
533
+ // reverseRouting is done on the frontend side
534
+
535
+ }// EO for routing keys
536
+
537
+ // #B66 — a host-stripped variant of the routing map, served to PROXIED clients
538
+ // so the browser never receives any bundle's INTERNAL scheme://host:port (an
539
+ // information disclosure) and cross-bundle client toUrl resolves same-origin.
540
+ // Drop each route's `host` + `hostname`; KEEP `webroot` (the client toUrl path
541
+ // relies on it). Proxy-host-agnostic + boot-static like the full map above; the
542
+ // serve-time handlers pick stripped-vs-full per request (isaac on the #B65
543
+ // request stamp, the engine-agnostic onRequest handler on its #B65-twin).
544
+ var _routingStripped = JSON.clone(_routing);
545
+ var _routingStrippedKeys = Object.keys(_routingStripped);
546
+ for (var si = 0; si < _routingStrippedKeys.length; ++si) {
547
+ const { host, hostname, ...cleanStripped } = _routingStripped[_routingStrippedKeys[si]];
548
+ _routingStripped[_routingStrippedKeys[si]] = cleanStripped;
549
+ }// EO for stripped routing keys
550
+
551
+ return { full: _routing, stripped: _routingStripped };
552
+ }
553
+
436
554
  function Server(options) {
437
555
 
438
556
  // switching logger flow
@@ -737,6 +855,36 @@ function Server(options) {
737
855
  serverOpt.ioServer = ioServerOpt
738
856
  }
739
857
 
858
+ // #B212 — build the client-served routing maps ONCE here, engine-
859
+ // agnostically, so /_gina/assets/routing.json serves identically under
860
+ // every engine: isaac consumes these via serverOpt for its
861
+ // precompressed-file fast-path, and the engine-agnostic onRequest
862
+ // handler below serves the pre-stringified copies from memory (the
863
+ // express path, which used to fall through to routing and 404).
864
+ // Built BEFORE `new Engine(serverOpt)` — isaac reads them in its
865
+ // constructor.
866
+ // TODO - Use the per-bundle `routing` instead of `allRoutes` after having
867
+ // filtered `allRoutes` vs `formsRules` to use only external routes exposed
868
+ // by `"query"` validation
869
+ var _clientRoutingAssets = buildClientRoutingAssets(serverOpt.allRoutes);
870
+ serverOpt.clientRoutingAssets = _clientRoutingAssets;
871
+ self._clientRoutingAssets = {
872
+ full : JSON.stringify(_clientRoutingAssets.full),
873
+ stripped : JSON.stringify(_clientRoutingAssets.stripped)
874
+ };
875
+ // Slice 3 (#SPA1) — weak per-variant ETags, computed once: the maps are
876
+ // boot-static, and the serve paths answer If-None-Match with a 304 under
877
+ // `no-cache` (revalidate) semantics. This closes the staleness window the
878
+ // old `max-age=86400` left open — a returning browser could dispatch on a
879
+ // day-old table for up to 24h after a restart. Weak tags (`W/"…"`) so ONE
880
+ // tag per variant covers isaac's content-encoded file representations too.
881
+ self._clientRoutingAssets.fullEtag =
882
+ 'W/"' + crypto.createHash('sha1').update(self._clientRoutingAssets.full).digest('hex').substr(0, 16) + '"';
883
+ self._clientRoutingAssets.strippedEtag =
884
+ 'W/"' + crypto.createHash('sha1').update(self._clientRoutingAssets.stripped).digest('hex').substr(0, 16) + '"';
885
+ serverOpt.clientRoutingAssets.fullEtag = self._clientRoutingAssets.fullEtag;
886
+ serverOpt.clientRoutingAssets.strippedEtag = self._clientRoutingAssets.strippedEtag;
887
+
740
888
  Engine = require('./server.' + ((typeof (serverOpt.engine) != 'undefined' && serverOpt.engine != '') ? serverOpt.engine : 'express'));
741
889
  var engine = new Engine(serverOpt);
742
890
 
@@ -1355,7 +1503,7 @@ function Server(options) {
1355
1503
  throw new Error('[ SERVER ] `settings.json > audit.chain.secret` must be a non-empty string.');
1356
1504
  }
1357
1505
  if ( typeof(_auditSettings.chain.secret) == 'string' && /\$\{/.test(_auditSettings.chain.secret) ) {
1358
- throw new Error('[ SERVER ] `settings.json > audit.chain.secret` carries an unresolved `${...}` placeholder — the named variable is not set at config-load time. Note that `${secret:GINA_*}` names can never resolve (the CLI moves every GINA_* variable out of process.env before config load); use a non-GINA variable name, or set GINA_AUDIT_SECRET.');
1506
+ throw new Error('[ SERVER ] `settings.json > audit.chain.secret` carries an unresolved `${...}` placeholder — only the anchored `${secret:KEY}` form is substituted at config load; bare `${VAR}` and mixed strings pass through as literals. Use `${secret:KEY}` with the variable exported in the environment the bundle starts from, or set GINA_AUDIT_SECRET.');
1359
1507
  }
1360
1508
  }
1361
1509
  var _auditChainEnabled = !!( _auditSettings.chain && _auditSettings.chain.enabled === true );
@@ -1899,6 +2047,17 @@ function Server(options) {
1899
2047
  if ( typeof(instance._cacheIsEnabled) == 'undefined' ) {
1900
2048
  instance._cacheIsEnabled = self.conf[self.appName][self.env].server.cache.enable;
1901
2049
  }
2050
+ // #B238 — the Cache-Status identifier, resolved ONCE from the post-fold
2051
+ // server.cache (`name` when valid, else `gina-cache`) and stamped on the
2052
+ // engine instance both engines read (isaac: `server._cacheName`; the
2053
+ // engine-agnostic hit/miss mints: `self.instance._cacheName`). One
2054
+ // resolution, three readers — the identifier cannot disagree across
2055
+ // engines or hit/miss outcomes. Unconditional beside the sibling
2056
+ // scalars above, so the mint sites read it unguarded (same trust as
2057
+ // `_cacheIsEnabled`).
2058
+ if ( typeof(instance._cacheName) == 'undefined' ) {
2059
+ instance._cacheName = lib.RenderCache.resolveCacheName(self.conf[self.appName][self.env].server.cache);
2060
+ }
1902
2061
 
1903
2062
  // #B115 — publish the engine so the form-validator's server-side `query`
1904
2063
  // rule can hand its hand-built controller the LIVE instance (one engine
@@ -3983,6 +4142,16 @@ function Server(options) {
3983
4142
  if ( typeof(request.headers['x-gina-popin-name']) != 'undefined' ) {
3984
4143
  ginaHeaders.popin.name = request.headers['x-gina-popin-name'];
3985
4144
  }
4145
+ // #SPA1 — content-negotiation signal. `X-Gina-Navigate: fragment` asks a
4146
+ // NEGOTIABLE route (routing.json `negotiate: true`) for its layoutless body
4147
+ // instead of the full page. Parked here with the other gina headers rather
4148
+ // than overloading `X-Requested-With`, which popin / link / validator all
4149
+ // already send and which the render + error paths already fork on.
4150
+ // Unknown values are deliberately NOT rejected — they fall through to the
4151
+ // full page, so extending the vocabulary later is backward-compatible.
4152
+ if ( typeof(request.headers['x-gina-navigate']) != 'undefined' ) {
4153
+ ginaHeaders.navigate = String(request.headers['x-gina-navigate']).trim().toLowerCase();
4154
+ }
3986
4155
  if ( typeof(request.headers['x-gina-form-rule']) != 'undefined' ) {
3987
4156
  var rule = request.headers['x-gina-form-rule'].split(/\@/);
3988
4157
  ginaHeaders.form.rule = rule[0];
@@ -4030,6 +4199,58 @@ function Server(options) {
4030
4199
  return response.end(JSON.stringify({ status: 'healthy', timestamp: new Date().toISOString() }));
4031
4200
  }
4032
4201
 
4202
+ // ── /_gina/assets/routing.json — client routing map (always-on, public) ─────
4203
+ // (#B212) Engine-agnostic mirror of the Isaac fast-path (server.isaac.js
4204
+ // ~:2079). Under isaac the fast-path answers first with the precompressed
4205
+ // file variants, so this handler is what serves the map under any other
4206
+ // engine (express) — where the asset previously fell through to routing
4207
+ // and 404'd, and the client (no response.ok check — #B213) then installed
4208
+ // the 404 JSON body AS its routing table. Serves the maps built once at
4209
+ // init by buildClientRoutingAssets(). GET only + the isaac header set;
4210
+ // X-Powered-By / X-Request-Id are already emitted above for every
4211
+ // onInstance response, so they are inherited, not re-set.
4212
+ if (
4213
+ request.method.toUpperCase() === 'GET'
4214
+ && /\/_gina\/assets\/routing\.json$/i.test(request.url)
4215
+ && self._clientRoutingAssets
4216
+ ) {
4217
+ // #B65-twin — per-request proxied classification (keep in sync with
4218
+ // the core/server.isaac.js #B65 block + the core/router.js #B67 twin):
4219
+ // proxied iff the inbound Host is port-less (heuristic, disabled by
4220
+ // process.gina._proxyRequireForwarded — #B152) OR an explicit
4221
+ // X-Forwarded-Host is present. Computed inline because the #B65 stamp
4222
+ // (request._ginaIsProxyHost) is isaac-request-path-only and the #B67
4223
+ // twin runs at routing time — after this handler.
4224
+ var _croutHost = request.headers.host || request.headers[':authority'];
4225
+ var _croutProxied = (
4226
+ ( _croutHost && !/\:[0-9]+$/.test(_croutHost)
4227
+ && process.gina._proxyRequireForwarded !== true )
4228
+ || request.headers['x-forwarded-host']
4229
+ ) ? true : false;
4230
+ var _croutEtag = ( _croutProxied === true )
4231
+ ? self._clientRoutingAssets.strippedEtag
4232
+ : self._clientRoutingAssets.fullEtag;
4233
+ response.setHeader('content-type', 'application/json; charset=utf8');
4234
+ response.setHeader('vary', 'Origin');
4235
+ // #B66 — a shared cache must not cross-serve the stripped (proxied) and
4236
+ // full (raw) variants under the same URL; mark the proxied variant
4237
+ // private. Slice 3 (#SPA1): `no-cache` = revalidate-before-use — the
4238
+ // per-variant weak ETag turns each page boot into one conditional GET
4239
+ // (usually a 304), so a restart's new route table reaches returning
4240
+ // browsers immediately instead of after a 24h max-age window.
4241
+ response.setHeader('cache-control', ( _croutProxied === true ) ? 'private, no-cache' : 'public, no-cache');
4242
+ response.setHeader('x-content-type-options', 'nosniff');
4243
+ response.setHeader('x-frame-options', 'DENY');
4244
+ response.setHeader('x-xss-protection', '1; mode=block');
4245
+ response.setHeader('etag', _croutEtag);
4246
+ if ( request.headers['if-none-match'] === _croutEtag ) {
4247
+ response.statusCode = 304;
4248
+ return response.end();
4249
+ }
4250
+ response.statusCode = 200;
4251
+ return response.end( ( _croutProxied === true ) ? self._clientRoutingAssets.stripped : self._clientRoutingAssets.full );
4252
+ }
4253
+
4033
4254
  // ── /_gina/metrics — Prometheus exposition (always-on, opt-in via app.json) ──
4034
4255
  // (#OBS1 slice 2) Engine-agnostic mirror of the Isaac handler. Method gate
4035
4256
  // is GET only; IP allowlist comes from app.json `metrics.allowFrom` (default
@@ -6263,7 +6484,9 @@ function Server(options) {
6263
6484
  }
6264
6485
  // #RC5 — ONE header string, set AND logged from the same var (the prior dual
6265
6486
  // construction at setHeader + console.info was a drift hazard).
6266
- var _cs = 'gina-cache; hit'
6487
+ // #B238 — identifier from the boot-resolved stamp (was the literal
6488
+ // 'gina-cache'); default unchanged when server.cache.name is unset.
6489
+ var _cs = self.instance._cacheName + '; hit'
6267
6490
  + (_remaining !== null ? '; ttl=' + _remaining : '')
6268
6491
  + (source ? '; detail=' + source : '');
6269
6492
  res.setHeader('Cache-Status', _cs);
@@ -6305,6 +6528,12 @@ function Server(options) {
6305
6528
  var _method = ( /http\/2/.test(self.conf[self.appName][self.env].server.protocol) ) ? req.headers[':method'] : req.method;
6306
6529
  if ( !/^get$/i.test(_method || req.method || '') ) { return false; }
6307
6530
  if ( !req.routing || !req.routing.cache ) { return false; }
6531
+ // #SPA1 — never SERVE a negotiable route from the output cache. The key has no
6532
+ // shape dimension and this serve point runs before the shape is resolved, so a
6533
+ // hit could replay a fragment to a page request. The writer refuses too
6534
+ // (render-swig writeCache), making this defence-in-depth rather than the only
6535
+ // guard — but it is stated at BOTH ends so the invariant is local to each site.
6536
+ if ( req.routing.negotiate === true ) { return false; }
6308
6537
  if ( String(self.instance._cacheIsEnabled).toLowerCase() !== 'true' ) { return false; }
6309
6538
  // No L2 store wired (memory/fs bundle, or boot degraded) → nothing to warm here;
6310
6539
  // isaac already served any L1 hit, and express memory/fs read is a later slice.
@@ -6367,7 +6596,8 @@ function Server(options) {
6367
6596
  // deliberately NOT claimed — whether the render's writeCache stores is not
6368
6597
  // knowable here, and headers are flushed before it settles.
6369
6598
  if ( !res.headersSent ) {
6370
- res.setHeader('Cache-Status', 'gina-cache; fwd=uri-miss');
6599
+ // #B238 — identifier from the boot-resolved stamp (was the literal 'gina-cache').
6600
+ res.setHeader('Cache-Status', self.instance._cacheName + '; fwd=uri-miss');
6371
6601
  }
6372
6602
  return false; // miss → render normally
6373
6603
  }
@@ -6685,6 +6915,13 @@ function Server(options) {
6685
6915
  // req.routing.param.culture as the highest-priority
6686
6916
  // culture source (URL `/fr/...` → req.culture='fr').
6687
6917
  culturePrefix : routing[name].culturePrefix || false,
6918
+ // #SPA1 — per-route content-negotiation capability. Declares that
6919
+ // this route may answer in more than one shape, so the render cache
6920
+ // (whose key carries no shape dimension) must not serve or store it.
6921
+ // Read at the request-pipeline boundary, BEFORE the cache serve
6922
+ // points — which is precisely why the capability is route-declared
6923
+ // rather than derived inside render().
6924
+ negotiate : routing[name].negotiate || false,
6688
6925
  // We clone because we are going to modify it while comparing urls
6689
6926
  param : JSON.clone(routing[name].param),
6690
6927
  // We clone because we are going to modify it while routing (.splice(..))
@@ -32,13 +32,15 @@ var ${bundle} = require('gina');
32
32
  // // var session = ${bundle}.plugins.Session(expressSession);
33
33
  // //
34
34
  // // Redis — multi-pod / K8s (requires: npm install ioredis)
35
- // // Configure connectors.json: { "myRedis": { "connector": "redis", "host": "...", "port": 6379, "ttl": 86400 } }
36
- // // expressSession.name = 'myRedis';
35
+ // // Configure connectors.json: { "session": { "connector": "redis", "host": "...", "port": 6379, "ttl": 86400 } }
37
36
  // //
38
37
  // // SQLite — dev / staging / single-pod (requires: Node >= 22.5.0, zero npm deps)
39
- // // Configure connectors.json: { "myDb": { "connector": "sqlite", "database": ":memory:", "ttl": 86400 } }
40
- // // expressSession.name = 'myDb';
38
+ // // Configure connectors.json: { "session": { "connector": "sqlite", "database": ":memory:", "ttl": 86400 } }
41
39
  // //
40
+ // // The store factory keys on express-session's function name — the literal
41
+ // // "session", which is read-only and cannot be re-pointed — so the
42
+ // // connectors.json entry MUST be named "session"; its `connector` field
43
+ // // selects the backend (#B206).
42
44
  // // var StoreClass = new SessionStore(expressSession); // returns connector-specific Store class
43
45
  // //
44
46
  // // Recommended: keep the session secret out of tracked source via the
@@ -144,6 +144,16 @@
144
144
  // refuses boot (a non-expiring L2 key is orphaned on a release-namespace change):
145
145
  // "type": "redis",
146
146
  // "store": "cacheRedis" // connectors.json: { "cacheRedis": { "connector": "redis", "host": "127.0.0.1", "port": 6379 } }
147
+ // #B238 — optional `name`: the RFC 9211 Cache-Status identifier this bundle's
148
+ // render/output cache reports on the wire (default "gina-cache"). A letter, then
149
+ // up to 63 of [A-Za-z0-9._-] (a conservative RFC 8941 token subset); an invalid
150
+ // value is ignored with a boot warn. When `server.hidePoweredBy` is true and the
151
+ // cache is enabled, leaving `name` unset logs a boot warn (the wire still names
152
+ // the framework) — set any token (e.g. "cache") to close the disclosure, or
153
+ // explicitly "gina-cache" to keep the default wire and silence the warn.
154
+ // Deliberately NOT declared here: a template-declared default would read as
155
+ // operator-set and mute that warn framework-wide.
156
+ // "name": "cache",
147
157
  "type": "memory"
148
158
  },
149
159
  // #CSRF1 — session-cookie defaults applied by gina.plugins.Session(expressSession).
@@ -116,10 +116,18 @@ Every GET response carries a `Cache-Status` header indicating cache outcome:
116
116
 
117
117
  | Value | Meaning |
118
118
  |-------|---------|
119
- | `gina-cache; uri-miss` | No cached entry for this URL |
119
+ | `gina-cache; fwd=uri-miss` | No cached entry for this URL (RFC 9211 §2.2 form) |
120
120
  | `gina-cache; hit; ttl=NNN` | Hit — `NNN` seconds remaining (absolute TTL) |
121
121
  | `gina-cache; hit; ttl=NNN; max-age=MMM` | Hit — `NNN` seconds in current idle window, `MMM` seconds until absolute ceiling |
122
122
 
123
+ `gina-cache` is the default identifier — `server.cache.name` (settings.json
124
+ `cache` block) replaces it with an operator-chosen RFC 8941 token (a letter,
125
+ then up to 63 of `[A-Za-z0-9._-]`); every parameter after it is unchanged.
126
+ When `server.hidePoweredBy` is true and the cache is enabled, leaving `name`
127
+ unset logs a boot warn (the wire still names the framework); set any token
128
+ (e.g. `cache`) to close the disclosure, or explicitly `gina-cache` to keep
129
+ the default wire and silence the warn.
130
+
123
131
  ---
124
132
 
125
133
  ### Storage backends
@@ -23,10 +23,10 @@ var CmdHelper = require('./../helper');
23
23
  * `<project>/logs/audit-<bundle>-<env>.jsonl`).
24
24
  *
25
25
  * Key resolution: `settings.json > audit.chain.secret` (a `${secret:VAR}`
26
- * placeholder is resolved from `process.env[VAR]` — config-load substitution
27
- * does not run offline, and `${secret:GINA_*}` names can never resolve
28
- * because the CLI sweeps GINA_* out of process.env), then `GINA_AUDIT_SECRET`
29
- * through the framework env reader.
26
+ * placeholder is resolved here because config-load substitution does not run
27
+ * offline — read from the framework env reader first, then `process.env[VAR]`,
28
+ * so GINA_-prefixed names swept out of process.env by the CLI still resolve,
29
+ * #B156), then `GINA_AUDIT_SECRET` through the same two-tier read.
30
30
  *
31
31
  * Exit codes: `0` chain intact (warnings, if any, are printed — read them) ·
32
32
  * `1` chain BROKEN · `2` usage/config error (no trail file, no key, bad --env).
@@ -191,9 +191,11 @@ function Verify(opt, cmd) {
191
191
 
192
192
  /**
193
193
  * Resolves the signing key: `audit.chain.secret` (literal, or a
194
- * `${secret:VAR}` placeholder resolved from `process.env[VAR]`), then
195
- * `GINA_AUDIT_SECRET` through the framework env reader (direct
196
- * `process.env` fallback for non-CLI contexts).
194
+ * `${secret:VAR}` placeholder read from the framework env reader first,
195
+ * then `process.env[VAR]` — the CLI sweep moves GINA_*-prefixed keys out
196
+ * of `process.env`, so the two-tier read is what lets a shell-exported
197
+ * variable resolve in this offline process, #B156), then
198
+ * `GINA_AUDIT_SECRET` through the same two-tier read.
197
199
  *
198
200
  * @inner
199
201
  * @private
@@ -212,9 +214,9 @@ function Verify(opt, cmd) {
212
214
  if ( secret ) {
213
215
  var m = secret.match(/^\$\{secret:([^}]+)\}$/);
214
216
  if ( m ) {
215
- secret = process.env[m[1]] || null;
217
+ secret = ( typeof(getEnvVar) == 'function' && getEnvVar(m[1]) ) || process.env[m[1]] || null;
216
218
  if ( !secret ) {
217
- console.error('`audit.chain.secret` names `${secret:'+ m[1] +'}` but `'+ m[1] +'` is not set in this shell. Export it, or set GINA_AUDIT_SECRET. (Note: `${secret:GINA_*}` names can never resolve — the CLI sweeps GINA_* out of process.env.)');
219
+ console.error('`audit.chain.secret` names `${secret:'+ m[1] +'}` but `'+ m[1] +'` is not set in this environment. Export it before running the command, or set GINA_AUDIT_SECRET.');
218
220
  process.exit(2);
219
221
  return false;
220
222
  }
@@ -155,10 +155,15 @@ function MCPStart(opt, cmd) {
155
155
  // Loud, one-time notice about the tools that look session-scoped.
156
156
  warnSessionScopedTools(mcpDoc.tools);
157
157
 
158
- // Framework package version — the user-facing server version.
158
+ // Framework package version — the user-facing server version. Read
159
+ // GINA_DIR through the framework env reader first: the CLI sweep
160
+ // empties process.env of GINA_* keys, so the direct read alone made
161
+ // every CLI-launched server degrade to the '0.0.0' catch below.
159
162
  var packVersion = null;
160
163
  try {
161
- var packPath = _(process.env.GINA_DIR + '/package.json', true);
164
+ var ginaDir = (typeof getEnvVar === 'function' && getEnvVar('GINA_DIR'))
165
+ || process.env.GINA_DIR;
166
+ var packPath = _(ginaDir + '/package.json', true);
162
167
  packVersion = require(packPath).version;
163
168
  } catch (pkgErr) {
164
169
  packVersion = '0.0.0';
@@ -364,15 +369,16 @@ function MCPStart(opt, cmd) {
364
369
  * Resolves the HTTP bind host. Precedence:
365
370
  * 1. `--http-host=<host>` CLI flag
366
371
  * 2. `mcp.json > server > httpHost`
367
- * 3. `process.env.GINA_HOST_V4` — INERT under the CLI. `filterArgs()`
368
- * moves every GINA_* key into `process.gina` and deletes it from
369
- * `process.env`, so this read is always undefined there.
370
- * Deliberately NOT converted to `getEnvVar` the way the auth-token
371
- * tier was: `host_v4` is the address clients CONNECT to (commonly a
372
- * LAN address), never a bind address — reviving this tier would move
373
- * the default bind OFF loopback and expose the transport. The correct
374
- * replacement is `bind_host` / `GINA_BIND_HOST`, tracked separately.
375
- * 4. `'127.0.0.1'` — in practice the effective default, per (3).
372
+ * 3. `GINA_BIND_HOST` — the framework env reader first, then the raw
373
+ * process environment (for embedders that never ran the CLI sweep).
374
+ * This is the control plane's dedicated BIND key, same bind/connect
375
+ * separation as `bin/cli`. The former `GINA_HOST_V4` tier was
376
+ * removed (#B157): it was inert under the CLI (the sweep empties
377
+ * the process environment of GINA_* keys), and reviving it would
378
+ * have moved the default bind OFF loopback — `host_v4` is the
379
+ * address clients CONNECT to (commonly a LAN address), never a
380
+ * bind address.
381
+ * 4. `'127.0.0.1'`
376
382
  *
377
383
  * @private
378
384
  * @param {object} mcpDoc
@@ -384,7 +390,10 @@ function MCPStart(opt, cmd) {
384
390
  if (mcpDoc && mcpDoc.server && typeof(mcpDoc.server.httpHost) === 'string' && mcpDoc.server.httpHost) {
385
391
  return mcpDoc.server.httpHost;
386
392
  }
387
- var env = process.env.GINA_HOST_V4;
393
+ // #B157 — bind_host, never host_v4: the string guard below also keeps
394
+ // a sweep-coerced boolean from ever reaching the bind.
395
+ var env = (typeof getEnvVar === 'function' && getEnvVar('GINA_BIND_HOST'))
396
+ || process.env.GINA_BIND_HOST;
388
397
  if (typeof(env) === 'string' && env) return env;
389
398
  return '127.0.0.1';
390
399
  };