gina 0.6.31 → 0.6.32

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 (621) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +62 -25
  3. package/ROADMAP.md +3 -1
  4. package/framework/v0.6.32/VERSION +1 -0
  5. package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/js/gina.js +2389 -202
  6. package/framework/v0.6.32/core/asset/plugin/dist/vendor/gina/js/gina.min.js +716 -0
  7. package/framework/v0.6.32/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  8. package/framework/v0.6.32/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  9. package/framework/{v0.6.31 → v0.6.32}/core/config.js +45 -7
  10. package/framework/{v0.6.31 → v0.6.32}/core/connectors/couchbase/index.js +9 -3
  11. package/framework/{v0.6.31 → v0.6.32}/core/controller/controller.js +164 -17
  12. package/framework/{v0.6.31 → v0.6.32}/core/controller/controller.render-json.js +35 -1
  13. package/framework/{v0.6.31 → v0.6.32}/core/controller/controller.render-nunjucks-async.js +20 -0
  14. package/framework/{v0.6.31 → v0.6.32}/core/controller/controller.render-nunjucks.js +69 -6
  15. package/framework/{v0.6.31 → v0.6.32}/core/controller/controller.render-swig-async.js +20 -0
  16. package/framework/{v0.6.31 → v0.6.32}/core/controller/controller.render-swig.js +40 -0
  17. package/framework/{v0.6.31 → v0.6.32}/core/controller/controller.render-xml.js +20 -0
  18. package/framework/{v0.6.31 → v0.6.32}/core/gna.js +50 -2
  19. package/framework/{v0.6.31 → v0.6.32}/core/model/entity.js +79 -28
  20. package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/validator/src/form-validator.js +32 -1
  21. package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/validator/src/main.js +1579 -55
  22. package/framework/{v0.6.31 → v0.6.32}/core/router.js +45 -1
  23. package/framework/{v0.6.31 → v0.6.32}/core/server.isaac.js +41 -5
  24. package/framework/{v0.6.31 → v0.6.32}/core/server.js +277 -464
  25. package/framework/{v0.6.31 → v0.6.32}/helpers/json/src/main.js +57 -4
  26. package/framework/v0.6.32/lib/duration/package.json +17 -0
  27. package/framework/v0.6.32/lib/duration/src/main.js +82 -0
  28. package/framework/{v0.6.31 → v0.6.32}/lib/index.js +18 -4
  29. package/framework/{v0.6.31 → v0.6.32}/lib/maintenance/src/main.js +387 -7
  30. package/framework/{v0.6.31 → v0.6.32}/lib/model.js +86 -1
  31. package/framework/v0.6.32/lib/session-lifetime/package.json +17 -0
  32. package/framework/v0.6.32/lib/session-lifetime/src/main.js +337 -0
  33. package/framework/{v0.6.31 → v0.6.32}/lib/storage/src/meta-store.js +45 -37
  34. package/framework/{v0.6.31 → v0.6.32}/lib/storage/src/util.js +8 -21
  35. package/framework/{v0.6.31 → v0.6.32}/package.json +1 -1
  36. package/gna.js +4 -4
  37. package/llms.txt +14 -14
  38. package/package.json +3 -3
  39. package/schema/security.json +35 -0
  40. package/schema/settings.json +13 -1
  41. package/script/smoke_ws_h2.js +353 -0
  42. package/test-results/validator-upload-popin-con-a5268-n-change-fires-RED-pre-fix--chromium/error-context.md +172 -0
  43. package/test-results/validator-upload-popin-con-cf673--the-page-form-RED-pre-fix--chromium/error-context.md +212 -0
  44. package/types/gna.d.ts +3 -2
  45. package/types/index.d.ts +32 -0
  46. package/framework/v0.6.31/VERSION +0 -1
  47. package/framework/v0.6.31/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -673
  48. package/framework/v0.6.31/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  49. package/framework/v0.6.31/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  50. package/test-results/validator-upload-preview-f-c70b4-t-in-the-DOM-or-on-the-wire-chromium/error-context.md +0 -187
  51. /package/framework/{v0.6.31 → v0.6.32}/AUTHORS +0 -0
  52. /package/framework/{v0.6.31 → v0.6.32}/LICENSE +0 -0
  53. /package/framework/{v0.6.31 → v0.6.32}/core/asset/html/nolayout.html +0 -0
  54. /package/framework/{v0.6.31 → v0.6.32}/core/asset/html/static.html +0 -0
  55. /package/framework/{v0.6.31 → v0.6.32}/core/asset/img/android-chrome-192x192.png +0 -0
  56. /package/framework/{v0.6.31 → v0.6.32}/core/asset/img/android-chrome-512x512.png +0 -0
  57. /package/framework/{v0.6.31 → v0.6.32}/core/asset/img/apple-touch-icon.png +0 -0
  58. /package/framework/{v0.6.31 → v0.6.32}/core/asset/img/favicon-16x16.png +0 -0
  59. /package/framework/{v0.6.31 → v0.6.32}/core/asset/img/favicon-32x32.png +0 -0
  60. /package/framework/{v0.6.31 → v0.6.32}/core/asset/img/favicon.ico +0 -0
  61. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/README.md +0 -0
  62. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  63. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  64. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  65. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  66. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  67. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  68. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  69. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  70. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  71. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  72. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  73. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  74. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  75. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  76. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  77. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  78. /package/framework/{v0.6.31 → v0.6.32}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  79. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/ai/index.js +0 -0
  80. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/ai/lib/connector.js +0 -0
  81. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/couchbase/lib/connector.js +0 -0
  82. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  83. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  84. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/couchbase/lib/n1ql.js +0 -0
  85. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/couchbase/lib/session-store.js +0 -0
  86. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  87. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  88. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/couchbase/lib/storage-store.js +0 -0
  89. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/duckdb/index.js +0 -0
  90. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/duckdb/lib/connector.js +0 -0
  91. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/mongodb/index.js +0 -0
  92. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/mongodb/lib/connector.js +0 -0
  93. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/mongodb/lib/job-store.js +0 -0
  94. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
  95. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/mongodb/lib/session-store.js +0 -0
  96. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/mysql/index.js +0 -0
  97. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/mysql/lib/connector.js +0 -0
  98. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/param-redact.js +0 -0
  99. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/postgresql/index.js +0 -0
  100. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/postgresql/lib/connector.js +0 -0
  101. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/redis/index.js +0 -0
  102. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/redis/lib/connector.js +0 -0
  103. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/redis/lib/job-store.js +0 -0
  104. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/redis/lib/kv-store.js +0 -0
  105. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/redis/lib/render-cache-store.js +0 -0
  106. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/redis/lib/session-store.js +0 -0
  107. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/scylladb/index.js +0 -0
  108. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/scylladb/lib/connector.js +0 -0
  109. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/scylladb/lib/session-store.js +0 -0
  110. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/settle-once.js +0 -0
  111. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/sql-parser.js +0 -0
  112. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/sqlite/index.js +0 -0
  113. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/sqlite/lib/connector.js +0 -0
  114. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/sqlite/lib/job-store.js +0 -0
  115. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/sqlite/lib/kv-store.js +0 -0
  116. /package/framework/{v0.6.31 → v0.6.32}/core/connectors/sqlite/lib/session-store.js +0 -0
  117. /package/framework/{v0.6.31 → v0.6.32}/core/content.encoding +0 -0
  118. /package/framework/{v0.6.31 → v0.6.32}/core/controller/controller.framework.js +0 -0
  119. /package/framework/{v0.6.31 → v0.6.32}/core/controller/controller.render-stream.js +0 -0
  120. /package/framework/{v0.6.31 → v0.6.32}/core/controller/controller.render-v1.js +0 -0
  121. /package/framework/{v0.6.31 → v0.6.32}/core/controller/index.js +0 -0
  122. /package/framework/{v0.6.31 → v0.6.32}/core/controller/inline-script.js +0 -0
  123. /package/framework/{v0.6.31 → v0.6.32}/core/controller/inspector-window-emit.js +0 -0
  124. /package/framework/{v0.6.31 → v0.6.32}/core/controller/release-banner.js +0 -0
  125. /package/framework/{v0.6.31 → v0.6.32}/core/dev/index.js +0 -0
  126. /package/framework/{v0.6.31 → v0.6.32}/core/dev/lib/class.js +0 -0
  127. /package/framework/{v0.6.31 → v0.6.32}/core/dev/lib/factory.js +0 -0
  128. /package/framework/{v0.6.31 → v0.6.32}/core/dev/lib/tools.js +0 -0
  129. /package/framework/{v0.6.31 → v0.6.32}/core/locales/README.md +0 -0
  130. /package/framework/{v0.6.31 → v0.6.32}/core/locales/currency.json +0 -0
  131. /package/framework/{v0.6.31 → v0.6.32}/core/locales/dist/language/en.json +0 -0
  132. /package/framework/{v0.6.31 → v0.6.32}/core/locales/dist/language/fr.json +0 -0
  133. /package/framework/{v0.6.31 → v0.6.32}/core/locales/dist/region/en.json +0 -0
  134. /package/framework/{v0.6.31 → v0.6.32}/core/locales/dist/region/fr.json +0 -0
  135. /package/framework/{v0.6.31 → v0.6.32}/core/locales/index.js +0 -0
  136. /package/framework/{v0.6.31 → v0.6.32}/core/mime.types +0 -0
  137. /package/framework/{v0.6.31 → v0.6.32}/core/model/index.js +0 -0
  138. /package/framework/{v0.6.31 → v0.6.32}/core/model/template/entityFactory.js +0 -0
  139. /package/framework/{v0.6.31 → v0.6.32}/core/model/template/index.js +0 -0
  140. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/README.md +0 -0
  141. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/index.js +0 -0
  142. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/csrf/README.md +0 -0
  143. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/csrf/package.json +0 -0
  144. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/csrf/src/main.js +0 -0
  145. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/README.md +0 -0
  146. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/coep/README.md +0 -0
  147. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/coep/package.json +0 -0
  148. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
  149. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/coop/README.md +0 -0
  150. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/coop/package.json +0 -0
  151. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
  152. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/corp/README.md +0 -0
  153. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/corp/package.json +0 -0
  154. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
  155. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/csp/README.md +0 -0
  156. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/csp/package.json +0 -0
  157. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
  158. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
  159. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
  160. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
  161. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/hsts/README.md +0 -0
  162. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/hsts/package.json +0 -0
  163. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
  164. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
  165. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
  166. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
  167. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/package.json +0 -0
  168. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
  169. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
  170. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
  171. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/src/main.js +0 -0
  172. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
  173. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
  174. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
  175. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
  176. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
  177. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
  178. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
  179. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
  180. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
  181. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
  182. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
  183. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
  184. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
  185. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
  186. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
  187. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
  188. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
  189. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
  190. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/session/README.md +0 -0
  191. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/session/package.json +0 -0
  192. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/session/src/main.js +0 -0
  193. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/storage/README.md +0 -0
  194. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/storage/build.json +0 -0
  195. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/storage/package.json +0 -0
  196. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/storage/src/main.js +0 -0
  197. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/validator/README.md +0 -0
  198. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/validator/build.json +0 -0
  199. /package/framework/{v0.6.31 → v0.6.32}/core/plugins/lib/validator/package.json +0 -0
  200. /package/framework/{v0.6.31 → v0.6.32}/core/server.express.js +0 -0
  201. /package/framework/{v0.6.31 → v0.6.32}/core/status.codes +0 -0
  202. /package/framework/{v0.6.31 → v0.6.32}/core/template/_gitignore +0 -0
  203. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle/config/app.json +0 -0
  204. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  205. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle/config/routing.json +0 -0
  206. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle/config/settings.json +0 -0
  207. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  208. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle/config/templates.json +0 -0
  209. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  210. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  211. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  212. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  213. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle/index.js +0 -0
  214. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle/locales/en.json +0 -0
  215. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  216. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  217. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  218. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  219. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  220. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
  221. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  222. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
  223. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_public/readme.md +0 -0
  224. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_public/sw.js +0 -0
  225. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  226. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  227. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  228. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  229. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
  230. /package/framework/{v0.6.31 → v0.6.32}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  231. /package/framework/{v0.6.31 → v0.6.32}/core/template/command/gina.bat.tpl +0 -0
  232. /package/framework/{v0.6.31 → v0.6.32}/core/template/command/gina.tpl +0 -0
  233. /package/framework/{v0.6.31 → v0.6.32}/core/template/conf/env.json +0 -0
  234. /package/framework/{v0.6.31 → v0.6.32}/core/template/conf/manifest.json +0 -0
  235. /package/framework/{v0.6.31 → v0.6.32}/core/template/conf/package.json +0 -0
  236. /package/framework/{v0.6.31 → v0.6.32}/core/template/conf/settings.json +0 -0
  237. /package/framework/{v0.6.31 → v0.6.32}/core/template/conf/statics.json +0 -0
  238. /package/framework/{v0.6.31 → v0.6.32}/core/template/conf/templates.json +0 -0
  239. /package/framework/{v0.6.31 → v0.6.32}/core/template/error/client/json/401.json +0 -0
  240. /package/framework/{v0.6.31 → v0.6.32}/core/template/error/client/json/403.json +0 -0
  241. /package/framework/{v0.6.31 → v0.6.32}/core/template/error/client/json/404.json +0 -0
  242. /package/framework/{v0.6.31 → v0.6.32}/core/template/error/server/html/50x.html +0 -0
  243. /package/framework/{v0.6.31 → v0.6.32}/core/template/error/server/json/500.json +0 -0
  244. /package/framework/{v0.6.31 → v0.6.32}/core/template/error/server/json/503.json +0 -0
  245. /package/framework/{v0.6.31 → v0.6.32}/core/template/extensions/logger/config.json +0 -0
  246. /package/framework/{v0.6.31 → v0.6.32}/helpers/console.js +0 -0
  247. /package/framework/{v0.6.31 → v0.6.32}/helpers/context.js +0 -0
  248. /package/framework/{v0.6.31 → v0.6.32}/helpers/data/LICENSE +0 -0
  249. /package/framework/{v0.6.31 → v0.6.32}/helpers/data/README.md +0 -0
  250. /package/framework/{v0.6.31 → v0.6.32}/helpers/data/package.json +0 -0
  251. /package/framework/{v0.6.31 → v0.6.32}/helpers/data/src/main.js +0 -0
  252. /package/framework/{v0.6.31 → v0.6.32}/helpers/dateFormat.js +0 -0
  253. /package/framework/{v0.6.31 → v0.6.32}/helpers/index.js +0 -0
  254. /package/framework/{v0.6.31 → v0.6.32}/helpers/json/LICENSE +0 -0
  255. /package/framework/{v0.6.31 → v0.6.32}/helpers/json/README.md +0 -0
  256. /package/framework/{v0.6.31 → v0.6.32}/helpers/json/package.json +0 -0
  257. /package/framework/{v0.6.31 → v0.6.32}/helpers/path.js +0 -0
  258. /package/framework/{v0.6.31 → v0.6.32}/helpers/plugins/README.md +0 -0
  259. /package/framework/{v0.6.31 → v0.6.32}/helpers/plugins/package.json +0 -0
  260. /package/framework/{v0.6.31 → v0.6.32}/helpers/plugins/src/api-error.js +0 -0
  261. /package/framework/{v0.6.31 → v0.6.32}/helpers/plugins/src/main.js +0 -0
  262. /package/framework/{v0.6.31 → v0.6.32}/helpers/prototypes.js +0 -0
  263. /package/framework/{v0.6.31 → v0.6.32}/helpers/task.js +0 -0
  264. /package/framework/{v0.6.31 → v0.6.32}/helpers/text.js +0 -0
  265. /package/framework/{v0.6.31 → v0.6.32}/lib/admin/package.json +0 -0
  266. /package/framework/{v0.6.31 → v0.6.32}/lib/admin/src/main.js +0 -0
  267. /package/framework/{v0.6.31 → v0.6.32}/lib/archiver/README.md +0 -0
  268. /package/framework/{v0.6.31 → v0.6.32}/lib/archiver/build.json +0 -0
  269. /package/framework/{v0.6.31 → v0.6.32}/lib/archiver/package.json +0 -0
  270. /package/framework/{v0.6.31 → v0.6.32}/lib/archiver/src/dep/jszip.min.js +0 -0
  271. /package/framework/{v0.6.31 → v0.6.32}/lib/archiver/src/main.js +0 -0
  272. /package/framework/{v0.6.31 → v0.6.32}/lib/async/package.json +0 -0
  273. /package/framework/{v0.6.31 → v0.6.32}/lib/async/src/main.js +0 -0
  274. /package/framework/{v0.6.31 → v0.6.32}/lib/audit/package.json +0 -0
  275. /package/framework/{v0.6.31 → v0.6.32}/lib/audit/src/main.js +0 -0
  276. /package/framework/{v0.6.31 → v0.6.32}/lib/audit-store.js +0 -0
  277. /package/framework/{v0.6.31 → v0.6.32}/lib/authn/package.json +0 -0
  278. /package/framework/{v0.6.31 → v0.6.32}/lib/authn/src/lockout.js +0 -0
  279. /package/framework/{v0.6.31 → v0.6.32}/lib/authn/src/main.js +0 -0
  280. /package/framework/{v0.6.31 → v0.6.32}/lib/authn/src/totp.js +0 -0
  281. /package/framework/{v0.6.31 → v0.6.32}/lib/authz-gate/package.json +0 -0
  282. /package/framework/{v0.6.31 → v0.6.32}/lib/authz-gate/src/main.js +0 -0
  283. /package/framework/{v0.6.31 → v0.6.32}/lib/cache/README.md +0 -0
  284. /package/framework/{v0.6.31 → v0.6.32}/lib/cache/build.json +0 -0
  285. /package/framework/{v0.6.31 → v0.6.32}/lib/cache/package.json +0 -0
  286. /package/framework/{v0.6.31 → v0.6.32}/lib/cache/src/main.js +0 -0
  287. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/aliases.json +0 -0
  288. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/audit/arguments.json +0 -0
  289. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/audit/help.txt +0 -0
  290. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/audit/verify.js +0 -0
  291. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/add.js +0 -0
  292. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/arguments.json +0 -0
  293. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/build.js +0 -0
  294. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/copy.js +0 -0
  295. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/cp.js +0 -0
  296. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/help.js +0 -0
  297. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/help.txt +0 -0
  298. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
  299. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/list.js +0 -0
  300. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/man.js +0 -0
  301. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/mcp-start.js +0 -0
  302. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/mcp.js +0 -0
  303. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/oas.js +0 -0
  304. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/openapi.js +0 -0
  305. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/remove.js +0 -0
  306. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/rename.js +0 -0
  307. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/restart.js +0 -0
  308. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/rm.js +0 -0
  309. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/start.js +0 -0
  310. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/status.js +0 -0
  311. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/stop.js +0 -0
  312. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/bundle/types.js +0 -0
  313. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/cache/arguments.json +0 -0
  314. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/cache/clear.js +0 -0
  315. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/cache/help.txt +0 -0
  316. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/cache/stats.js +0 -0
  317. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/connector/add.js +0 -0
  318. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/connector/arguments.json +0 -0
  319. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/connector/help.js +0 -0
  320. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/connector/help.txt +0 -0
  321. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/connector/infer.js +0 -0
  322. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/connector/list.js +0 -0
  323. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/connector/migrate.js +0 -0
  324. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/connector/models.js +0 -0
  325. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/connector/remove.js +0 -0
  326. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/connector/rm.js +0 -0
  327. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/connector/test.js +0 -0
  328. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/container/arguments.json +0 -0
  329. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/container/help.js +0 -0
  330. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/container/help.txt +0 -0
  331. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/container/man.js +0 -0
  332. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/container/ps.js +0 -0
  333. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/container/stop.js +0 -0
  334. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/controller/add.js +0 -0
  335. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/controller/arguments.json +0 -0
  336. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/controller/help.txt +0 -0
  337. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/controller/inc/args.js +0 -0
  338. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/controller/inc/namespace.js +0 -0
  339. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
  340. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/controller/inc/reference-scan.js +0 -0
  341. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/controller/inc/scaffold.js +0 -0
  342. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/controller/remove.js +0 -0
  343. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/controller/rename.js +0 -0
  344. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/controller/rm.js +0 -0
  345. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/env/add.js +0 -0
  346. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/env/get.js +0 -0
  347. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/env/help.js +0 -0
  348. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/env/help.txt +0 -0
  349. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/env/link-dev.js +0 -0
  350. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/env/list.js +0 -0
  351. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/env/remove.js +0 -0
  352. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/env/rm.js +0 -0
  353. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/env/set.js +0 -0
  354. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/env/unset.js +0 -0
  355. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/env/use.js +0 -0
  356. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/add.js +0 -0
  357. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/arguments.json +0 -0
  358. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/build.js +0 -0
  359. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/dot.js +0 -0
  360. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/get.js +0 -0
  361. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/help.js +0 -0
  362. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/help.txt +0 -0
  363. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/init.js +0 -0
  364. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/link-node-modules.js +0 -0
  365. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/link.js +0 -0
  366. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/list.js +0 -0
  367. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/man.js +0 -0
  368. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/msg.json +0 -0
  369. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/open.js +0 -0
  370. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/remove.js +0 -0
  371. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/reset.js +0 -0
  372. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/restart.js +0 -0
  373. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/set.js +0 -0
  374. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/start.js +0 -0
  375. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/status.js +0 -0
  376. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/stop.js +0 -0
  377. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/tail.js +0 -0
  378. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/update.js +0 -0
  379. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/framework/version.js +0 -0
  380. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/gina-dev.1.md +0 -0
  381. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/gina-framework.1.md +0 -0
  382. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/gina.1.md +0 -0
  383. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/helper.js +0 -0
  384. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/i18n/add.js +0 -0
  385. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/i18n/arguments.json +0 -0
  386. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/i18n/export.js +0 -0
  387. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/i18n/help.js +0 -0
  388. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/i18n/help.txt +0 -0
  389. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/i18n/import.js +0 -0
  390. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/i18n/scan.js +0 -0
  391. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/image/_host.js +0 -0
  392. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/image/arguments.json +0 -0
  393. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/image/build.js +0 -0
  394. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/image/help.js +0 -0
  395. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/image/help.txt +0 -0
  396. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/image/list.js +0 -0
  397. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/image/man.js +0 -0
  398. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/image/rm.js +0 -0
  399. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/image/run.js +0 -0
  400. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/index.js +0 -0
  401. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/inspector/help.js +0 -0
  402. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/inspector/help.txt +0 -0
  403. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/inspector/open.js +0 -0
  404. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/man-render.js +0 -0
  405. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/minion/arguments.json +0 -0
  406. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/minion/help.js +0 -0
  407. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/minion/help.txt +0 -0
  408. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/minion/kill.js +0 -0
  409. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/minion/list.js +0 -0
  410. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/msg.json +0 -0
  411. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/port/help.js +0 -0
  412. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/port/help.txt +0 -0
  413. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/port/inc/scan.js +0 -0
  414. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/port/list.js +0 -0
  415. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/port/reset.js +0 -0
  416. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/port/set.js +0 -0
  417. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/add.js +0 -0
  418. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/arguments.json +0 -0
  419. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/backup.js +0 -0
  420. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/build.js +0 -0
  421. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/help.js +0 -0
  422. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/help.txt +0 -0
  423. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/import.js +0 -0
  424. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/list.js +0 -0
  425. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/man.js +0 -0
  426. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/move.js +0 -0
  427. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/remove.js +0 -0
  428. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/rename.js +0 -0
  429. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/restart.js +0 -0
  430. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/restore.js +0 -0
  431. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/rm.js +0 -0
  432. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/start.js +0 -0
  433. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/status.js +0 -0
  434. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/project/stop.js +0 -0
  435. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/protocol/arguments.json +0 -0
  436. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/protocol/help.js +0 -0
  437. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/protocol/help.txt +0 -0
  438. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/protocol/list.js +0 -0
  439. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/protocol/remove.js +0 -0
  440. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/protocol/set.js +0 -0
  441. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/scope/add.js +0 -0
  442. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/scope/help.js +0 -0
  443. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/scope/help.txt +0 -0
  444. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/scope/link-local.js +0 -0
  445. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/scope/link-production.js +0 -0
  446. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/scope/list.js +0 -0
  447. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/scope/remove.js +0 -0
  448. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/scope/rm.js +0 -0
  449. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/scope/use.js +0 -0
  450. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/secrets/arguments.json +0 -0
  451. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/secrets/check.js +0 -0
  452. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/secrets/help.js +0 -0
  453. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/secrets/help.txt +0 -0
  454. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/secrets/scan.js +0 -0
  455. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/service/help.js +0 -0
  456. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/service/help.txt +0 -0
  457. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/service/list.js +0 -0
  458. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/service/man.js +0 -0
  459. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/service/start.js +0 -0
  460. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/storage/arguments.json +0 -0
  461. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/storage/gc.js +0 -0
  462. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/storage/help.txt +0 -0
  463. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/storage/stats.js +0 -0
  464. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/storage/verify.js +0 -0
  465. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd/view/add.js +0 -0
  466. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd-status-format/package.json +0 -0
  467. /package/framework/{v0.6.31 → v0.6.32}/lib/cmd-status-format/src/main.js +0 -0
  468. /package/framework/{v0.6.31 → v0.6.32}/lib/collection/README.md +0 -0
  469. /package/framework/{v0.6.31 → v0.6.32}/lib/collection/build.json +0 -0
  470. /package/framework/{v0.6.31 → v0.6.32}/lib/collection/package.json +0 -0
  471. /package/framework/{v0.6.31 → v0.6.32}/lib/collection/src/main.js +0 -0
  472. /package/framework/{v0.6.31 → v0.6.32}/lib/conf-view/package.json +0 -0
  473. /package/framework/{v0.6.31 → v0.6.32}/lib/conf-view/src/main.js +0 -0
  474. /package/framework/{v0.6.31 → v0.6.32}/lib/config.js +0 -0
  475. /package/framework/{v0.6.31 → v0.6.32}/lib/connector-config/package.json +0 -0
  476. /package/framework/{v0.6.31 → v0.6.32}/lib/connector-config/src/main.js +0 -0
  477. /package/framework/{v0.6.31 → v0.6.32}/lib/connector-error/package.json +0 -0
  478. /package/framework/{v0.6.31 → v0.6.32}/lib/connector-error/src/main.js +0 -0
  479. /package/framework/{v0.6.31 → v0.6.32}/lib/connector-registry/package.json +0 -0
  480. /package/framework/{v0.6.31 → v0.6.32}/lib/connector-registry/src/main.js +0 -0
  481. /package/framework/{v0.6.31 → v0.6.32}/lib/cron/README.md +0 -0
  482. /package/framework/{v0.6.31 → v0.6.32}/lib/cron/package.json +0 -0
  483. /package/framework/{v0.6.31 → v0.6.32}/lib/cron/src/main.js +0 -0
  484. /package/framework/{v0.6.31 → v0.6.32}/lib/domain/LICENSE +0 -0
  485. /package/framework/{v0.6.31 → v0.6.32}/lib/domain/README.md +0 -0
  486. /package/framework/{v0.6.31 → v0.6.32}/lib/domain/package.json +0 -0
  487. /package/framework/{v0.6.31 → v0.6.32}/lib/domain/src/main.js +0 -0
  488. /package/framework/{v0.6.31 → v0.6.32}/lib/dto/package.json +0 -0
  489. /package/framework/{v0.6.31 → v0.6.32}/lib/dto/src/main.js +0 -0
  490. /package/framework/{v0.6.31 → v0.6.32}/lib/dto-pipe/package.json +0 -0
  491. /package/framework/{v0.6.31 → v0.6.32}/lib/dto-pipe/src/main.js +0 -0
  492. /package/framework/{v0.6.31 → v0.6.32}/lib/dto-types/package.json +0 -0
  493. /package/framework/{v0.6.31 → v0.6.32}/lib/dto-types/src/main.js +0 -0
  494. /package/framework/{v0.6.31 → v0.6.32}/lib/generator/index.js +0 -0
  495. /package/framework/{v0.6.31 → v0.6.32}/lib/i18n/package.json +0 -0
  496. /package/framework/{v0.6.31 → v0.6.32}/lib/i18n/src/main.js +0 -0
  497. /package/framework/{v0.6.31 → v0.6.32}/lib/idempotency/package.json +0 -0
  498. /package/framework/{v0.6.31 → v0.6.32}/lib/idempotency/src/main.js +0 -0
  499. /package/framework/{v0.6.31 → v0.6.32}/lib/image-build/package.json +0 -0
  500. /package/framework/{v0.6.31 → v0.6.32}/lib/image-build/src/main.js +0 -0
  501. /package/framework/{v0.6.31 → v0.6.32}/lib/inherits/LICENSE +0 -0
  502. /package/framework/{v0.6.31 → v0.6.32}/lib/inherits/README.md +0 -0
  503. /package/framework/{v0.6.31 → v0.6.32}/lib/inherits/package.json +0 -0
  504. /package/framework/{v0.6.31 → v0.6.32}/lib/inherits/src/main.js +0 -0
  505. /package/framework/{v0.6.31 → v0.6.32}/lib/inspector-events/package.json +0 -0
  506. /package/framework/{v0.6.31 → v0.6.32}/lib/inspector-events/src/main.js +0 -0
  507. /package/framework/{v0.6.31 → v0.6.32}/lib/inspector-redact/package.json +0 -0
  508. /package/framework/{v0.6.31 → v0.6.32}/lib/inspector-redact/src/main.js +0 -0
  509. /package/framework/{v0.6.31 → v0.6.32}/lib/instrument/package.json +0 -0
  510. /package/framework/{v0.6.31 → v0.6.32}/lib/instrument/src/main.js +0 -0
  511. /package/framework/{v0.6.31 → v0.6.32}/lib/job/package.json +0 -0
  512. /package/framework/{v0.6.31 → v0.6.32}/lib/job/src/main.js +0 -0
  513. /package/framework/{v0.6.31 → v0.6.32}/lib/job-store.js +0 -0
  514. /package/framework/{v0.6.31 → v0.6.32}/lib/json-config-header/package.json +0 -0
  515. /package/framework/{v0.6.31 → v0.6.32}/lib/json-config-header/src/main.js +0 -0
  516. /package/framework/{v0.6.31 → v0.6.32}/lib/kv/package.json +0 -0
  517. /package/framework/{v0.6.31 → v0.6.32}/lib/kv/src/main.js +0 -0
  518. /package/framework/{v0.6.31 → v0.6.32}/lib/kv-store.js +0 -0
  519. /package/framework/{v0.6.31 → v0.6.32}/lib/loading-state/package.json +0 -0
  520. /package/framework/{v0.6.31 → v0.6.32}/lib/loading-state/src/main.js +0 -0
  521. /package/framework/{v0.6.31 → v0.6.32}/lib/logger/README.md +0 -0
  522. /package/framework/{v0.6.31 → v0.6.32}/lib/logger/package.json +0 -0
  523. /package/framework/{v0.6.31 → v0.6.32}/lib/logger/src/containers/default/index.js +0 -0
  524. /package/framework/{v0.6.31 → v0.6.32}/lib/logger/src/containers/file/index.js +0 -0
  525. /package/framework/{v0.6.31 → v0.6.32}/lib/logger/src/containers/mq/index.js +0 -0
  526. /package/framework/{v0.6.31 → v0.6.32}/lib/logger/src/containers/mq/listener.js +0 -0
  527. /package/framework/{v0.6.31 → v0.6.32}/lib/logger/src/containers/mq/speaker.js +0 -0
  528. /package/framework/{v0.6.31 → v0.6.32}/lib/logger/src/helper.js +0 -0
  529. /package/framework/{v0.6.31 → v0.6.32}/lib/logger/src/main.js +0 -0
  530. /package/framework/{v0.6.31 → v0.6.32}/lib/logger/src/redact.js +0 -0
  531. /package/framework/{v0.6.31 → v0.6.32}/lib/maintenance/package.json +0 -0
  532. /package/framework/{v0.6.31 → v0.6.32}/lib/math/index.js +0 -0
  533. /package/framework/{v0.6.31 → v0.6.32}/lib/mcp-dispatch/package.json +0 -0
  534. /package/framework/{v0.6.31 → v0.6.32}/lib/mcp-dispatch/src/main.js +0 -0
  535. /package/framework/{v0.6.31 → v0.6.32}/lib/mcp-http/package.json +0 -0
  536. /package/framework/{v0.6.31 → v0.6.32}/lib/mcp-http/src/main.js +0 -0
  537. /package/framework/{v0.6.31 → v0.6.32}/lib/mcp-server/package.json +0 -0
  538. /package/framework/{v0.6.31 → v0.6.32}/lib/mcp-server/src/main.js +0 -0
  539. /package/framework/{v0.6.31 → v0.6.32}/lib/merge/README.md +0 -0
  540. /package/framework/{v0.6.31 → v0.6.32}/lib/merge/package.json +0 -0
  541. /package/framework/{v0.6.31 → v0.6.32}/lib/merge/src/main.js +0 -0
  542. /package/framework/{v0.6.31 → v0.6.32}/lib/message-validator/package.json +0 -0
  543. /package/framework/{v0.6.31 → v0.6.32}/lib/message-validator/src/main.js +0 -0
  544. /package/framework/{v0.6.31 → v0.6.32}/lib/metrics/package.json +0 -0
  545. /package/framework/{v0.6.31 → v0.6.32}/lib/metrics/src/main.js +0 -0
  546. /package/framework/{v0.6.31 → v0.6.32}/lib/money/package.json +0 -0
  547. /package/framework/{v0.6.31 → v0.6.32}/lib/money/src/main.js +0 -0
  548. /package/framework/{v0.6.31 → v0.6.32}/lib/multipart/package.json +0 -0
  549. /package/framework/{v0.6.31 → v0.6.32}/lib/multipart/src/main.js +0 -0
  550. /package/framework/{v0.6.31 → v0.6.32}/lib/net-locality/package.json +0 -0
  551. /package/framework/{v0.6.31 → v0.6.32}/lib/net-locality/src/main.js +0 -0
  552. /package/framework/{v0.6.31 → v0.6.32}/lib/nunjucks-filters/README.md +0 -0
  553. /package/framework/{v0.6.31 → v0.6.32}/lib/nunjucks-filters/package.json +0 -0
  554. /package/framework/{v0.6.31 → v0.6.32}/lib/nunjucks-filters/src/main.js +0 -0
  555. /package/framework/{v0.6.31 → v0.6.32}/lib/nunjucks-resolver/package.json +0 -0
  556. /package/framework/{v0.6.31 → v0.6.32}/lib/nunjucks-resolver/src/main.js +0 -0
  557. /package/framework/{v0.6.31 → v0.6.32}/lib/priority/package.json +0 -0
  558. /package/framework/{v0.6.31 → v0.6.32}/lib/priority/src/main.js +0 -0
  559. /package/framework/{v0.6.31 → v0.6.32}/lib/proc.js +0 -0
  560. /package/framework/{v0.6.31 → v0.6.32}/lib/push/package.json +0 -0
  561. /package/framework/{v0.6.31 → v0.6.32}/lib/push/src/main.js +0 -0
  562. /package/framework/{v0.6.31 → v0.6.32}/lib/rate-limit/package.json +0 -0
  563. /package/framework/{v0.6.31 → v0.6.32}/lib/rate-limit/src/main.js +0 -0
  564. /package/framework/{v0.6.31 → v0.6.32}/lib/release-watch/package.json +0 -0
  565. /package/framework/{v0.6.31 → v0.6.32}/lib/release-watch/src/main.js +0 -0
  566. /package/framework/{v0.6.31 → v0.6.32}/lib/render-cache/package.json +0 -0
  567. /package/framework/{v0.6.31 → v0.6.32}/lib/render-cache/src/main.js +0 -0
  568. /package/framework/{v0.6.31 → v0.6.32}/lib/render-cache-store.js +0 -0
  569. /package/framework/{v0.6.31 → v0.6.32}/lib/routing/README.md +0 -0
  570. /package/framework/{v0.6.31 → v0.6.32}/lib/routing/build.json +0 -0
  571. /package/framework/{v0.6.31 → v0.6.32}/lib/routing/package.json +0 -0
  572. /package/framework/{v0.6.31 → v0.6.32}/lib/routing/src/main.js +0 -0
  573. /package/framework/{v0.6.31 → v0.6.32}/lib/routing/src/radix.js +0 -0
  574. /package/framework/{v0.6.31 → v0.6.32}/lib/routing-introspect/package.json +0 -0
  575. /package/framework/{v0.6.31 → v0.6.32}/lib/routing-introspect/src/main.js +0 -0
  576. /package/framework/{v0.6.31 → v0.6.32}/lib/secrets/package.json +0 -0
  577. /package/framework/{v0.6.31 → v0.6.32}/lib/secrets/src/backends/env.js +0 -0
  578. /package/framework/{v0.6.31 → v0.6.32}/lib/secrets/src/backends/exec.js +0 -0
  579. /package/framework/{v0.6.31 → v0.6.32}/lib/secrets/src/backends/file.js +0 -0
  580. /package/framework/{v0.6.31 → v0.6.32}/lib/secrets/src/declaration.js +0 -0
  581. /package/framework/{v0.6.31 → v0.6.32}/lib/secrets/src/env-file.js +0 -0
  582. /package/framework/{v0.6.31 → v0.6.32}/lib/secrets/src/main.js +0 -0
  583. /package/framework/{v0.6.31 → v0.6.32}/lib/secrets/src/sources.js +0 -0
  584. /package/framework/{v0.6.31 → v0.6.32}/lib/security-headers-emitter/package.json +0 -0
  585. /package/framework/{v0.6.31 → v0.6.32}/lib/security-headers-emitter/src/main.js +0 -0
  586. /package/framework/{v0.6.31 → v0.6.32}/lib/session-store.js +0 -0
  587. /package/framework/{v0.6.31 → v0.6.32}/lib/shell.js +0 -0
  588. /package/framework/{v0.6.31 → v0.6.32}/lib/sqlite-driver.js +0 -0
  589. /package/framework/{v0.6.31 → v0.6.32}/lib/sri/package.json +0 -0
  590. /package/framework/{v0.6.31 → v0.6.32}/lib/sri/src/main.js +0 -0
  591. /package/framework/{v0.6.31 → v0.6.32}/lib/state.js +0 -0
  592. /package/framework/{v0.6.31 → v0.6.32}/lib/storage/package.json +0 -0
  593. /package/framework/{v0.6.31 → v0.6.32}/lib/storage/src/local-cas.js +0 -0
  594. /package/framework/{v0.6.31 → v0.6.32}/lib/storage/src/local-stream.js +0 -0
  595. /package/framework/{v0.6.31 → v0.6.32}/lib/storage/src/local.js +0 -0
  596. /package/framework/{v0.6.31 → v0.6.32}/lib/storage/src/main.js +0 -0
  597. /package/framework/{v0.6.31 → v0.6.32}/lib/storage/src/s3.js +0 -0
  598. /package/framework/{v0.6.31 → v0.6.32}/lib/storage-store.js +0 -0
  599. /package/framework/{v0.6.31 → v0.6.32}/lib/swig-filters/README.md +0 -0
  600. /package/framework/{v0.6.31 → v0.6.32}/lib/swig-filters/package.json +0 -0
  601. /package/framework/{v0.6.31 → v0.6.32}/lib/swig-filters/src/main.js +0 -0
  602. /package/framework/{v0.6.31 → v0.6.32}/lib/swig-resolver/package.json +0 -0
  603. /package/framework/{v0.6.31 → v0.6.32}/lib/swig-resolver/src/main.js +0 -0
  604. /package/framework/{v0.6.31 → v0.6.32}/lib/template-loaders/package.json +0 -0
  605. /package/framework/{v0.6.31 → v0.6.32}/lib/template-loaders/src/loaders/http.js +0 -0
  606. /package/framework/{v0.6.31 → v0.6.32}/lib/template-loaders/src/loaders/memory.js +0 -0
  607. /package/framework/{v0.6.31 → v0.6.32}/lib/template-loaders/src/main.js +0 -0
  608. /package/framework/{v0.6.31 → v0.6.32}/lib/url/README.md +0 -0
  609. /package/framework/{v0.6.31 → v0.6.32}/lib/url/index.js +0 -0
  610. /package/framework/{v0.6.31 → v0.6.32}/lib/url/routing.json +0 -0
  611. /package/framework/{v0.6.31 → v0.6.32}/lib/uuid/package.json +0 -0
  612. /package/framework/{v0.6.31 → v0.6.32}/lib/uuid/src/main.js +0 -0
  613. /package/framework/{v0.6.31 → v0.6.32}/lib/validator.js +0 -0
  614. /package/framework/{v0.6.31 → v0.6.32}/lib/watcher/package.json +0 -0
  615. /package/framework/{v0.6.31 → v0.6.32}/lib/watcher/src/main.js +0 -0
  616. /package/framework/{v0.6.31 → v0.6.32}/lib/ws-framing/package.json +0 -0
  617. /package/framework/{v0.6.31 → v0.6.32}/lib/ws-framing/src/main.js +0 -0
  618. /package/framework/{v0.6.31 → v0.6.32}/lib/ws-query/package.json +0 -0
  619. /package/framework/{v0.6.31 → v0.6.32}/lib/ws-query/src/main.js +0 -0
  620. /package/framework/{v0.6.31 → v0.6.32}/lib/ws-session/package.json +0 -0
  621. /package/framework/{v0.6.31 → v0.6.32}/lib/ws-session/src/main.js +0 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,47 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
6
6
  and is generated by [Changie](https://github.com/miniscruff/changie).
7
7
 
8
8
 
9
+ ## 0.6.32 - 2026-09-22
10
+ ### Added
11
+ * Added a commit-msg git hook that keeps local-tool configuration paths and AI-attribution mentions out of commit messages. The existing pre-commit hook scans staged content, but no hook ever received the message itself, so the message was the one unguarded surface; 13 messages on the public branches had picked up such a mention since 2026-05. It shares the pre-commit leak and exception patterns byte-for-byte, pinned by a test so the pair cannot drift, and adds a message-only pattern for the prose forms the content scan does not need to match. Vendor identifiers the AI connector depends on - protocol schemes, SDK package names, canonical env-var names, and the provider key itself - remain allowed. Fails open, and git commit --no-verify still bypasses it. Contributor clones pick the hook up through the core.hooksPath that post_install already installs.
12
+ * The maintenance status payload (`GET`/`POST /_gina/maintenance`, both engines) now carries `pid` and `hostname` — the process that answered, and under Kubernetes the pod name. The runtime override was always per process: it lives in the memory of the process that received the `POST` and — unless the replica sync below (`server.maintenance.store`) is configured — is neither written nor broadcast, and a replica that restarts returns to its configured state. That contract is now stated on the guide, the schema and `llms.txt`, and the two fields let an operator fanning a `POST` out over replicas read back which ones applied it; `enabled: true` in configuration remains the durable, deployment-wide form
13
+ * Maintenance mode can now be turned on from the environment: a bundle started with `GINA_MAINTENANCE=1` (or `true`) boots with its maintenance gate closed, exactly as if `settings.json > server.maintenance.enabled` were `true` — for replacement pods created during a window, or any process that must come up closed without a configuration edit. The variable can only close a bundle, never open one: `0`, `false` or an unset value leave the configured state in place, and any other value is ignored with a boot warning naming the accepted values. The runtime toggle keeps its meaning — `POST /_gina/maintenance {"enable":false}` still reopens the process — and `GET /_gina/maintenance` reports `source: "env"` for a closure that came from the variable. Honoured under both launchers (`gina bundle:start` and `gina-container`); under the daemon the variable must be present in the environment of the process that started the daemon (a pod init script), because a warm daemon passes only its launch-time environment to the bundles it spawns.
14
+ * Maintenance mode can now stay coherent across the replicas of one deployment. Point `server.maintenance.store` at a declared kv namespace (redis-backed for replicas on different hosts, sqlite-backed for processes on one host) and every `POST /_gina/maintenance` writes its runtime override there, while each process polls it (`pollInterval`, default 2000 ms, an unref-ed timer) — so one POST anywhere closes or reopens every replica within one interval, and a replica joining mid-window follows the shared state within one store round-trip. The gate itself keeps reading local memory synchronously. A store outage freezes each replica in its last-known state and never reopens a closed site; a `ttlSeconds` window expires deployment-wide through the record TTL; an `enable:false` is written, not deleted, so it wins over a configured `enabled: true` on every replica exactly as it does locally. A namespace the kv primitive cannot hand out, or one running `failMode: "open"`, refuses the boot with a message naming the fix; a memory-backed namespace runs with a boot warning that replicas will not follow each other. `GET /_gina/maintenance` gains a `sync` field (`store`, `key`, `lastSyncAt`, `lastError`) and a `POST` reply carries `store: {written, error}` — a write that fails still applies locally and answers 200 with `written: false`. Without `store` nothing changes.
15
+ * A form can swap its `text/html` XHR answer into any element of the page, htmx-style, with three attributes on the `<form>`: `data-gina-form-target` (the `hx-target` grammar - `this`, `closest <selector>`, `find <selector>`, or a CSS selector; `next`/`previous` reserved), `data-gina-form-swap` (`innerHTML` by default, `outerHTML`, `textContent`, `beforebegin`, `afterbegin`, `beforeend`, `afterend`, `delete`, `none`) and `data-gina-form-select` (a CSS selector picking the part of the answer to swap, every match). The target is resolved at submit, from the form, and a target or strategy that cannot be honoured refuses the submit before anything is sent (`error` callback with `{ status: 422, reason: 'targetError' }`). The success payload keeps `contentType`/`content`/`status` and adds `data`/`view` (the action's data when the answer carries the dev-mode hidden inputs, `null` otherwise), `target`, `swap` and `swapped`. Two events on the form for the main swap: `beforeswap` (cancelable with `preventDefault()`; `detail.content` may be rewritten) and `afterswap` (after the region is bound; declarative hook `data-gina-form-event-on-swap`). The swapped region is bound through the shared `bindRegion()` policy: src scripts the document does not have are re-created once, forms that opt in are bound, `data-gina-link` anchors too; a swap that replaces the submitting form binds its replacement after the `success` callback. A declared target wins over the popin the form is in; absent, a form inside a popin keeps loading its answer into that popin (https://github.com/gina-io/gina/issues/76)
16
+ * `lib.duration.parse()` — the framework's one parser for unit-suffixed duration strings (`"500ms"`, `"30s"`, `"15m"`, `"3h"`, `"15d"`; the unit is required, a bare number is refused with `NaN`, `"0s"` is legal). It is the parser `lib/storage` already used for its interval keys, promoted to a registry entry so every configuration key that names a span of time shares one dialect; storage delegates to it and its behaviour is unchanged.
17
+ * Per-bundle login session cookie lifetimes, declared in a bundle's `security.json`. `session.expires` sets the cookie lifetime applied at `req.login()` for an ordinary login and `session.remember` the lifetime for a login that asked to be remembered — both unit-suffixed duration strings (`"15m"`, `"3h"`, `"15d"`; the unit is required). A login counts as remembered when the caller passes `{ remember: true }` to `req.login()`, or when the login request carries a truthy `remember` field (`on`, `1`, `true`, `yes`); an explicit option always wins over the request field. Both keys are optional and a bundle that declares neither behaves exactly as before. These two keys were documented but interpreted by nothing until now, so a value already sitting in one may not be a duration string: such a value is reported at boot naming the bundle, environment and key, and then ignored — the bundle keeps the cookie lifetime it already had and the boot is never refused. Everything that governed a session before still does: an application setting `req.session.cookie.maxAge` in its own login callback still wins, an absolute session timeout still caps the total lifetime, and a session store's `ttl` still governs the server-side record independently of the cookie. Declared in the published `security.json` schema.
18
+ * A form's `text/html` answer can update elements anywhere in the page, independently of where the answer itself goes: any element of the answer carrying `data-gina-swap-oob` is swapped into the page element with the same `id` (htmx's `hx-swap-oob`). `true` or an empty value replaces that element (`outerHTML`); a strategy name (`innerHTML`, `textContent`, `beforebegin`, `afterbegin`, `beforeend`, `afterend`, `delete`, `none`) applies the out-of-band element's CONTENT, the wrapper being dropped; `<strategy>:<selector>` is reserved. Out-of-band elements are always removed from the answer, whether or not they swapped, so the main fragment stays clean, and they run BEFORE `data-gina-form-select` narrows it, so an element outside the selection still lands; where both address the same element, the main swap wins. They are processed on all three answer paths - a declared `data-gina-form-target`, a form rendered inside a popin, and a form with neither - so an answer carrying nothing else still updates the page. A missing `id`, no matching page element, a reserved or unknown value: the element is dropped and reported with a `reason`, never thrown, and named in a dev-mode console notice. The success payload gains `oob` (one entry per element: `id`, `strategy`, `swapped`, and `reason` when it did not swap) and `remainder` (the answer without them - what a handler should insert, since `content` stays the raw answer and would land them twice); both are absent when the answer carried no out-of-band element. Two events per element: `oobbeforeswap` (cancelable with `preventDefault()`; `detail.content` may be rewritten) and `oobafterswap`, each carrying `oob: true` and `oobId`. A form inside a popin updates the page behind it this way, and when nothing but out-of-band elements was addressed the dialog keeps its own content rather than being blanked. An out-of-band swap that replaces the submitting form rebinds it after the `success` callback, as a main swap does. An element wrapped in a `<template>` is honoured, and a wrapper emptied of them is dropped with them. An answer with no `data-gina-swap-oob` anywhere takes exactly the path it did before (https://github.com/gina-io/gina/issues/76)
19
+ * A server can now have the last word on where a form's `text/html` answer goes and how: three response headers, read at settle once the answer is known to be HTML and before `beforeswap`, override the form's declared `data-gina-form-target` / `-swap` / `-select` — `X-Gina-Retarget` (the target grammar: `this`, `closest <selector>`, `find <selector>`, a CSS selector; it creates a target where none was declared, replaces a declared one, and wins over the popin a form sits in), `X-Gina-Reswap` (one of the nine strategies) and `X-Gina-Reselect` (a selector applied to the answer) — htmx's `HX-Retarget`, `HX-Reswap` and `HX-Reselect`. The invalid-value rule is asymmetric: a Retarget that cannot be resolved means no swap at all, not into the declared target and not into the popin, and the success callback still runs with `swapped: false` and `reason: 'retargetError'` (never an error callback: the request succeeded); an invalid Reswap or Reselect is ignored and the declared value kept, as is either one without any target. Every refused or ignored value is named in a dev-mode console notice, and the success payload gains an `overrides` key — present only when the answer carried at least one of the headers — with one `{ value, applied, reason }` entry per header; `beforeswap` receives the same object in its detail and keeps the last word. A JSON answer never reaches the read. The three headers are honoured only from a response whose origin is the page's own - the transport's `responseURL`, the URL after redirects, against `location.origin` - so a responder elsewhere may neither choose the element its answer lands in nor reshape or trim the swap the form declared: a cross-origin Retarget is refused exactly as an unresolvable one (no swap, `reason: 'crossOrigin'`), a cross-origin Reswap or Reselect is ignored and the declared value kept, and a transport that cannot say where the answer came from (no `responseURL`, or an opaque origin on either side) reads as not-same-origin. `Access-Control-Expose-Headers` therefore changes nothing for these three. htmx needs no such read because `selfRequestsOnly` refuses the cross-origin request itself; a form here posts to its raw `action`, so the gate lives at the read (https://github.com/gina-io/gina/issues/76)
20
+ ### Changed
21
+ * The popin context a request and its answer carry is decided by containment - the popin the submitting form is inside - instead of by whichever popin is open: (1) the `X-Gina-Popin-Id` / `X-Gina-Popin-Name` request headers, and therefore `self.isPopinContext()`, `Setup.isPopinContext` and a popin-style XHR redirect from `self.redirect()`, are now produced only for a form rendered inside a popin, not for a page form submitted while a popin happened to be open; (2) a plain `location` XHR redirect answering a page form navigates the page instead of being loaded into an open popin, and a name-less `location` redirect arriving after its popin was closed no longer reopens it; (3) `getActivePopin()` no longer returns a registered popin that is not open, so a no-argument `gina.popin.close()`, `destroy()` or `unbind()` during a popin's own click-time load window is a no-op, and with two popins open the most recently opened one is the active one rather than the first registered; (4) a name-less `popin: { close: true }` answer with nothing open to close is a no-op rather than a `422`. A page that deliberately fed a non-modal popin from a page form's answer sees the dev-mode notice and keeps that behaviour explicitly with `data-gina-form-target` pointing at the dialog, or by rendering the form inside the popin (https://github.com/gina-io/gina/issues/76)
22
+ * Fragment navigation (`gina/nav`) binds the swapped region through the same policy the validator now uses for form-answer swaps, the shared `bindRegion()` helper (utils/dom): the fragment's src-bearing scripts the document does not already have are re-created once, `data-gina-link` anchors are bound through the live link plugin, and forms are bound ONLY when they opt in (#B549: a `data-gina-form-*` attribute, an id naming a registered rule, or a `gina-upload-*` id). A bare id-bearing form inside a navigated fragment was bound regardless, and its submit silently became an XHR - the pre-#B549 bind-everything shape re-entering through swapped content (measured on the real bundle: bound and posted over XHR after a swap, left alone on the initial page). Such a form now keeps its native submit; add `data-gina-form-rule` or any `data-gina-form-*` attribute to opt it in. The validator publishes the gate as `gina.validator.bindRegion($root)` (https://github.com/gina-io/gina/issues/76)
23
+ * Two forms whose answers land in the same region no longer race. A form already declares, at submit time, where its answer goes and what it does when it gets there, and that is the whole of what the decision needs: when `data-gina-form-swap` REPLACES the region the form targets - `innerHTML` (the default), `outerHTML`, `textContent` or `delete` - a newer submit into the same target SUPERSEDES the request still in flight, whose answer was about to be overwritten anyway; when the swap ADDS to the region (`beforebegin`, `afterbegin`, `beforeend`, `afterend`) or writes nothing (`none`), there is no conflict to resolve and both land, exactly as before. Nothing is declared for any of this. The key is the RESOLVED swap target, which is what makes two DIFFERENT forms coordinate at all - a form-keyed guard never sees them - and a form declaring no `data-gina-form-target` is untouched, the module-wide `withRateLimit` rule still governing it and its own re-submits. BEHAVIOUR CHANGE, in exactly one shape: two or more forms targeting one element with a replacing swap, where both answers used to arrive and the older one is now aborted. Declare `data-gina-form-sync="queue"` on the later form to serialise them instead, or an insertion swap if what was wanted was both. `data-gina-form-sync` on the form overrides the derived decision where it is wrong - `replace`, `drop` or `queue` (one submit waits per region, the most recent) - and when declared it owns that form's decision, the module-wide `withRateLimit` option yielding to it so `replace` and `queue` are reachable without changing a global. Three htmx `hx-sync` spellings are REFUSED rather than parsed, each with a message naming the reason and the alternative: `abort` (its disposable-GET idiom, where a form submit is a validated POST with side effects - use `replace` or `drop`), the `queue first|last|all` modifiers (htmx has them because its trigger spec has `queue:` modifiers of its own; there is no trigger spec here, and one submit waiting per region is the only thing that region can act on), and `<selector>:<strategy>` (it names the element to coordinate on, which is already known - the resolved swap target). A superseded request releases everything it held - its trigger, its loading state, its a11y state - and then stops: it fires a new `abort` event on the form, `{ status: 0, reason: 'superseded', sync, derived }`, and never reaches the `error` channel, so the 408 an aborted transport would otherwise look like is not raised and `data-gina-form-event-on-submit-error` never sees it. Superseding cancels the client's WAIT, not the server's WORK: a superseded request was already in flight, so it may have reached the server, and if it did its writes stand - a page must never read `abort` / `superseded` as 'not saved' and resubmit, which would be a duplicate write. `derived` says whether the rule was read from the swap strategy or declared on the form, because the default needs no attribute and a page seeing the event may find nothing in its own markup that asked for it. The loading state follows the same logic: a submit turned away by `drop` releases the `data-gina-loading` its own click armed, since it will never reach a settle that could; a queued submit keeps it, being pending rather than abandoned. `data-gina-form-disabled-elt` holds elements disabled for the life of a request: a comma-separated list in the `data-gina-form-target` grammar, resolved before the request is opened and released at the one settle that covers success, error, abort and timeout alike. Each element is refcounted, so two overlapping requests naming the same element release it once, and marked `data-gina-disabled-by` with the form id; an element the page had already disabled is left alone and never cleared by us. An unreadable `sync` value or a part of `disabled-elt` that resolves to nothing refuses the submit before anything is sent - the same pre-send refusal a bad `data-gina-form-target` gets, `{ status: 422, reason: 'targetError' }` with `attribute` naming which one - deliberately louder than htmx, which skips an unmatched `hx-disabled-elt` silently (https://github.com/gina-io/gina/issues/76)
24
+ ### Fixed
25
+ * The client validator boot scan now binds only the forms a page opted in - a data-gina-form-* attribute, an id naming a registered rule, or a virtual gina-upload-* id - and leaves any other form untouched, as the forms guide states. Before, declaring a single rule file made every form on every page an always-XHR submit, plain login and signup forms included, which expected a native POST (#B549). Behaviour change: a form that was bound implicitly now submits natively unless it carries a data-gina-form-* attribute or matches a rule; explicit validateFormById() and getFormById() calls are unchanged.
26
+ * Two connectors in one bundle no longer fight over an entity class name. The framework registers each entity's singleton in a process-wide table that was keyed on the bare class name, which is only unique within one model - so when two connectors of a bundle produced a class of the same name (guaranteed when they share a `database`, and equally possible across two databases that each carry a `user.js`), the one whose connection became ready SECOND was handed the first one's instance and never attached its own entities. Its `getModel()` returned a bare `{ _connection, getConnection }`, and because the bundle still started and served, every call on the missing entity failed later at request time. Which connector lost depended on connection timing, so it differed between replicas of the same release, and a dev boot could not reproduce it at all. The table is now keyed per bundle, model and class name. As a safety net, a bundle whose declared entity did not reach its model now names the class and refuses to start instead of serving a half-built model layer (#B555).
27
+ * A date field no longer submits the previous day for users east of UTC. `isDate` normalised the payload the way every validator does, but it wrote a `Date` OBJECT into it — and a `Date` is the one normalised type that does not round-trip through JSON: `JSON.stringify` renders it via `toISOString()`, which yields a UTC instant. Local midnight in any positive UTC offset is the previous day in UTC, so a user in Paris who picked `2026-09-18` submitted `2026-09-17T22:00:00.000Z`, and anything reading the date part of that string stored the 17th. It was silent because the instant was well-formed, and invisible to servers and CI running in UTC. The field now keeps the parsed `Date` — so `field.isDate(mask).format(...)` chaining is unchanged — while the submitted payload takes a plain `yyyy-mm-dd` string, always, whatever the input mask: the mask governs how input is PARSED, and gina already published these fields as `{type: "string", format: "date"}` in both its routing introspection and its DTO type emission, so the payload now matches the schema it was already advertising. BREAKING for anything that consumed the old shape: `req.body.<field>` is a string rather than a `Date`, and `new Date(payload)` on a date-only string resolves to UTC midnight rather than local midnight (#B558).
28
+ * `self.throwError()` now answers the request when it is called with a falsy value. The one-argument form passes the caller's own payload in the slot that the two- and three-argument forms use for the response, and the guard that protects it from running against an already-released response tested only that slot for truthiness. So `self.throwError(err)` where `err` was an empty string, `null`, `undefined`, `0` or `false` was mistaken for a call arriving after the response had gone: nothing was written, the request was never answered, and the only trace was a warning stating that the response had been released - which it had not - followed by no error text at all, because that message reads the status and message arguments and never the payload. Such a call now renders a 500 like any other. Genuine late calls, and calls made with no arguments, still bail exactly as before (#B560).
29
+ * An XHR redirect over HTTP/2 now delivers the session cookie it just rotated (#B550). `redirect()`'s XHR and popin exits answered through the raw HTTP/2 stream, which calls neither `res.writeHead` nor `res.end` — so a session middleware that sets its cookie from an `on-headers` hook and persists from an `end` proxy emitted neither, and a user signed in immediately before the redirect arrived unauthenticated, still presenting the session id that had just been replaced. Both exits now terminate through the compat response, as the sibling 303 exit always did. The router's one-shot `inheritedData` consume likewise persists itself instead of relying on that same save-on-end proxy, so a redirect that carried a credential-bearing body no longer leaves it in the stored session record for the rest of the session. HTTP/1.1 was never affected on either engine. The ordinary render path — a `rolling` cookie that did not roll, and session mutations dropped during a render — is addressed by #B562 in this same release.
30
+ * On HTTP/2, a `rolling` session cookie now rolls on an ordinary rendered response, and a session mutation made while rendering is persisted (#B562). The render delegates answer on the raw HTTP/2 stream, which calls neither `res.writeHead` nor `res.end`, so middleware that installs itself by wrapping those two methods — a session's `on-headers` cookie hook and its save-on-end proxy among them — was inert on every render: the cookie was never emitted, so a rolling expiry never rolled, and a mutation made during the render was silently dropped. A base `writeHead`/`write`/`end` is now installed on the response before the bundle middleware chain runs, so such middleware wraps it, and the six buffering render delegates hand their HTTP/2 send to that base `end` — which a session middleware invokes only once its store write has completed, so a response can no longer reach the client ahead of the record it depends on. The shim is transparent: a response that no delegate has claimed keeps its original methods, leaving redirects, statics and the built-in endpoints byte-identical. The framework-level error responder defers the same way, so an error answered over HTTP/2 now carries the session cookie it rotated and persists a mutation made while handling it. A base `_implicitHeader` is forced alongside the shim: an express plugin written against HTTP/1 calls it and `Http2ServerResponse` does not implement it, and while the router already forced it on the routed path, the middleware chain also terminates in the statics handler, so a statics-terminated request could otherwise reach a middleware-wrapped `end()` without it. The statics send sites stay on the raw stream deliberately: a static response runs no application code, so it has no session mutation to persist, and the one remaining difference is that a rolling session cookie does not have its idle timer refreshed by a static served over HTTP/2, where HTTP/1.1 does refresh it. `renderStream()` is deliberately unchanged — it writes chunk by chunk from an async iterable, and buffering it would alter SSE and Range responses. HTTP/1.1 was never affected on either engine.
31
+ * Fixed the storage metadata store running an application callback from inside its own try/catch. Seven methods - set, remove, acquireRef, releaseRef, listZeroRefs, removeIfZero and listKeys - invoked the callback inside the try that guards their SQLite statement, so an error thrown by the application was swallowed by the store, and the catch then invoked that same callback a second time with the application error presented as a store error. A caller that latches on first settle, as the content-addressed driver verify() does, treated the re-entry as a no-op and never completed, so the operation hung indefinitely instead of reporting. Callbacks now run after the try on every path, a genuine store error still arrives as fn(err), and get() already had the correct shape and is unchanged. (#B565)
32
+ * An HTML file served from a bundle's public directory over a dev boot no longer answers 500 when that bundle has no templates configuration (#B567). In dev the static handler injects the gina loader into an HTML static and read the bundle's `content.templates._common` block to do so; a bundle that never ran `view:add` — any API-only bundle — has no such block, so the read threw and the request answered 500 with a `TypeError`. The loader is now injected only when the bundle carries one; otherwise the page is served exactly as it is on disk, which is also what production always did. Pickup: a bundle restart; no rebuild.
33
+ * A JSON config carrying a `/**` docblock and, in a string value, a `/*` with no `*/` after it — a glob or certificate path such as `"…/ssl/*.example.pem"` — no longer hangs the bundle boot. The block-comment strip in `requireJSON` was a regular expression that backtracked about 2× per line (4× per CRLF line) following such a value, so a config with a glob path a few dozen lines from its bottom hung until the CLI start-wait killed the process, with nothing logged. The strip is now a linear, string-aware scan; a `/*` inside a quoted value is data and survives intact, where the regex also removed `/**/` out of glob values such as `"./lib/**/*"`. Everything else is unchanged: block comments are still stripped only when the file carries a docblock (#B568)
34
+ * A `preOpen: true` popin opened through the declarative `data-gina-dialog` trigger with the default (modeless) modal resolution now reaches `isOpen = true`. The loading shell is born modal, which sets the dialog element's `open` attribute to the empty string; `popinOpen` guarded its own open call with `getAttribute('open')`, which reads that empty string as absent, so on the modeless path it called `show()` on an already-modal dialog, the engine threw `InvalidStateError`, and the popin stayed visibly open while the framework recorded it closed - `close()` returned early, `getActivePopin()` ignored it, and a form inside it was routed as outside any popin. The guard now uses `hasAttribute('open')`, so both open calls are skipped for a shell-opened dialog; a modeless-declared popin that was pre-opened keeps the shell's modal presentation, as it did before (#B574)
35
+ * A form or link whose `text/html` answer is loaded into a popin now gets its DECLARED callback: `data-gina-form-event-on-submit-success` and `data-gina-link-event-on-success` are bound to the `.hform` / `.hlink` companion channels, and the popin branch of both XHR handlers returned after the bare `success.<id>` event, so a form inside a popin never saw its declared success callback run (only a programmatic `success.<id>` listener did). The companion now fires there too, with the parsed xhr-data as its payload, and `$form.eventData.success` is set as on every other path (#B571)
36
+ * A form's `text/html` XHR answer is now routed by the popin the SUBMITTING form is rendered in, resolved by containment at submit, never by "the active popin". A page form whose answer arrived while a popin was open had that popin's content replaced by the answer; arriving while a popin was still loading (reachable through a trigger opted out of preload, a programmatic load, or a click before the hover warm - not through a hovered default trigger) it raised a false `422` error callback, `Popin x is not open !`, after a successful server write; and with two popins open the answer landed in whichever open one had been registered first. The answer of a form that is not inside a popin is delivered to its own handler unchanged; a form inside a popin still loads its answer into that popin, and `popinLoadContent` now loads into the popin it is called on. `getActivePopin()` returns open popins only. In dev mode a console notice names the popin the former rule would have targeted (https://github.com/gina-io/gina/issues/76)
37
+ * A form or link whose `text/html` answer is loaded into a popin no longer raises a false `422` outside dev mode. The two hidden inputs the popin branch parsed (`gina-without-layout-xhr-data` / `-view`) are spliced by the server only when `NODE_ENV_IS_DEV` is true, so on any other boot the branch dereferenced an absent element, the error callback ran with a `TypeError` message after a successful server write, and the popin was never loaded. Both branches now go through one tolerant parse: the popin loads, the callback receives the parsed data in dev mode and an object carrying `status` otherwise (#B575)
38
+ * An `<name>.<env>.json` configuration overlay now wins on every key it declares. It was previously folded in before its base file and lost to it on any key both declared, so an environment-only key was added but an actual override was silently dropped — the opposite of what the reference pages have always described. Two consequences are observable and worth checking before upgrading: an overlay array now REPLACES the base array instead of being unioned into it, and a `null` in the overlay overrides the base value. Bundles with no overlay file are unaffected. This is the per-bundle configuration loader only; the `settings.*` template path is a separate mechanism and is unchanged.
39
+ * A `text/html` form answer whose top-level elements are table rows or cells no longer loses them. The answer was parsed as a whole document, so the HTML parser moved a top-level `<tr>` or `<td>` out of existence and a swap into a `<tbody>` wrote the cell text instead of the row, while a `data-gina-form-select` on `tr` matched nothing. The answer is now parsed as a fragment, so any element survives at the top level; a full-page answer drops its `<head>` rather than placing its `<title>` in the swap. Behaviour is byte-identical for answers that were already parsed correctly (#B578)
40
+ * A popin constructed with `preOpen: true` now treats the time between its loading shell showing and its content landing as an explicit state, `isLoading`, instead of a half-state nothing could name. Five things went wrong in that window: `loadContent()` on the popin threw `is not open !` for the whole round trip; `close()` returned without closing, so the shell could not be dismissed programmatically; a load that failed fired `error` and left the skeleton showing with nothing to dismiss it; a native Escape closed the dialog behind the plugin's back, and the content landing afterwards ran the real open and re-opened the dialog the user had just dismissed (measured on the published bundle); and the close-time teardown keyed on a class a dialog shell never carries. Now `loadContent()` on a loading popin injects into the dialog and completes the open, so `open` fires once, from that completion, and content still in flight lands afterwards as any later `loadContent()` would; `close()` and `destroy()` on a loading popin cancel the load (a transport still in flight is aborted, and a cancelled load fires no `error`), tear the shell down, release the trigger and fire `close`, so a dismissed dialog never comes back when its content arrives; the native `close` listener is bound when the shell shows, so an Escape during the load takes that same path; and a load that fails fires `error` first, so a listener that calls `loadContent()` keeps the dialog with its own content, then closes the shell if nothing handled it. A popin without `preOpen` shows nothing while it loads and never enters the state. Three visible changes: `loadContent()` no longer throws while the popin is loading, a loading popin closes, and a failed load closes its shell unless an `error` listener loaded content into it. `getActivePopin()` still returns open popins only, so a loading popin is not the active one (https://github.com/gina-io/gina/issues/76)
41
+ * Loading new content into a popin that is already open — `gina.popin.load(name, url)` on an open `data-gina-dialog` popin — no longer leaves the dialog empty. The landing wrote the new body and then fired the popin's `loaded` event with the popin object as its detail, the form of that event the legacy trigger's listener only binds on; the declarative trigger's listener applied the detail as if it were the body, and a body that is not a string is applied as nothing, so the content just written was wiped a moment later, with no error anywhere. That listener now applies nothing for a non-string detail, and the body written by the reload stays. Legacy `data-gina-popin-*` triggers were never affected. Present in every published version since 0.4.6, which introduced the declarative AJAX path (#B579)
42
+ * A malformed `data-gina-dialog-target` value no longer throws: `applyContent` guards the one read the selector engine can refuse, so a selector such as `#slot >` takes the documented fallback (a full replace of the dialog) instead of an uncaught `SyntaxError` inside the loaded-content and preload-consume handlers, which left the popin without its content and the open never fired (#B580). The partial swap's two silent fallbacks are now announced in dev mode, one `console.warn` per event naming the popin, the selector and which fallback ran: a selector matching nothing in the OPEN DIALOG falls back to a full replace (as documented), and a selector matching nothing in the ANSWER writes the whole answer body into the slot - the second fallback existed before but was undocumented. Production output is unchanged: the notices are gated on `gina.config.envIsDev`, and every fallback keeps the behaviour it had. The attribute keeps its plain-selector grammar on purpose: one selector runs on BOTH sides of the swap - it locates the slot in the dialog and the region in the answer - which makes it the dialog-scoped sibling of `data-gina-form-select`, not of `data-gina-form-target`; there is nothing to resolve relative to an element, so the `this` / `closest` / `find` grammar does not apply to it, and the four keywords are valid CSS that would silently match nothing anyway. Restart and re-bake (the browser bundle changed).
43
+ * A page form's staged upload is now placed with its own form. Which popin, if any, a chosen file belongs to is decided by containment - the popin the real form is inside, captured once at selection - never by "some popin is open" (#B572). Before, a file input in a page form whose file was chosen while an unrelated popin was open - through the file-picker race (a popin opening while the OS picker is already up) or a script assigning `input.files` - had its virtual `gina-upload-*` form appended inside that popin: the staging POST succeeded, none of the generated hidden metadata fields reached the form, the form then saved without the file, and the staging request carried that popin's `X-Gina-Popin-Id`. Nothing reported it. A form rendered inside a popin keeps the popin placement it always had. In dev mode the console now names the popin the former rule would have used. Restart and re-bake (the browser bundle changed).
44
+ ### Security
45
+ * The built-in error pages now HTML-escape every value they render. A crafted link to any route whose action redirects - carrying a query string such as `?error=<script>...` - made the fallback error page reflect that value as markup and execute it in your application's origin, in every scope and on every released version; a newly scaffolded bundle, which configures no `errorFiles`, hit exactly that page. The same escaping is applied to the engine-level error page (whose text is built from the request path by its 404, 403 and 500 callers) and to the three nunjucks error-document fallbacks. Behaviour change: an application that deliberately passed HTML in an error title or message now sees it escaped - that reflection was the vulnerability. The scope gate on stack traces is unchanged (#B554).
46
+ * `self.redirect()` no longer lets a request parameter decide whether the redirect happens. A key named `error` in the incoming query string or request body was read as an instruction to raise an error, so any unauthenticated request to any route whose action redirects could force a 500 by adding `?error=` - on both engines, with no route opt-in, and in every released version. An EMPTY value was worse: the empty string is falsy, so the late-call guard inside `throwError()` mistook it for a call on an already-released response, logged "ignoring late error:" with nothing after the colon and returned without writing anything, leaving the request unanswered for as long as the client held the connection - and nothing reaps that, because `server.timeout` defaults to 0 so that SSE and WebSocket responses are not cut off. The key is now an ordinary parameter: it rides the redirect in `inheritedData` like every other one, which is what the documented "carrying request data across the redirect" example always described - that example could not work as written while the gate stood (#B559).
47
+ * Credentials no longer ride a redirect. `self.redirect()` carries the request's parameters to the redirect target - on the session as `inheritedData`, or in the target URL when the bundle has no session - and for a `POST` that container is the parsed body verbatim, so a login form's plaintext password was carried with it. On the session that meant the password was written to the session store, where on an authenticated flow it survived the redirect target's own request; where the bundle has no session it meant the password appeared in the redirect URL, and so in access logs, proxy logs, browser history and any `Referer` the target sends onward. A rejected login attempt was carried the same way. Fields whose names match the framework's existing redaction list - the same maintained, tokenising matcher the Inspector uses to mask these values in its own pane, covering `password`, `secret`, `token`, `apikey`, `authorization`, `credentials` and their case and separator variants - are now dropped from what is carried, while everything else travels exactly as before; keys describing rules or configuration, such as `passwordRules`, are deliberately still carried. Behaviour change: an application that deliberately carried a field with one of those names across a redirect no longer receives it at the target and should pass it by another route (#B551).
48
+ * Over HTTP/2, a static file served by the built-in engine no longer carries another request's response headers (#B566). The first static request after boot registered a byte-serving listener on the server that kept that request's response object for the life of the process and served every later static through it, folding the captured response's headers — its `Set-Cookie`, its request id and its CORS headers among them — onto every other client's stream. Any middleware that sets a per-request header eagerly (the framework's own CSRF plugin does) turned that into a cross-user cookie delivery. The same listener served an HTML static it had not seen before as a raw binary, and once a directory URL had been requested it answered that directory's index URL with a destroyed stream for the rest of the process's life. The listener and its server-push branch are removed: every HTTP/2 static is now served by the static handler on the request's own response, so it carries that request's headers, the dev `cache-control: no-store` set and the production `ETag`/`Last-Modified` with `304` support that the listener path never emitted. HTTP/2 server push, which browsers no longer support and which only a push-capable client could reach, is no longer implemented. Every published version is affected. HTTP/1.1 was never affected. Pickup: a bundle restart; no rebuild.
49
+
9
50
  ## 0.6.31 - 2026-09-14
10
51
  ### Added
11
52
  * RFC 9218 request priorities (#H12): `req.priority` is parsed on both engines from the `Priority` header — urgency 0–7 (default 3) and the incremental flag, with out-of-range, wrong-type or malformed values ignored exactly as the RFC requires — `self.query()` and `self.forward()` propagate a present inbound priority to the target bundle (a caller-set `headers.priority` wins, `priority: false` suppresses, an explicit `priority` option is sent normalized), `self.setPriority()` emits the response header, and `self.startJob(fn, { urgency })` orders the async-job queue: the worker always starts the lowest-urgency queued job first, FIFO within a class, a retried attempt keeps its urgency, and the value is never inherited from the request — an action passes it explicitly. The header is advisory and client-supplied: the framework carries the signal, it never reorders response writes.
package/README.md CHANGED
@@ -25,9 +25,9 @@ MVC framework for Node.js and Bun with built-in HTTP/2, multi-bundle architectur
25
25
  | Connectors | Couchbase, MongoDB, ScyllaDB / Cassandra, MySQL, PostgreSQL, Redis, SQLite, AI (LLM) — loaded from project `node_modules` |
26
26
  | AI connector | Any LLM provider via named protocol (`anthropic://`, `openai://`, `ollama://`, …) — unified `.infer()`, token streaming via `.stream()`, inference-as-a-job via `self.inferAsync()` |
27
27
  | Template engine | [`@rhinostone/swig`](https://github.com/gina-io/swig) — maintained fork with CVE-2023-25345 patched; streaming SSE/chunked via `renderStream()`. Nunjucks supported as opt-in via `render.engine = "nunjucks"` or per-section `"ext": ".njk"` |
28
- | Forms & validation | One rule engine for client and server — live checks, cross-field rules, ARIA states, localised messages; the server enforces the same rules on submit |
28
+ | Forms & validation | One rule engine for client and server — live checks, cross-field rules, ARIA states, localised messages; the server enforces the same rules on submit. A form can swap its HTML answer into any element of the page, htmx-style (`data-gina-form-target` / `-swap` / `-select`), and update elements elsewhere out of band (`data-gina-swap-oob`); the server can retarget, reswap or reselect that answer with `X-Gina-Retarget` / `-Reswap` / `-Reselect` response headers. Two answers replacing the same region coordinate on their own — derived from the swap strategy, with no attribute to write — and `data-gina-form-sync` overrides that where it is wrong, while `data-gina-form-disabled-elt` holds controls disabled for the life of a request |
29
29
  | DTOs | `gina.dto` schema builder — request validation with localised 422s (`param.dto`), response shaping (`param.responseDto`), JSON Schema export |
30
- | Sessions | Hardened session plugin (SameSite / HttpOnly / Secure defaults) — Redis, SQLite, MongoDB, Couchbase, and ScyllaDB stores; session-id rotation on login, opt-in absolute timeout, record destroyed on logout |
30
+ | Sessions | Hardened session plugin (SameSite / HttpOnly / Secure defaults) — Redis, SQLite, MongoDB, Couchbase, and ScyllaDB stores; session-id rotation on login, per-bundle login and remember-me cookie lifetimes from `security.json`, opt-in absolute timeout, record destroyed on logout |
31
31
  | File uploads | Multipart via the maintained [`@rhinostone/busboy`](https://github.com/gina-io/busboy) fork — named upload groups with per-group extension allow-lists, size / count limits, and target dirs |
32
32
  | Object storage | `gina.storage()` — named drivers pairing an adapter (`local` filesystem, or `s3` for any S3-compatible provider with its SDK as a project-side dependency) with a key strategy behind opaque keys: `sharded` (dated), `cas` (content-addressed, deduplicating, refcounted, GC-swept) and `stream` (large media, resumable out-of-order segment uploads); size tiering, HTTP Range serving (`serveFromStorage()` — 206/416/304, strong key ETags), presigned-URL offload (307) on `s3`, embedded SQLite or Couchbase metadata store, `storage:stats` / `gc` / `verify` CLI |
33
33
  | Async jobs | `self.startJob()` background jobs — durable SQLite / MongoDB / Redis stores, retries with backoff, HMAC-signed completion webhooks, `/_gina/jobs/:id` status endpoint |
@@ -35,6 +35,7 @@ MVC framework for Node.js and Bun with built-in HTTP/2, multi-bundle architectur
35
35
  | Authentication | `lib.authn` primitives — scrypt password hashing as self-describing PHC strings (argon2 / bcrypt verify-only for migration), NIST SP 800-63B policy, enumeration-safe `dummyVerify`, PCI-DSS account lockout, RFC 6238 TOTP |
36
36
  | Route authorization | `requireAuth` / `roles` / `policy` per route or deny-by-default, login bounce with `resumeRequest()`, `self.hasRole()` |
37
37
  | Rate limiting | Opt-in identified-caller quotas at the router (#MS6) — fixed-window counters over the KV primitive (per-process, or replica-shared via redis/sqlite), per-route overrides/exemptions, 429 + `Retry-After` + draft `RateLimit` header fields; anonymous flood control stays at your edge by design |
38
+ | Maintenance mode | Opt-in `server.maintenance` (#MAINT1) — every request answered 503 + `Retry-After` before statics, cache and routing while `/_gina/*` stays reachable; topology-neutral bypass (`x-gina-maintenance-key` header, or a one-shot query grant minted into a signed cookie) plus a non-proxied IP allowlist; runtime toggle `POST /_gina/maintenance` with a dead-man `ttlSeconds`, `GINA_MAINTENANCE` to boot closed, and replica coherence through a shared KV namespace (`store`) |
38
39
  | Audit trail | Opt-in append-only JSONL audit log (`self.audit()`), authorization denials auto-recorded, always-on request ids; opt-in HMAC hash chain verified offline by `gina audit:verify` |
39
40
  | CSRF protection | Signed double-submit token middleware + Origin/Referer pre-filter + hardened session cookie |
40
41
  | Security headers | CSP with per-response nonces, HSTS, COOP / COEP / CORP, Referrer-Policy and the X-* family — per-header plugins or one `SecurityHeaders` wrapper |
@@ -52,7 +53,7 @@ MVC framework for Node.js and Bun with built-in HTTP/2, multi-bundle architectur
52
53
  | K8s ready | `gina-container`, `gina-init`, SIGTERM drain, JSON stdout logging |
53
54
  | Container tooling | `image:build` synthesizes an OCI image (buildah), `image:run` / `container:ps` / `container:stop` (podman) — local or over SSH |
54
55
  | Dependency injection | Mockable connectors and config for unit testing |
55
- | Runtime | Node.js 22–26, or **Bun** (`bun add -g gina`) — install + boot validated end-to-end by a CI Bun smoke |
56
+ | Runtime | Node.js 22–26, or **Bun** (`bun add -g gina`) — install + boot validated end-to-end by a CI Bun smoke, and the unit suite runs under `bun test` in CI behind an expected-failures gate |
56
57
 
57
58
  ## Quick start
58
59
 
@@ -66,32 +67,68 @@ open https://localhost:3100
66
67
 
67
68
  > **npm 12+** blocks install scripts by default, and gina's post-install bootstraps `~/.gina` and the framework dependencies. Install with `npm install -g gina@latest --allow-scripts=gina`, or allow it once for all global installs with `npm config set allow-scripts=gina --location=user`. (Not needed on npm ≤ 11.)
68
69
 
69
- ## What's in 0.6.31
70
+ ## What's in 0.6.32
70
71
 
71
- > **Restart your bundles *and* rebuild them.** The validator's shared rule
72
- > engine ships in the browser bundle and one of this release's security fixes
73
- > touches it, so `gina.min.js` changed and `gina bundle:restart` alone leaves
74
- > the old client running. Rebuild each consuming bundle, then restart.
72
+ > **Restart your bundles *and* rebuild them.** Seventeen of this release's
73
+ > commits are browser-bundled — the whole form-answer arc, the popin fixes and
74
+ > the validator changes — so `gina.min.js` changed and `gina bundle:restart`
75
+ > alone leaves the old client running. Rebuild each consuming bundle, then
76
+ > restart.
75
77
 
76
- > **No settings reset.** `0.6.31` is a patch — the `shortVersion` stays `0.6`,
78
+ > **No settings reset.** `0.6.32` is a patch — the `shortVersion` stays `0.6`,
77
79
  > so your `~/.gina/0.6/settings.json` is untouched. (`0.6.0` was the reset.)
78
80
 
79
- **The availability release.** Two security fixes lead: a request carrying a
80
- top-level field named `count` could terminate the bundle process —
81
- unauthenticated, one request, on any URL, in every published version — and a
82
- queued async job could run inside another request's context. Alongside them,
83
- RFC 9218 request priorities arrive on both engines, a Couchbase connector that
84
- cannot reach its cluster at boot now says so instead of hanging until the CLI
85
- kills the bundle, and one bundle without a release `config/` no longer moves
86
- every other bundle's configuration root. Full detail in
87
- [CHANGELOG.md](./CHANGELOG.md).
88
-
89
- - **Security — a request field named `count` no longer terminates the bundle (#B546).** gina installs a `count()` helper on `Object.prototype`, and the framework reached it as `<container>.count()` on containers whose keys the client chooses — the parsed body, the query bag, route params, uploaded files. An own property of that name shadowed the helper, so the framework called a string: a 500 on the body branches, an `uncaughtException` that exited the process on the query branches, and a request left hanging open on a route param. Every published version was affected. The framework now reaches the helper through a form no own property can shadow; application code calling `x.count()` is untouched.
90
- - **Security — a queued async job runs inside a detached copy of its creator's context (#B543).** The worker pumps its queue from the settle chain of the job that just finished, so under load a job created by one request ran inside the context of whichever request's job had freed the slot: a URL it built through `getRoute().toUrl()` used the other request's host, a failure it raised through the global `getConfig()` / `getLib()` was written to the other request's response, and its JSON log lines carried the other request's id. A job now captures the creating request's identity and proxy context — never `req`, `res` or `next` — and runs its whole lifecycle inside that copy.
91
- - **Added — RFC 9218 request priorities (#H12).** `req.priority` is parsed on both engines from the `Priority` header (urgency 0–7, the incremental flag; malformed values ignored as the RFC requires), `self.query()` and `self.forward()` propagate it to the target bundle, `self.setPriority()` emits the response header, and `self.startJob(fn, { urgency })` starts the lowest-urgency queued job first. The header is advisory: the framework carries the signal and never reorders response writes.
92
- - **Fixed — a Couchbase connector that cannot reach its cluster at boot fails loudly (#B541).** Every failure path in `connect()` re-armed a retry without ever emitting `ready`, so the model layer's ready gate never closed and `bundle:start` killed the bundle after roughly 64 seconds with nothing logged. `init()` now arms its own deadline (`readyTimeout` per `connectors.json` entry, default 50000 ms) and reports the failure itself; a single failed attempt also reports once rather than twice. Both SDK v3 and v4 connectors.
93
- - **Fixed — a bundle without a release `config/` no longer moves every other bundle's configuration root (#B542).** The source-tree fallback wrote that bundle's own directory into the process-wide `bundles` path and reassigned the shared loop variable, so a later, healthy bundle silently loaded its source config in production, or died on a spliced path. The fallback is now scoped to the bundle it recovers, the three config-directory refusals name the bundle and the environment, and an aborted initialisation reports its retained reason instead of an opaque `TypeError`.
94
- - **Fixed — two dead external references refreshed.** The X-Permitted-Cross-Domain-Policies plugin and the Couchbase connector each cited a page that no longer serves the document; both now point at the live copy. Documentation only.
81
+ **The form-answer release.** A form's HTML answer can now land anywhere in the
82
+ page — htmx-style `data-gina-form-target` / `-swap` / `-select`, out-of-band
83
+ elements, three server-side override headers — and two forms answering into one
84
+ region no longer race. Where a popin is involved, the answer is routed by the
85
+ popin the form is *inside*, never by whichever popin happens to be open, which
86
+ closes the routing defect behind
87
+ [gh#76](https://github.com/gina-io/gina/issues/76) and a run of popin edge cases
88
+ with it. Four security fixes lead the rest: credentials no longer ride a
89
+ redirect, the built-in error pages escape what they render, a request parameter
90
+ can no longer force an error or hang a request, and an HTTP/2 static no longer
91
+ carries another request's headers. Alongside: the HTTP/2 render path now runs a
92
+ session middleware's hooks, maintenance mode can be armed from the environment
93
+ and kept coherent across replicas, an environment config overlay wins over its
94
+ base file, and per-bundle login session lifetimes are read from `security.json`.
95
+ Full detail in [CHANGELOG.md](./CHANGELOG.md).
96
+
97
+ - **Security — credentials no longer ride a redirect (#B551).** `self.redirect()` carried the request's parameters to the target — the parsed body verbatim for a `POST`, so a login form's plaintext password was written to the session store, or placed in the redirect URL on a session-less bundle. Fields matching the framework's redaction list (`password`, `secret`, `token`, `apikey`, `authorization`, `credentials` and their case and separator variants) are now dropped from what is carried; everything else travels exactly as before.
98
+ - **Security — the built-in error pages escape every value they render (#B554).** A crafted link to any route whose action redirects — `?error=<script>…` — made the fallback error page reflect the value as markup and execute it in your application's origin, on every released version; a newly scaffolded bundle, which configures no `errorFiles`, hit exactly that page. The engine-level error page and the three nunjucks fallbacks are escaped the same way.
99
+ - **Security — a request parameter can no longer decide whether a redirect happens (#B559).** A key named `error` in the query string or body was read as an instruction to raise an error, so any unauthenticated request to any redirecting route could force a 500 — and an empty value left the request unanswered for as long as the client held the connection. The key is now an ordinary parameter and rides the redirect in `inheritedData`.
100
+ - **Security — an HTTP/2 static file no longer carries another request's response headers (#B566).** The first static request after boot registered a byte-serving listener that kept its response object for the life of the process and folded that response's headers — its `Set-Cookie` included — onto every later client's stream, served unseen HTML as raw binary, and answered a directory's index URL with a destroyed stream for the rest of the process's life. The listener and its server-push branch are removed; every HTTP/2 static is served on the request's own response, with the `ETag` / `304` support that path never emitted.
101
+ - **Added — a form can swap its HTML answer into any element of the page (gh#76).** Three attributes on the `<form>`: `data-gina-form-target` (the `hx-target` grammar), `data-gina-form-swap` (nine strategies, `innerHTML` by default) and `data-gina-form-select`; a target or strategy that cannot be honoured refuses the submit before anything is sent, and `beforeswap` / `afterswap` bracket the main swap. A declared target wins over the popin the form is in.
102
+ - **Added — an answer can update elements anywhere in the page, out of band (gh#76).** Any element of the answer carrying `data-gina-swap-oob` is swapped into the page element with the same `id` (htmx's `hx-swap-oob`), on all three answer paths; the success payload gains `oob` and `remainder`, and an answer without the attribute takes exactly the path it did before.
103
+ - **Added — a server can retarget, reswap or reselect a form's HTML answer (gh#76).** `X-Gina-Retarget`, `X-Gina-Reswap` and `X-Gina-Reselect` override the form's declared attributes at settle, and are honoured only from a response whose origin is the page's own; a Retarget that cannot be resolved means no swap at all, reported to the success callback with `swapped: false`, never an error.
104
+ - **Added — `GINA_MAINTENANCE` boots a bundle with maintenance mode on.** `GINA_MAINTENANCE=1` closes the gate at boot exactly as `server.maintenance.enabled: true` would — for replacement pods created during a window — and can only close a bundle, never open one; `GET /_gina/maintenance` reports `source: "env"` for such a closure.
105
+ - **Added — maintenance mode stays coherent across replicas through a shared kv namespace.** Point `server.maintenance.store` at a declared kv namespace and every `POST /_gina/maintenance` is written there and polled by each process (`pollInterval`, default 2000 ms); a store outage freezes each replica in its last-known state and never reopens a closed site.
106
+ - **Added — the maintenance status payload carries `pid` and `hostname`.** The runtime override was always per process; the two fields let an operator fanning a `POST` out over replicas read back which ones applied it, and that per-process contract is now stated on the guide, the schema and `llms.txt`.
107
+ - **Added — per-bundle login session lifetimes from `security.json`.** `session.expires` and `session.remember` — unit-suffixed duration strings — set the cookie lifetime `req.login()` applies for an ordinary and a remembered login. Both keys were documented but interpreted by nothing until now, so a value already there that is not a duration string is reported at boot and ignored, never fatal.
108
+ - **Added — `lib.duration.parse()`, one parser for unit-suffixed durations.** The parser `lib/storage` already used for its interval keys, promoted to a registry entry so every configuration key naming a span of time shares one dialect (`"500ms"`, `"30s"`, `"15m"`, `"3h"`, `"15d"`; the unit is required and a bare number is refused).
109
+ - **Added — a `commit-msg` git hook for contributor clones.** It keeps local-tool configuration paths and attribution mentions out of commit messages — the one surface no hook had scanned — and reaches a clone through the `core.hooksPath` that `post_install` already installs. Not part of the published package.
110
+ - **Changed — the popin context a request carries is decided by containment, not by "the active popin" (gh#76).** The `X-Gina-Popin-Id` / `-Name` headers, `self.isPopinContext()` and a popin-style XHR redirect are produced only for a form rendered inside a popin; a page form's `location` redirect navigates the page; `getActivePopin()` returns open popins only, the most recently opened first; a name-less `popin: { close: true }` with nothing open is a no-op.
111
+ - **Changed — two form answers replacing the same region no longer race (gh#76).** When a form's swap replaces its target, a newer submit into the same target supersedes the request still in flight (a new `abort` event with `reason: 'superseded'`, never the `error` channel); insertion swaps still both land. `data-gina-form-sync` (`replace`, `drop`, `queue`) overrides the derived decision and `data-gina-form-disabled-elt` holds elements disabled for the life of a request. Superseding cancels the client's wait, not the server's work — never read it as "not saved" and resubmit.
112
+ - **Changed — a navigated fragment's forms are bound only when they opt in (gh#76).** Fragment navigation binds the swapped region through the shared `bindRegion()` policy, so a bare id-bearing form inside a navigated fragment keeps its native submit unless it carries a `data-gina-form-*` attribute or an id naming a rule.
113
+ - **Fixed — a form's HTML answer is routed by the popin the submitting form is in (gh#76).** A page form's answer arriving while a popin was open replaced that popin's content; arriving while a popin was still loading it raised a false `422` after a successful server write; with two popins open it landed in whichever had been registered first. Containment at submit decides now, and `popinLoadContent` loads into the popin it is called on.
114
+ - **Fixed — a form or link answering into a popin runs its declared success callback (#B571).** The popin branch returned after the bare `success.<id>` event, so `data-gina-form-event-on-submit-success` and `data-gina-link-event-on-success` never ran there.
115
+ - **Fixed — a pre-opened popin's loading shell is a state you can close, load into, or lose to a failed load (gh#76).** `isLoading` covers the round trip between the shell showing and the content landing: `loadContent()` no longer throws, `close()` and `destroy()` cancel the load and tear the shell down, an Escape during the load takes that same path instead of a dialog that reopens when its content arrives, and a failed load closes the shell unless an `error` listener loaded content into it.
116
+ - **Fixed — a pre-opened popin opened modeless reaches its open state (#B574).** `popinOpen` guarded its open call with `getAttribute('open')`, which reads the shell's empty-string attribute as absent, so `show()` threw `InvalidStateError` and the popin stayed visibly open while the framework recorded it closed.
117
+ - **Fixed — a popin answer outside dev mode no longer reports a false 422 (#B575).** The two hidden inputs the popin branch parsed are spliced only when `NODE_ENV_IS_DEV` is true; both branches now go through one tolerant parse.
118
+ - **Fixed — an HTML answer whose top-level elements are table rows or cells keeps them (#B578).** The answer is parsed as a fragment rather than a whole document, so a top-level `<tr>` or `<td>` survives and a swap into a `<tbody>` writes the row, not the cell text.
119
+ - **Fixed — reloading an open popin no longer blanks it (#B579).** The declarative trigger's `loaded` listener applied the event detail — the popin object — as if it were the body, wiping the content just written; present since `0.4.6`.
120
+ - **Fixed — a malformed `data-gina-dialog-target` falls back instead of throwing (#B580).** A selector such as `#slot >` takes the documented full-replace fallback rather than an uncaught `SyntaxError`, and both silent fallbacks are now announced in dev mode.
121
+ - **Fixed — a page form's staged upload is placed with its own form (#B572).** Which popin a chosen file belongs to is decided by containment, captured once at selection, never by "some popin is open" — before, a file chosen while an unrelated popin was open had its virtual upload form appended inside that popin and the form then saved without the file.
122
+ - **Fixed — the client validator binds only the forms a page opted in (#B549).** Declaring a single rule file used to make every form on every page an always-XHR submit, plain login and signup forms included. Behaviour change: an implicitly bound form now submits natively unless it carries a `data-gina-form-*` attribute or matches a rule.
123
+ - **Fixed — a date field no longer submits the previous day east of UTC (#B558).** `isDate` wrote a `Date` object into the payload, which `JSON.stringify` renders as a UTC instant — the previous day in any positive offset. The payload now takes a plain `yyyy-mm-dd` string, matching the schema the framework already published; breaking for anything that read `req.body.<field>` as a `Date`.
124
+ - **Fixed — an XHR redirect over HTTP/2 delivers the session cookie it rotated (#B550).** `redirect()`'s XHR and popin exits answered on the raw HTTP/2 stream, so a session middleware's `on-headers` cookie and save-on-end never fired and a user signed in immediately before the redirect arrived unauthenticated. Both exits terminate through the compat response, and the router's `inheritedData` consume persists itself.
125
+ - **Fixed — a session survives an ordinary HTTP/2 render (#B562).** A transparent base `writeHead` / `write` / `end` is installed before the middleware chain and the six buffering render delegates hand their send to it, so a `rolling` cookie rolls and a mutation made while rendering is persisted; statics stay on the raw stream deliberately and `renderStream()` is unchanged.
126
+ - **Fixed — an HTML file in `public/` no longer answers 500 on a bundle without templates (#B567).** The dev-mode loader injection read a `content.templates._common` block that an API-only bundle never has.
127
+ - **Fixed — an environment config overlay now overrides its base file.** A `<name>.<env>.json` overlay was folded in before its base and lost to it on every shared key — the opposite of what the reference pages described. It now wins; an overlay array replaces the base array and a `null` overrides. Read your overlays before upgrading.
128
+ - **Fixed — two connectors in one bundle no longer fight over an entity class name (#B555).** The process-wide entity table was keyed on the bare class name, so the connector whose connection became ready second was handed the first one's instance. It is keyed per bundle, model and class now, and a bundle whose declared entity did not reach its model refuses to start instead of serving a half-built model layer.
129
+ - **Fixed — a JSON config with a docblock and an unterminated `/*` in a string value no longer hangs the boot (#B568).** `requireJSON`'s block-comment strip backtracked about twice per line after a glob or certificate path such as `"…/ssl/*.example.pem"`, hanging the boot until the start-wait killed it with nothing logged; the strip is now a linear, string-aware scan.
130
+ - **Fixed — `self.throwError()` answers the request when called with a falsy value (#B560).** The late-call guard tested the one-argument form's payload for truthiness, so `self.throwError(err)` with `''`, `null`, `undefined`, `0` or `false` was mistaken for a call on a released response and the request was never answered; it now renders a 500 like any other.
131
+ - **Fixed — the storage metadata store no longer runs an application callback inside its own try/catch (#B565).** Seven methods swallowed an error thrown by the callback and then invoked it a second time with the application error presented as a store error, so a first-settle latch such as the content-addressed driver's `verify()` hung; callbacks now run after the try on every path.
95
132
 
96
133
 
97
134
  ## Documentation
package/ROADMAP.md CHANGED
@@ -83,6 +83,7 @@ This roadmap covers planned features, architectural improvements, new connectors
83
83
  | **Q4 2026** | `0.6.29` ✅ | **Security**: a failed Couchbase N1QL statement no longer carries its own result rows into the error it raises — the connector put the query service's whole response envelope, result documents included, on `error.stack` and `error.cause.http_body`, so a `RETURNING` statement that lost a CAS race or a SELECT that timed out part-way wrote the records it had already produced into any log that printed the error, with no interception point for a bundle; both now carry the envelope with `results` replaced by a row-count marker, while `errors`, `requestID`, `status`, `signature` and the classifier's `first_error_code`/`retry` are unchanged. **Added**: `bundle:build` and `project:build` gain an opt-in `--skip-unchanged` — a release whose source is byte-identical to what it was built from keeps its copy, signed by content rather than timestamps and recorded as `.gina-build.json`, with the manifest update, fingerprint stamp, `node_modules` link and both hooks still running and any doubt rebuilding. **Fixed**: a server-side field error reaches the visible control when a hidden twin of the same name comes first in document order; a path-form `getUrl` route containing `@` — the retina-asset idiom — no longer renders a 500 on either template engine; a staged upload no longer posts the literal `[object Object]` into a form that declares no `[preview][...]` sub-fields. Restart your bundles **and rebuild them** — two of the fixes are browser-bundled. |
84
84
  | **Q4 2026** | `0.6.30` ✅ | **Security**: the isolation release — a response rendered on the default swig path no longer carries a concurrent request's negotiated culture and webroot (50 of 50 concurrent pairs bled before the fix, 0 of 100 after); a later `util.promisify`-style caller of an entity method no longer receives an earlier call's record, which where the method reads a user-scoped row could pass an ownership check on another principal's data; and the error raised by the global `getConfig()` / `getLib()` helpers no longer writes its stack to the response, minting an incident `ref` and logging one full-detail line instead. **Changed**: `self.getConfig()` returns a per-call copy-on-write view of the configuration instead of a deep clone — reads pass through, your writes stay yours, and a route behind two middlewares reading `this.getConfig()` measured 14,719 ms → 1,884 ms per 3,000 requests. **Added**: log rotation for the logger's opt-in `file` container, and `gina tail` renders JSON when its logger's format is `json`. **Fixed**: bundle templates render through a per-bundle engine; a framework error is answered to the request that raised it rather than the most recently routed one; the server-side `query` validation rule no longer writes into the shared proxy configuration; the `file` container writes at all; and `gina-container` applies the container logging preset itself. |
85
85
  | **Q4 2026** | `0.6.31` ✅ | **Security**: the availability release — a request carrying a top-level field named `count` no longer terminates the bundle process (unauthenticated, one request, on any URL including one matching no route; every published version was affected), and a queued async job runs inside a detached copy of the request context that created it instead of whichever request's job freed the worker slot. **Added**: RFC 9218 request priorities — `req.priority` on both engines, propagation through `self.query()` / `self.forward()`, `self.setPriority()`, and urgency-ordered async jobs. **Fixed**: a Couchbase connector that cannot reach its cluster at boot reports the failure instead of hanging until the CLI kills the bundle; one bundle without a release `config/` no longer moves every other bundle's configuration root, and the config-directory refusals name the bundle; two dead external references refreshed. Restart your bundles **and rebuild them** — the `count` fix touches the validator's shared rule engine, which is browser-bundled. |
86
+ | **Q4 2026** | `0.6.32` ✅ | **Security**: the form-answer release's four fixes — credentials no longer ride a redirect (the request's `password` / `secret` / `token`-class fields are dropped from what `self.redirect()` carries); the built-in error pages HTML-escape every value they render (a reflected XSS through `?error=` on any redirecting route, every released version); a request parameter named `error` can no longer force a 500 or leave the request unanswered; an HTTP/2 static file no longer carries another request's response headers. **Added**: htmx-style form answers — `data-gina-form-target` / `-swap` / `-select`, out-of-band `data-gina-swap-oob` elements, and the `X-Gina-Retarget` / `-Reswap` / `-Reselect` response headers (same-origin only); the `GINA_MAINTENANCE` boot variable and replica-coherent maintenance mode through a shared kv namespace, with `pid` and `hostname` on the status payload; per-bundle login session lifetimes from `security.json` on top of the new `lib.duration.parse()`; a contributor `commit-msg` hook. **Changed**: popin context by containment rather than by the active popin; two form answers replacing one region no longer race (the newer submit supersedes); a navigated fragment's forms bind only when they opt in. **Fixed**: the gh#76 routing defect and its popin family (declared callbacks on the popin branch, the pre-open loading state, the modeless guard, the false 422 outside dev, table-row answers, reload blanking, malformed dialog targets, staged uploads placed by containment); the validator binds only opted-in forms; a date field no longer submits the previous day east of UTC; an XHR redirect and an ordinary render over HTTP/2 run the session middleware's hooks; an HTML static on a template-less bundle; an environment config overlay now overrides its base; two connectors sharing an entity class name; a glob path in a docblock-bearing JSON config no longer hangs the boot; `throwError()` with a falsy payload; the storage metadata store's callback isolation. 35 fragments; restart **and rebuild** — 17 commits touch the browser bundle. |
86
87
  | **Q1 2027** | `0.6.x` | HTTP/2 priorities ✅ shipped early in `0.6.31` (the `Priority` header half — read, propagated, emitted, job urgency; response ordering stays blocked on Node scheduler hooks) · Beemaster admin + visual translation editor |
87
88
  | **2027** | `0.7.0` | Performance — remaining measure-gated candidates: multipart & WebSocket fast paths, render/log cleanups, SIMD scanner (the render-path deep-clone & id-mint reduction shipped early in `0.6.2` with a measured 4.4× render-throughput gain; the profiling baseline itself also shipped in `0.6.2`; the per-request configuration view — `getConfig()` without the deep clone — landed for the next `0.6.x` cut) |
88
89
  | **2027** | `0.8.0` | ⚠️ **Delivered early — this content shipped in `0.6.25` (2026-09-03)**: XML request/response handling · pluggable message-schema validation · IBAN/BIC validation rules · money & ISO 4217 minor-unit utilities · idempotency keys. No committed content remains against this milestone; re-scope before planning around it. |
@@ -478,7 +479,7 @@ A cold audit of the Couchbase connector identified two critical security vulnera
478
479
  | --- | --- | --- | --- | --- |
479
480
  | ✅ | **`NODE_COMPILE_CACHE` — V8 bytecode startup cache** | `0.2.0` | Q2 2026 | Node.js 22.8+ caches compiled V8 bytecode to disk. Set once at startup — 30–60% faster cold start on subsequent runs with zero code changes to user bundles. No-op on Node < 22.8, so safe to ship unconditionally. |
480
481
  | ✅ | **Route radix trie — compile `routing.json` at startup** | `0.3.0-alpha.1` | 2026-04-01 | `lib/routing/src/radix.js` builds a segment-level trie once at startup. O(m) candidate lookup per request (m = segment count). `Set.has()` check skips non-candidates in the `for…in` loop. Internal change — no user-facing API change. |
481
- | ✅ | **Bun runtime support** | `0.5.5` | 2026-06-21 | Gina runs on the [Bun](https://bun.sh) runtime (Bun `>= 1.2`) as a supported, CI-gated target — `bun add -g gina` installs and boots end-to-end, validated by a blocking CI Bun smoke. Both investigated blockers cleared: dev-mode `require.cache` hot-reload and `node:http2` work under Bun (one upstream gap remains: RFC 8441 extended-CONNECT advertisement, affecting only opt-in WebSocket-over-HTTP/2). Gina self-bootstraps on first run; Node `>= 22 < 27` remains fully supported. |
482
+ | ✅ | **Bun runtime support** | `0.5.5` | 2026-06-21 | Gina runs on the [Bun](https://bun.sh) runtime (Bun `>= 1.2`) as a supported, CI-gated target — `bun add -g gina` installs and boots end-to-end, validated by a blocking CI Bun smoke. Both investigated blockers cleared: dev-mode `require.cache` hot-reload and `node:http2` work under Bun (on Bun `< 1.4` one upstream gap remains: RFC 8441 extended-CONNECT advertisement, affecting only opt-in WebSocket-over-HTTP/2 — Bun 1.4 advertises it). Gina self-bootstraps on first run; Node `>= 22 < 27` remains fully supported. |
482
483
  | ✅ | **V8 pointer compression support** | `0.2.0` | Q2 2026 | Node.js built with `--experimental-enable-pointer-compression` (e.g. [node-caged](https://github.com/platformatic/node-caged) or a custom build) delivers ~50% heap memory reduction across all pointer-heavy structures. Gina is pure JS — compatible out of the box. Adds: startup detection + `GINA_V8_POINTER_COMPRESSED` env var, Dockerfile guide with custom build recipe (full-icu + pointer compression), 4 GB ceiling documentation, N-API-only connector policy. |
483
484
  | ✅ | **Runtime CPU profiling baseline** | `0.6.2` | 2026-07-31 | Shipped — a three-arm baseline (HTTP/2 render, concurrent multipart upload, WebSocket echo) profiled a production-built bundle under load. Outcome: the multipart-scan, WebSocket-unmask, and render/log-cleanup candidates below all measured small under their own arms and moved to measure-gated deferral, while the dominant cost found is per-request deep-clone traffic — half of render-arm CPU — plus per-item random-id minting (~1 ms per render), now planned as its own row below. "No further acceleration needed" was an accepted verdict shape, and for the byte-loop candidates it is the verdict. |
484
485
  | ⏸ | **Multipart boundary-scan fast path** | — | on demand | **Deferred — acquitted by the profiling baseline (2026-07):** the boundary scan measured 7.2% of upload-arm CPU (0.73 ms per MB, ~47 µs per 64 KB chunk) with the event loop far from saturated — the loop-relief win does not materialize at these magnitudes. Re-armed by a profiled workload where the scan is a leading loop consumer. Original scope, unchanged when re-armed: the multipart parser's boundary search is the one unbounded byte-by-byte JS loop on a request path; delegating the in-chunk needle search to the runtime's native `Buffer.indexOf` (JS keeps only the chunk-boundary carry) relieves the event loop under large concurrent uploads; wire and event contract unchanged; validated by differential tests against the current matcher. |
@@ -548,6 +549,7 @@ Gina's built-in per-bundle inspector. Phases 1–2 ship as an embedded SPA at `/
548
549
  | ✅ | **Tutorial locale detection** — `LocaleSettings` React component detects the reader's locale and timezone via `navigator.language` + `Intl` APIs and pre-fills the `settings.json` scaffold example. Inserted after the scaffold step in both tutorials. Falls back to `en_US`. | — | `0.3.0` | 2026-04-06 |
549
550
  | ✅ | **Intermediate — Link Shortener** — SQLite ORM connector, async controller actions, `render()` + `renderJSON()` in same bundle, HTTP 302 redirect, route `requirements` guard. Includes downloadable project ZIP. | ~30 min | `0.3.0` | 2026-04-01 |
550
551
  | ✅ | **Advanced — Going to Production** — Full production project: authentication, per-user data isolation, deny-by-default authorization, sessions, HTTP/2, structured logging, Docker/K8s deployment with `gina-container`. Continues the intermediate tutorial's finished state (downloadable). | ~60 min | `0.6.8` | 2026-08-14 |
552
+ | ✅ | **Advanced — Make It Interactive** — The production shortener made interactive: a rule-bound form replacing hand-rolled `fetch`, a project-defined `isUrl` validation rule (browser-only — the action re-checks), a live hit counter streamed with `self.renderStream()` into an `<x-hits>` client component, and fragment navigation with `negotiate: true` + `data-gina-nav`. Continues the advanced tutorial's finished state (downloadable). | ~45 min | `0.6.32` | 2026-09-17 |
551
553
 
552
554
  ---
553
555
 
@@ -0,0 +1 @@
1
+ 0.6.32