gina 0.6.30 → 0.6.31

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 (610) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +23 -28
  3. package/ROADMAP.md +5 -4
  4. package/framework/v0.6.31/VERSION +1 -0
  5. package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/js/gina.js +31 -1
  6. package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +2 -2
  7. package/framework/v0.6.31/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  8. package/framework/v0.6.31/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  9. package/framework/{v0.6.30 → v0.6.31}/core/config.js +100 -6
  10. package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/index.js +1 -1
  11. package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/connector.v3.js +99 -2
  12. package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/connector.v4.js +99 -2
  13. package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.js +119 -8
  14. package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +1 -1
  15. package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +1 -1
  16. package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/validator/src/form-validator.js +31 -1
  17. package/framework/{v0.6.30 → v0.6.31}/core/server.isaac.js +15 -0
  18. package/framework/{v0.6.30 → v0.6.31}/core/server.js +79 -18
  19. package/framework/{v0.6.30 → v0.6.31}/helpers/context.js +10 -0
  20. package/framework/{v0.6.30 → v0.6.31}/lib/index.js +7 -0
  21. package/framework/{v0.6.30 → v0.6.31}/lib/job/src/main.js +157 -31
  22. package/framework/{v0.6.30 → v0.6.31}/lib/nunjucks-filters/src/main.js +9 -1
  23. package/framework/v0.6.31/lib/priority/package.json +18 -0
  24. package/framework/v0.6.31/lib/priority/src/main.js +499 -0
  25. package/framework/{v0.6.30 → v0.6.31}/lib/swig-filters/src/main.js +9 -1
  26. package/framework/{v0.6.30 → v0.6.31}/package.json +1 -1
  27. package/gna.js +4 -4
  28. package/llms.txt +7 -5
  29. package/package.json +4 -4
  30. package/schema/connectors.json +5 -0
  31. package/types/index.d.ts +63 -2
  32. package/framework/v0.6.30/VERSION +0 -1
  33. package/framework/v0.6.30/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  34. package/framework/v0.6.30/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  35. /package/framework/{v0.6.30 → v0.6.31}/AUTHORS +0 -0
  36. /package/framework/{v0.6.30 → v0.6.31}/LICENSE +0 -0
  37. /package/framework/{v0.6.30 → v0.6.31}/core/asset/html/nolayout.html +0 -0
  38. /package/framework/{v0.6.30 → v0.6.31}/core/asset/html/static.html +0 -0
  39. /package/framework/{v0.6.30 → v0.6.31}/core/asset/img/android-chrome-192x192.png +0 -0
  40. /package/framework/{v0.6.30 → v0.6.31}/core/asset/img/android-chrome-512x512.png +0 -0
  41. /package/framework/{v0.6.30 → v0.6.31}/core/asset/img/apple-touch-icon.png +0 -0
  42. /package/framework/{v0.6.30 → v0.6.31}/core/asset/img/favicon-16x16.png +0 -0
  43. /package/framework/{v0.6.30 → v0.6.31}/core/asset/img/favicon-32x32.png +0 -0
  44. /package/framework/{v0.6.30 → v0.6.31}/core/asset/img/favicon.ico +0 -0
  45. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/README.md +0 -0
  46. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  47. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  48. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  49. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  50. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  51. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  52. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  53. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  54. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  55. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  56. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  57. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  58. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  59. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  60. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  61. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  62. /package/framework/{v0.6.30 → v0.6.31}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  63. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/ai/index.js +0 -0
  64. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/ai/lib/connector.js +0 -0
  65. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/connector.js +0 -0
  66. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/n1ql.js +0 -0
  67. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/session-store.js +0 -0
  68. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  69. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  70. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/couchbase/lib/storage-store.js +0 -0
  71. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/duckdb/index.js +0 -0
  72. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/duckdb/lib/connector.js +0 -0
  73. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/mongodb/index.js +0 -0
  74. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/mongodb/lib/connector.js +0 -0
  75. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/mongodb/lib/job-store.js +0 -0
  76. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
  77. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/mongodb/lib/session-store.js +0 -0
  78. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/mysql/index.js +0 -0
  79. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/mysql/lib/connector.js +0 -0
  80. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/param-redact.js +0 -0
  81. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/postgresql/index.js +0 -0
  82. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/postgresql/lib/connector.js +0 -0
  83. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/redis/index.js +0 -0
  84. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/redis/lib/connector.js +0 -0
  85. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/redis/lib/job-store.js +0 -0
  86. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/redis/lib/kv-store.js +0 -0
  87. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/redis/lib/render-cache-store.js +0 -0
  88. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/redis/lib/session-store.js +0 -0
  89. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/scylladb/index.js +0 -0
  90. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/scylladb/lib/connector.js +0 -0
  91. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/scylladb/lib/session-store.js +0 -0
  92. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/settle-once.js +0 -0
  93. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/sql-parser.js +0 -0
  94. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/sqlite/index.js +0 -0
  95. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/sqlite/lib/connector.js +0 -0
  96. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/sqlite/lib/job-store.js +0 -0
  97. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/sqlite/lib/kv-store.js +0 -0
  98. /package/framework/{v0.6.30 → v0.6.31}/core/connectors/sqlite/lib/session-store.js +0 -0
  99. /package/framework/{v0.6.30 → v0.6.31}/core/content.encoding +0 -0
  100. /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.framework.js +0 -0
  101. /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-json.js +0 -0
  102. /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-nunjucks-async.js +0 -0
  103. /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-nunjucks.js +0 -0
  104. /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-stream.js +0 -0
  105. /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-swig-async.js +0 -0
  106. /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-swig.js +0 -0
  107. /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-v1.js +0 -0
  108. /package/framework/{v0.6.30 → v0.6.31}/core/controller/controller.render-xml.js +0 -0
  109. /package/framework/{v0.6.30 → v0.6.31}/core/controller/index.js +0 -0
  110. /package/framework/{v0.6.30 → v0.6.31}/core/controller/inline-script.js +0 -0
  111. /package/framework/{v0.6.30 → v0.6.31}/core/controller/inspector-window-emit.js +0 -0
  112. /package/framework/{v0.6.30 → v0.6.31}/core/controller/release-banner.js +0 -0
  113. /package/framework/{v0.6.30 → v0.6.31}/core/dev/index.js +0 -0
  114. /package/framework/{v0.6.30 → v0.6.31}/core/dev/lib/class.js +0 -0
  115. /package/framework/{v0.6.30 → v0.6.31}/core/dev/lib/factory.js +0 -0
  116. /package/framework/{v0.6.30 → v0.6.31}/core/dev/lib/tools.js +0 -0
  117. /package/framework/{v0.6.30 → v0.6.31}/core/gna.js +0 -0
  118. /package/framework/{v0.6.30 → v0.6.31}/core/locales/README.md +0 -0
  119. /package/framework/{v0.6.30 → v0.6.31}/core/locales/currency.json +0 -0
  120. /package/framework/{v0.6.30 → v0.6.31}/core/locales/dist/language/en.json +0 -0
  121. /package/framework/{v0.6.30 → v0.6.31}/core/locales/dist/language/fr.json +0 -0
  122. /package/framework/{v0.6.30 → v0.6.31}/core/locales/dist/region/en.json +0 -0
  123. /package/framework/{v0.6.30 → v0.6.31}/core/locales/dist/region/fr.json +0 -0
  124. /package/framework/{v0.6.30 → v0.6.31}/core/locales/index.js +0 -0
  125. /package/framework/{v0.6.30 → v0.6.31}/core/mime.types +0 -0
  126. /package/framework/{v0.6.30 → v0.6.31}/core/model/entity.js +0 -0
  127. /package/framework/{v0.6.30 → v0.6.31}/core/model/index.js +0 -0
  128. /package/framework/{v0.6.30 → v0.6.31}/core/model/template/entityFactory.js +0 -0
  129. /package/framework/{v0.6.30 → v0.6.31}/core/model/template/index.js +0 -0
  130. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/README.md +0 -0
  131. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/index.js +0 -0
  132. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/csrf/README.md +0 -0
  133. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/csrf/package.json +0 -0
  134. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/csrf/src/main.js +0 -0
  135. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/README.md +0 -0
  136. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/coep/README.md +0 -0
  137. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/coep/package.json +0 -0
  138. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
  139. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/coop/README.md +0 -0
  140. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/coop/package.json +0 -0
  141. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
  142. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/corp/README.md +0 -0
  143. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/corp/package.json +0 -0
  144. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
  145. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/csp/README.md +0 -0
  146. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/csp/package.json +0 -0
  147. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
  148. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
  149. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
  150. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
  151. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/hsts/README.md +0 -0
  152. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/hsts/package.json +0 -0
  153. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
  154. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
  155. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
  156. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
  157. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/package.json +0 -0
  158. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
  159. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
  160. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
  161. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/src/main.js +0 -0
  162. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
  163. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
  164. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
  165. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
  166. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
  167. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
  168. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
  169. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
  170. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
  171. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
  172. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
  173. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
  174. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
  175. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
  176. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
  177. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
  178. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/session/README.md +0 -0
  179. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/session/package.json +0 -0
  180. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/session/src/main.js +0 -0
  181. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/storage/README.md +0 -0
  182. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/storage/build.json +0 -0
  183. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/storage/package.json +0 -0
  184. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/storage/src/main.js +0 -0
  185. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/validator/README.md +0 -0
  186. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/validator/build.json +0 -0
  187. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/validator/package.json +0 -0
  188. /package/framework/{v0.6.30 → v0.6.31}/core/plugins/lib/validator/src/main.js +0 -0
  189. /package/framework/{v0.6.30 → v0.6.31}/core/router.js +0 -0
  190. /package/framework/{v0.6.30 → v0.6.31}/core/server.express.js +0 -0
  191. /package/framework/{v0.6.30 → v0.6.31}/core/status.codes +0 -0
  192. /package/framework/{v0.6.30 → v0.6.31}/core/template/_gitignore +0 -0
  193. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/config/app.json +0 -0
  194. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  195. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/config/routing.json +0 -0
  196. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/config/settings.json +0 -0
  197. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  198. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/config/templates.json +0 -0
  199. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  200. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  201. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  202. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  203. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/index.js +0 -0
  204. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle/locales/en.json +0 -0
  205. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  206. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  207. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  208. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  209. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  210. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
  211. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  212. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
  213. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/readme.md +0 -0
  214. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_public/sw.js +0 -0
  215. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  216. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  217. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  218. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  219. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
  220. /package/framework/{v0.6.30 → v0.6.31}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  221. /package/framework/{v0.6.30 → v0.6.31}/core/template/command/gina.bat.tpl +0 -0
  222. /package/framework/{v0.6.30 → v0.6.31}/core/template/command/gina.tpl +0 -0
  223. /package/framework/{v0.6.30 → v0.6.31}/core/template/conf/env.json +0 -0
  224. /package/framework/{v0.6.30 → v0.6.31}/core/template/conf/manifest.json +0 -0
  225. /package/framework/{v0.6.30 → v0.6.31}/core/template/conf/package.json +0 -0
  226. /package/framework/{v0.6.30 → v0.6.31}/core/template/conf/settings.json +0 -0
  227. /package/framework/{v0.6.30 → v0.6.31}/core/template/conf/statics.json +0 -0
  228. /package/framework/{v0.6.30 → v0.6.31}/core/template/conf/templates.json +0 -0
  229. /package/framework/{v0.6.30 → v0.6.31}/core/template/error/client/json/401.json +0 -0
  230. /package/framework/{v0.6.30 → v0.6.31}/core/template/error/client/json/403.json +0 -0
  231. /package/framework/{v0.6.30 → v0.6.31}/core/template/error/client/json/404.json +0 -0
  232. /package/framework/{v0.6.30 → v0.6.31}/core/template/error/server/html/50x.html +0 -0
  233. /package/framework/{v0.6.30 → v0.6.31}/core/template/error/server/json/500.json +0 -0
  234. /package/framework/{v0.6.30 → v0.6.31}/core/template/error/server/json/503.json +0 -0
  235. /package/framework/{v0.6.30 → v0.6.31}/core/template/extensions/logger/config.json +0 -0
  236. /package/framework/{v0.6.30 → v0.6.31}/helpers/console.js +0 -0
  237. /package/framework/{v0.6.30 → v0.6.31}/helpers/data/LICENSE +0 -0
  238. /package/framework/{v0.6.30 → v0.6.31}/helpers/data/README.md +0 -0
  239. /package/framework/{v0.6.30 → v0.6.31}/helpers/data/package.json +0 -0
  240. /package/framework/{v0.6.30 → v0.6.31}/helpers/data/src/main.js +0 -0
  241. /package/framework/{v0.6.30 → v0.6.31}/helpers/dateFormat.js +0 -0
  242. /package/framework/{v0.6.30 → v0.6.31}/helpers/index.js +0 -0
  243. /package/framework/{v0.6.30 → v0.6.31}/helpers/json/LICENSE +0 -0
  244. /package/framework/{v0.6.30 → v0.6.31}/helpers/json/README.md +0 -0
  245. /package/framework/{v0.6.30 → v0.6.31}/helpers/json/package.json +0 -0
  246. /package/framework/{v0.6.30 → v0.6.31}/helpers/json/src/main.js +0 -0
  247. /package/framework/{v0.6.30 → v0.6.31}/helpers/path.js +0 -0
  248. /package/framework/{v0.6.30 → v0.6.31}/helpers/plugins/README.md +0 -0
  249. /package/framework/{v0.6.30 → v0.6.31}/helpers/plugins/package.json +0 -0
  250. /package/framework/{v0.6.30 → v0.6.31}/helpers/plugins/src/api-error.js +0 -0
  251. /package/framework/{v0.6.30 → v0.6.31}/helpers/plugins/src/main.js +0 -0
  252. /package/framework/{v0.6.30 → v0.6.31}/helpers/prototypes.js +0 -0
  253. /package/framework/{v0.6.30 → v0.6.31}/helpers/task.js +0 -0
  254. /package/framework/{v0.6.30 → v0.6.31}/helpers/text.js +0 -0
  255. /package/framework/{v0.6.30 → v0.6.31}/lib/admin/package.json +0 -0
  256. /package/framework/{v0.6.30 → v0.6.31}/lib/admin/src/main.js +0 -0
  257. /package/framework/{v0.6.30 → v0.6.31}/lib/archiver/README.md +0 -0
  258. /package/framework/{v0.6.30 → v0.6.31}/lib/archiver/build.json +0 -0
  259. /package/framework/{v0.6.30 → v0.6.31}/lib/archiver/package.json +0 -0
  260. /package/framework/{v0.6.30 → v0.6.31}/lib/archiver/src/dep/jszip.min.js +0 -0
  261. /package/framework/{v0.6.30 → v0.6.31}/lib/archiver/src/main.js +0 -0
  262. /package/framework/{v0.6.30 → v0.6.31}/lib/async/package.json +0 -0
  263. /package/framework/{v0.6.30 → v0.6.31}/lib/async/src/main.js +0 -0
  264. /package/framework/{v0.6.30 → v0.6.31}/lib/audit/package.json +0 -0
  265. /package/framework/{v0.6.30 → v0.6.31}/lib/audit/src/main.js +0 -0
  266. /package/framework/{v0.6.30 → v0.6.31}/lib/audit-store.js +0 -0
  267. /package/framework/{v0.6.30 → v0.6.31}/lib/authn/package.json +0 -0
  268. /package/framework/{v0.6.30 → v0.6.31}/lib/authn/src/lockout.js +0 -0
  269. /package/framework/{v0.6.30 → v0.6.31}/lib/authn/src/main.js +0 -0
  270. /package/framework/{v0.6.30 → v0.6.31}/lib/authn/src/totp.js +0 -0
  271. /package/framework/{v0.6.30 → v0.6.31}/lib/authz-gate/package.json +0 -0
  272. /package/framework/{v0.6.30 → v0.6.31}/lib/authz-gate/src/main.js +0 -0
  273. /package/framework/{v0.6.30 → v0.6.31}/lib/cache/README.md +0 -0
  274. /package/framework/{v0.6.30 → v0.6.31}/lib/cache/build.json +0 -0
  275. /package/framework/{v0.6.30 → v0.6.31}/lib/cache/package.json +0 -0
  276. /package/framework/{v0.6.30 → v0.6.31}/lib/cache/src/main.js +0 -0
  277. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/aliases.json +0 -0
  278. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/audit/arguments.json +0 -0
  279. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/audit/help.txt +0 -0
  280. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/audit/verify.js +0 -0
  281. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/add.js +0 -0
  282. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/arguments.json +0 -0
  283. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/build.js +0 -0
  284. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/copy.js +0 -0
  285. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/cp.js +0 -0
  286. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/help.js +0 -0
  287. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/help.txt +0 -0
  288. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
  289. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/list.js +0 -0
  290. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/man.js +0 -0
  291. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/mcp-start.js +0 -0
  292. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/mcp.js +0 -0
  293. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/oas.js +0 -0
  294. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/openapi.js +0 -0
  295. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/remove.js +0 -0
  296. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/rename.js +0 -0
  297. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/restart.js +0 -0
  298. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/rm.js +0 -0
  299. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/start.js +0 -0
  300. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/status.js +0 -0
  301. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/stop.js +0 -0
  302. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/bundle/types.js +0 -0
  303. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/cache/arguments.json +0 -0
  304. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/cache/clear.js +0 -0
  305. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/cache/help.txt +0 -0
  306. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/cache/stats.js +0 -0
  307. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/add.js +0 -0
  308. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/arguments.json +0 -0
  309. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/help.js +0 -0
  310. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/help.txt +0 -0
  311. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/infer.js +0 -0
  312. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/list.js +0 -0
  313. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/migrate.js +0 -0
  314. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/models.js +0 -0
  315. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/remove.js +0 -0
  316. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/rm.js +0 -0
  317. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/connector/test.js +0 -0
  318. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/container/arguments.json +0 -0
  319. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/container/help.js +0 -0
  320. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/container/help.txt +0 -0
  321. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/container/man.js +0 -0
  322. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/container/ps.js +0 -0
  323. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/container/stop.js +0 -0
  324. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/add.js +0 -0
  325. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/arguments.json +0 -0
  326. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/help.txt +0 -0
  327. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/inc/args.js +0 -0
  328. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/inc/namespace.js +0 -0
  329. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
  330. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/inc/reference-scan.js +0 -0
  331. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/inc/scaffold.js +0 -0
  332. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/remove.js +0 -0
  333. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/rename.js +0 -0
  334. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/controller/rm.js +0 -0
  335. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/add.js +0 -0
  336. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/get.js +0 -0
  337. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/help.js +0 -0
  338. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/help.txt +0 -0
  339. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/link-dev.js +0 -0
  340. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/list.js +0 -0
  341. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/remove.js +0 -0
  342. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/rm.js +0 -0
  343. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/set.js +0 -0
  344. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/unset.js +0 -0
  345. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/env/use.js +0 -0
  346. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/add.js +0 -0
  347. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/arguments.json +0 -0
  348. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/build.js +0 -0
  349. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/dot.js +0 -0
  350. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/get.js +0 -0
  351. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/help.js +0 -0
  352. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/help.txt +0 -0
  353. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/init.js +0 -0
  354. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/link-node-modules.js +0 -0
  355. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/link.js +0 -0
  356. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/list.js +0 -0
  357. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/man.js +0 -0
  358. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/msg.json +0 -0
  359. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/open.js +0 -0
  360. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/remove.js +0 -0
  361. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/reset.js +0 -0
  362. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/restart.js +0 -0
  363. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/set.js +0 -0
  364. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/start.js +0 -0
  365. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/status.js +0 -0
  366. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/stop.js +0 -0
  367. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/tail.js +0 -0
  368. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/update.js +0 -0
  369. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/framework/version.js +0 -0
  370. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/gina-dev.1.md +0 -0
  371. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/gina-framework.1.md +0 -0
  372. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/gina.1.md +0 -0
  373. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/helper.js +0 -0
  374. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/i18n/add.js +0 -0
  375. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/i18n/arguments.json +0 -0
  376. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/i18n/export.js +0 -0
  377. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/i18n/help.js +0 -0
  378. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/i18n/help.txt +0 -0
  379. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/i18n/import.js +0 -0
  380. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/i18n/scan.js +0 -0
  381. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/_host.js +0 -0
  382. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/arguments.json +0 -0
  383. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/build.js +0 -0
  384. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/help.js +0 -0
  385. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/help.txt +0 -0
  386. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/list.js +0 -0
  387. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/man.js +0 -0
  388. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/rm.js +0 -0
  389. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/image/run.js +0 -0
  390. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/index.js +0 -0
  391. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/inspector/help.js +0 -0
  392. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/inspector/help.txt +0 -0
  393. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/inspector/open.js +0 -0
  394. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/man-render.js +0 -0
  395. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/minion/arguments.json +0 -0
  396. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/minion/help.js +0 -0
  397. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/minion/help.txt +0 -0
  398. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/minion/kill.js +0 -0
  399. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/minion/list.js +0 -0
  400. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/msg.json +0 -0
  401. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/port/help.js +0 -0
  402. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/port/help.txt +0 -0
  403. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/port/inc/scan.js +0 -0
  404. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/port/list.js +0 -0
  405. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/port/reset.js +0 -0
  406. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/port/set.js +0 -0
  407. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/add.js +0 -0
  408. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/arguments.json +0 -0
  409. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/backup.js +0 -0
  410. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/build.js +0 -0
  411. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/help.js +0 -0
  412. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/help.txt +0 -0
  413. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/import.js +0 -0
  414. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/list.js +0 -0
  415. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/man.js +0 -0
  416. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/move.js +0 -0
  417. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/remove.js +0 -0
  418. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/rename.js +0 -0
  419. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/restart.js +0 -0
  420. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/restore.js +0 -0
  421. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/rm.js +0 -0
  422. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/start.js +0 -0
  423. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/status.js +0 -0
  424. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/project/stop.js +0 -0
  425. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/protocol/arguments.json +0 -0
  426. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/protocol/help.js +0 -0
  427. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/protocol/help.txt +0 -0
  428. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/protocol/list.js +0 -0
  429. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/protocol/remove.js +0 -0
  430. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/protocol/set.js +0 -0
  431. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/add.js +0 -0
  432. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/help.js +0 -0
  433. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/help.txt +0 -0
  434. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/link-local.js +0 -0
  435. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/link-production.js +0 -0
  436. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/list.js +0 -0
  437. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/remove.js +0 -0
  438. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/rm.js +0 -0
  439. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/scope/use.js +0 -0
  440. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/secrets/arguments.json +0 -0
  441. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/secrets/check.js +0 -0
  442. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/secrets/help.js +0 -0
  443. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/secrets/help.txt +0 -0
  444. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/secrets/scan.js +0 -0
  445. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/service/help.js +0 -0
  446. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/service/help.txt +0 -0
  447. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/service/list.js +0 -0
  448. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/service/man.js +0 -0
  449. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/service/start.js +0 -0
  450. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/storage/arguments.json +0 -0
  451. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/storage/gc.js +0 -0
  452. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/storage/help.txt +0 -0
  453. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/storage/stats.js +0 -0
  454. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/storage/verify.js +0 -0
  455. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd/view/add.js +0 -0
  456. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd-status-format/package.json +0 -0
  457. /package/framework/{v0.6.30 → v0.6.31}/lib/cmd-status-format/src/main.js +0 -0
  458. /package/framework/{v0.6.30 → v0.6.31}/lib/collection/README.md +0 -0
  459. /package/framework/{v0.6.30 → v0.6.31}/lib/collection/build.json +0 -0
  460. /package/framework/{v0.6.30 → v0.6.31}/lib/collection/package.json +0 -0
  461. /package/framework/{v0.6.30 → v0.6.31}/lib/collection/src/main.js +0 -0
  462. /package/framework/{v0.6.30 → v0.6.31}/lib/conf-view/package.json +0 -0
  463. /package/framework/{v0.6.30 → v0.6.31}/lib/conf-view/src/main.js +0 -0
  464. /package/framework/{v0.6.30 → v0.6.31}/lib/config.js +0 -0
  465. /package/framework/{v0.6.30 → v0.6.31}/lib/connector-config/package.json +0 -0
  466. /package/framework/{v0.6.30 → v0.6.31}/lib/connector-config/src/main.js +0 -0
  467. /package/framework/{v0.6.30 → v0.6.31}/lib/connector-error/package.json +0 -0
  468. /package/framework/{v0.6.30 → v0.6.31}/lib/connector-error/src/main.js +0 -0
  469. /package/framework/{v0.6.30 → v0.6.31}/lib/connector-registry/package.json +0 -0
  470. /package/framework/{v0.6.30 → v0.6.31}/lib/connector-registry/src/main.js +0 -0
  471. /package/framework/{v0.6.30 → v0.6.31}/lib/cron/README.md +0 -0
  472. /package/framework/{v0.6.30 → v0.6.31}/lib/cron/package.json +0 -0
  473. /package/framework/{v0.6.30 → v0.6.31}/lib/cron/src/main.js +0 -0
  474. /package/framework/{v0.6.30 → v0.6.31}/lib/domain/LICENSE +0 -0
  475. /package/framework/{v0.6.30 → v0.6.31}/lib/domain/README.md +0 -0
  476. /package/framework/{v0.6.30 → v0.6.31}/lib/domain/package.json +0 -0
  477. /package/framework/{v0.6.30 → v0.6.31}/lib/domain/src/main.js +0 -0
  478. /package/framework/{v0.6.30 → v0.6.31}/lib/dto/package.json +0 -0
  479. /package/framework/{v0.6.30 → v0.6.31}/lib/dto/src/main.js +0 -0
  480. /package/framework/{v0.6.30 → v0.6.31}/lib/dto-pipe/package.json +0 -0
  481. /package/framework/{v0.6.30 → v0.6.31}/lib/dto-pipe/src/main.js +0 -0
  482. /package/framework/{v0.6.30 → v0.6.31}/lib/dto-types/package.json +0 -0
  483. /package/framework/{v0.6.30 → v0.6.31}/lib/dto-types/src/main.js +0 -0
  484. /package/framework/{v0.6.30 → v0.6.31}/lib/generator/index.js +0 -0
  485. /package/framework/{v0.6.30 → v0.6.31}/lib/i18n/package.json +0 -0
  486. /package/framework/{v0.6.30 → v0.6.31}/lib/i18n/src/main.js +0 -0
  487. /package/framework/{v0.6.30 → v0.6.31}/lib/idempotency/package.json +0 -0
  488. /package/framework/{v0.6.30 → v0.6.31}/lib/idempotency/src/main.js +0 -0
  489. /package/framework/{v0.6.30 → v0.6.31}/lib/image-build/package.json +0 -0
  490. /package/framework/{v0.6.30 → v0.6.31}/lib/image-build/src/main.js +0 -0
  491. /package/framework/{v0.6.30 → v0.6.31}/lib/inherits/LICENSE +0 -0
  492. /package/framework/{v0.6.30 → v0.6.31}/lib/inherits/README.md +0 -0
  493. /package/framework/{v0.6.30 → v0.6.31}/lib/inherits/package.json +0 -0
  494. /package/framework/{v0.6.30 → v0.6.31}/lib/inherits/src/main.js +0 -0
  495. /package/framework/{v0.6.30 → v0.6.31}/lib/inspector-events/package.json +0 -0
  496. /package/framework/{v0.6.30 → v0.6.31}/lib/inspector-events/src/main.js +0 -0
  497. /package/framework/{v0.6.30 → v0.6.31}/lib/inspector-redact/package.json +0 -0
  498. /package/framework/{v0.6.30 → v0.6.31}/lib/inspector-redact/src/main.js +0 -0
  499. /package/framework/{v0.6.30 → v0.6.31}/lib/instrument/package.json +0 -0
  500. /package/framework/{v0.6.30 → v0.6.31}/lib/instrument/src/main.js +0 -0
  501. /package/framework/{v0.6.30 → v0.6.31}/lib/job/package.json +0 -0
  502. /package/framework/{v0.6.30 → v0.6.31}/lib/job-store.js +0 -0
  503. /package/framework/{v0.6.30 → v0.6.31}/lib/json-config-header/package.json +0 -0
  504. /package/framework/{v0.6.30 → v0.6.31}/lib/json-config-header/src/main.js +0 -0
  505. /package/framework/{v0.6.30 → v0.6.31}/lib/kv/package.json +0 -0
  506. /package/framework/{v0.6.30 → v0.6.31}/lib/kv/src/main.js +0 -0
  507. /package/framework/{v0.6.30 → v0.6.31}/lib/kv-store.js +0 -0
  508. /package/framework/{v0.6.30 → v0.6.31}/lib/loading-state/package.json +0 -0
  509. /package/framework/{v0.6.30 → v0.6.31}/lib/loading-state/src/main.js +0 -0
  510. /package/framework/{v0.6.30 → v0.6.31}/lib/logger/README.md +0 -0
  511. /package/framework/{v0.6.30 → v0.6.31}/lib/logger/package.json +0 -0
  512. /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/containers/default/index.js +0 -0
  513. /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/containers/file/index.js +0 -0
  514. /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/containers/mq/index.js +0 -0
  515. /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/containers/mq/listener.js +0 -0
  516. /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/containers/mq/speaker.js +0 -0
  517. /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/helper.js +0 -0
  518. /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/main.js +0 -0
  519. /package/framework/{v0.6.30 → v0.6.31}/lib/logger/src/redact.js +0 -0
  520. /package/framework/{v0.6.30 → v0.6.31}/lib/maintenance/package.json +0 -0
  521. /package/framework/{v0.6.30 → v0.6.31}/lib/maintenance/src/main.js +0 -0
  522. /package/framework/{v0.6.30 → v0.6.31}/lib/math/index.js +0 -0
  523. /package/framework/{v0.6.30 → v0.6.31}/lib/mcp-dispatch/package.json +0 -0
  524. /package/framework/{v0.6.30 → v0.6.31}/lib/mcp-dispatch/src/main.js +0 -0
  525. /package/framework/{v0.6.30 → v0.6.31}/lib/mcp-http/package.json +0 -0
  526. /package/framework/{v0.6.30 → v0.6.31}/lib/mcp-http/src/main.js +0 -0
  527. /package/framework/{v0.6.30 → v0.6.31}/lib/mcp-server/package.json +0 -0
  528. /package/framework/{v0.6.30 → v0.6.31}/lib/mcp-server/src/main.js +0 -0
  529. /package/framework/{v0.6.30 → v0.6.31}/lib/merge/README.md +0 -0
  530. /package/framework/{v0.6.30 → v0.6.31}/lib/merge/package.json +0 -0
  531. /package/framework/{v0.6.30 → v0.6.31}/lib/merge/src/main.js +0 -0
  532. /package/framework/{v0.6.30 → v0.6.31}/lib/message-validator/package.json +0 -0
  533. /package/framework/{v0.6.30 → v0.6.31}/lib/message-validator/src/main.js +0 -0
  534. /package/framework/{v0.6.30 → v0.6.31}/lib/metrics/package.json +0 -0
  535. /package/framework/{v0.6.30 → v0.6.31}/lib/metrics/src/main.js +0 -0
  536. /package/framework/{v0.6.30 → v0.6.31}/lib/model.js +0 -0
  537. /package/framework/{v0.6.30 → v0.6.31}/lib/money/package.json +0 -0
  538. /package/framework/{v0.6.30 → v0.6.31}/lib/money/src/main.js +0 -0
  539. /package/framework/{v0.6.30 → v0.6.31}/lib/multipart/package.json +0 -0
  540. /package/framework/{v0.6.30 → v0.6.31}/lib/multipart/src/main.js +0 -0
  541. /package/framework/{v0.6.30 → v0.6.31}/lib/net-locality/package.json +0 -0
  542. /package/framework/{v0.6.30 → v0.6.31}/lib/net-locality/src/main.js +0 -0
  543. /package/framework/{v0.6.30 → v0.6.31}/lib/nunjucks-filters/README.md +0 -0
  544. /package/framework/{v0.6.30 → v0.6.31}/lib/nunjucks-filters/package.json +0 -0
  545. /package/framework/{v0.6.30 → v0.6.31}/lib/nunjucks-resolver/package.json +0 -0
  546. /package/framework/{v0.6.30 → v0.6.31}/lib/nunjucks-resolver/src/main.js +0 -0
  547. /package/framework/{v0.6.30 → v0.6.31}/lib/proc.js +0 -0
  548. /package/framework/{v0.6.30 → v0.6.31}/lib/push/package.json +0 -0
  549. /package/framework/{v0.6.30 → v0.6.31}/lib/push/src/main.js +0 -0
  550. /package/framework/{v0.6.30 → v0.6.31}/lib/rate-limit/package.json +0 -0
  551. /package/framework/{v0.6.30 → v0.6.31}/lib/rate-limit/src/main.js +0 -0
  552. /package/framework/{v0.6.30 → v0.6.31}/lib/release-watch/package.json +0 -0
  553. /package/framework/{v0.6.30 → v0.6.31}/lib/release-watch/src/main.js +0 -0
  554. /package/framework/{v0.6.30 → v0.6.31}/lib/render-cache/package.json +0 -0
  555. /package/framework/{v0.6.30 → v0.6.31}/lib/render-cache/src/main.js +0 -0
  556. /package/framework/{v0.6.30 → v0.6.31}/lib/render-cache-store.js +0 -0
  557. /package/framework/{v0.6.30 → v0.6.31}/lib/routing/README.md +0 -0
  558. /package/framework/{v0.6.30 → v0.6.31}/lib/routing/build.json +0 -0
  559. /package/framework/{v0.6.30 → v0.6.31}/lib/routing/package.json +0 -0
  560. /package/framework/{v0.6.30 → v0.6.31}/lib/routing/src/main.js +0 -0
  561. /package/framework/{v0.6.30 → v0.6.31}/lib/routing/src/radix.js +0 -0
  562. /package/framework/{v0.6.30 → v0.6.31}/lib/routing-introspect/package.json +0 -0
  563. /package/framework/{v0.6.30 → v0.6.31}/lib/routing-introspect/src/main.js +0 -0
  564. /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/package.json +0 -0
  565. /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/src/backends/env.js +0 -0
  566. /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/src/backends/exec.js +0 -0
  567. /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/src/backends/file.js +0 -0
  568. /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/src/declaration.js +0 -0
  569. /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/src/env-file.js +0 -0
  570. /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/src/main.js +0 -0
  571. /package/framework/{v0.6.30 → v0.6.31}/lib/secrets/src/sources.js +0 -0
  572. /package/framework/{v0.6.30 → v0.6.31}/lib/security-headers-emitter/package.json +0 -0
  573. /package/framework/{v0.6.30 → v0.6.31}/lib/security-headers-emitter/src/main.js +0 -0
  574. /package/framework/{v0.6.30 → v0.6.31}/lib/session-store.js +0 -0
  575. /package/framework/{v0.6.30 → v0.6.31}/lib/shell.js +0 -0
  576. /package/framework/{v0.6.30 → v0.6.31}/lib/sqlite-driver.js +0 -0
  577. /package/framework/{v0.6.30 → v0.6.31}/lib/sri/package.json +0 -0
  578. /package/framework/{v0.6.30 → v0.6.31}/lib/sri/src/main.js +0 -0
  579. /package/framework/{v0.6.30 → v0.6.31}/lib/state.js +0 -0
  580. /package/framework/{v0.6.30 → v0.6.31}/lib/storage/package.json +0 -0
  581. /package/framework/{v0.6.30 → v0.6.31}/lib/storage/src/local-cas.js +0 -0
  582. /package/framework/{v0.6.30 → v0.6.31}/lib/storage/src/local-stream.js +0 -0
  583. /package/framework/{v0.6.30 → v0.6.31}/lib/storage/src/local.js +0 -0
  584. /package/framework/{v0.6.30 → v0.6.31}/lib/storage/src/main.js +0 -0
  585. /package/framework/{v0.6.30 → v0.6.31}/lib/storage/src/meta-store.js +0 -0
  586. /package/framework/{v0.6.30 → v0.6.31}/lib/storage/src/s3.js +0 -0
  587. /package/framework/{v0.6.30 → v0.6.31}/lib/storage/src/util.js +0 -0
  588. /package/framework/{v0.6.30 → v0.6.31}/lib/storage-store.js +0 -0
  589. /package/framework/{v0.6.30 → v0.6.31}/lib/swig-filters/README.md +0 -0
  590. /package/framework/{v0.6.30 → v0.6.31}/lib/swig-filters/package.json +0 -0
  591. /package/framework/{v0.6.30 → v0.6.31}/lib/swig-resolver/package.json +0 -0
  592. /package/framework/{v0.6.30 → v0.6.31}/lib/swig-resolver/src/main.js +0 -0
  593. /package/framework/{v0.6.30 → v0.6.31}/lib/template-loaders/package.json +0 -0
  594. /package/framework/{v0.6.30 → v0.6.31}/lib/template-loaders/src/loaders/http.js +0 -0
  595. /package/framework/{v0.6.30 → v0.6.31}/lib/template-loaders/src/loaders/memory.js +0 -0
  596. /package/framework/{v0.6.30 → v0.6.31}/lib/template-loaders/src/main.js +0 -0
  597. /package/framework/{v0.6.30 → v0.6.31}/lib/url/README.md +0 -0
  598. /package/framework/{v0.6.30 → v0.6.31}/lib/url/index.js +0 -0
  599. /package/framework/{v0.6.30 → v0.6.31}/lib/url/routing.json +0 -0
  600. /package/framework/{v0.6.30 → v0.6.31}/lib/uuid/package.json +0 -0
  601. /package/framework/{v0.6.30 → v0.6.31}/lib/uuid/src/main.js +0 -0
  602. /package/framework/{v0.6.30 → v0.6.31}/lib/validator.js +0 -0
  603. /package/framework/{v0.6.30 → v0.6.31}/lib/watcher/package.json +0 -0
  604. /package/framework/{v0.6.30 → v0.6.31}/lib/watcher/src/main.js +0 -0
  605. /package/framework/{v0.6.30 → v0.6.31}/lib/ws-framing/package.json +0 -0
  606. /package/framework/{v0.6.30 → v0.6.31}/lib/ws-framing/src/main.js +0 -0
  607. /package/framework/{v0.6.30 → v0.6.31}/lib/ws-query/package.json +0 -0
  608. /package/framework/{v0.6.30 → v0.6.31}/lib/ws-query/src/main.js +0 -0
  609. /package/framework/{v0.6.30 → v0.6.31}/lib/ws-session/package.json +0 -0
  610. /package/framework/{v0.6.30 → v0.6.31}/lib/ws-session/src/main.js +0 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,17 @@ 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.31 - 2026-09-14
10
+ ### Added
11
+ * 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.
12
+ ### Fixed
13
+ * Refreshed two external references that had gone dead. The X-Permitted-Cross-Domain-Policies plugin cited an Adobe specification URL that now redirects to a generic documentation portal instead of serving the document; the plugin README and the module JSDoc both carried it, and both now name the current, live Adobe copy of the same specification. The Couchbase connector cited an N1QL architecture page that returns 404 with no migration redirect; it now points at the Query Service page that Couchbase itself redirects that path to. Documentation only; no runtime or API change.
14
+ * A couchbase connector that cannot reach its cluster at boot now fails loudly instead of hanging. Consumers wait on a one-shot `ready` event, and every failure path in `connect()` only re-armed a retry without ever emitting it, so the all-or-nothing ready gate in the model layer never closed, the bundle never signalled that it had started, and `bundle:start` terminated it after roughly 64 seconds with no terminal error logged anywhere. `init()` now arms its own readiness deadline and emits the failure itself, so the existing abort path (log plus exit 1) runs first. Tunable per `connectors.json` entry with `readyTimeout` (milliseconds, default 50000); a value at or above the bundle-start budget cannot take effect, since the CLI terminates the bundle first. Separately, a single failed connect attempt now reports once rather than twice: the SDK settles both its callback and its awaited promise, which armed two competing retry chains and escalated the backoff at twice the intended rate; and a rejection that never calls back no longer throws before arming any retry. Applies to both the SDK v3 and v4 connectors (#B541).
15
+ * A bundle whose release tree carries no `config/` directory no longer moves every other bundle's configuration root. The source-tree fallback that recovers such a bundle wrote that one bundle's own directory into the process-wide `bundles` path — the registry every other writer and reader treats as the container of ALL bundles — and reassigned the shared loop variable the same loop hands to every bundle walked after it. In a non-dev environment a later, perfectly healthy bundle therefore loaded its SOURCE config instead of its release config without a word, or died on a spliced path: the container was derived by stripping the manifest KEY from a path built from the source DIRECTORY NAME, with an unanchored and unescaped regular expression, so it produced a wrong path whenever the two differ, whenever the project path repeats the bundle name earlier (`/demo` inside `/demo-x`), or whenever the name carries a regular-expression metacharacter. The fallback is now scoped to the bundle it recovers, and the container comes from the parent directory rather than a text substitution. Separately, the three config-directory failures that abort a boot named neither the bundle nor the environment, sending up a raw ENOENT whose only clue was a path the operator had never written down; all three now refuse in the same shape as the routing.json refusal, and the last-chance one reports both the release link and the source tree it tried, in that order. And a `getInstance()` call that reaches a Config whose initialisation aborted now reports the retained reason instead of merging the global context wholesale — which on a worker returned the Config constructor itself and surfaced as an opaque `TypeError: Cannot set properties of undefined (setting 'parent')` that named neither the bundle nor the file and repeated forever (#B542).
16
+ ### Security
17
+ * A queued async job now runs inside a detached copy of the request context that created it. 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 per-request context of whichever request's job had freed the worker slot — measured on a single-worker bundle: a job created by request B executed seeing request A's context, response objects included. Everything that reads that context then attributed the job to the wrong request: an absolute URL the job built through `getRoute().toUrl()` used the other request's proxy context and host; a failure the job raised through the global `getConfig()` / `getLib()` helpers was handled as that other request's — written to its response, or handed to its middleware chain once the response had gone out; and a JSON log line the job wrote carried the other request's id. `create()` now captures the creating request's identity and proxy context — never its `req`, `res` or `next` — and the whole lifecycle of the job (its record transitions, the deferred function, a retry it arms, its completion webhook) runs inside that copy; a job created outside any request runs with no request context at all, even when the worker that starts it was freed by a request's job. `throwError` treats a detached context as authoritative: with no live response to answer, a failing job is logged (fatal) or the error is thrown to the job (non-fatal), never written to any client. The per-request context has existed since `0.4.5`, where the misattribution reached JSON log lines only; the URL-host reader arrived in `0.6.28` and the response reader in `0.6.30`. Nothing about the job record changes, so durable stores serialise exactly what they did. Pickup: a bundle restart; this change's own bytes do not reach the client bundle. (#B543)
18
+ * A request carrying a top-level field named `count` no longer crashes the bundle. 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 request body, the query bag, route params, uploaded files, data handed to `self.query()`, a routing rule's validator data, and whatever a template pipes through `| length`. An own property of that name shadows the helper, so the framework called a string. On the body branches, which parse inside a try, that surfaced as a 500; on the query branches, which do not, it reached the process as an uncaughtException and the bundle EXITED — unauthenticated, one request, on any URL including one matching no route, because the body parse runs before routing resolves. A route param of that name left the request hanging open instead of answering. Every published version is affected. The framework now reaches the helper through a form no own property can shadow, via a small `ownCount()` on each affected module; it is the same function body, so every other receiver shape counts exactly as before, and `null` and `undefined` still throw exactly as the shorthand did — the empty-object seeding in the body-parse branches depends on that. Nested fields (`{"outer":{"count":1}}`) and near-misses (`counter`) were never affected, and are unchanged. Application code calling `x.count()` is untouched: the helper stays on `Object.prototype`. Counts over framework-built objects (response headers, the routing table, config) deliberately keep the shorthand. Pickup: a bundle restart AND a re-bake (#B546).
19
+
9
20
  ## 0.6.30 - 2026-09-10
10
21
  ### Added
11
22
  * Log rotation for the logger's opt-in `file` container, on by default at 10MB with 5 files kept — deliberately the same shape as the kubelet's own `containerLogMaxSize` / `containerLogMaxFiles`. Configure it under `rotate` in `~/.gina/user/extensions/logger/file/config.json`, where the container is already enabled: `enabled` (default true), `when` (`"daily"` or null), `size` (default `"10MB"`), `count` (default 5) and `maxAge` (e.g. `"30d"`, off by default). The live file is renamed and reopened rather than copied and truncated, so no line is lost while rotating, and the sink holds one append stream per group over a synchronously opened descriptor — which is what lets a burst of lines logged in a single tick rotate correctly, since a stream that opens asynchronously has no file to rename yet. A size or age without an explicit unit is refused rather than guessed — `"10"` is never read as bytes — and any invalid value disables rotation with a message naming the key, the value and the consequence, reported through the log flows so it reaches stdout and `gina tail`, while logging itself continues. Each log group is written to its own file, `<logdir>/<bundle>@<project>.log`. Two bounds are worth knowing: bytes still queued when a process exits can be lost, because flushing is asynchronous and making every write synchronous would let a full disk block the request loop; and a file that stops draining past a 4MB buffer drops lines with one warning per outage, the same posture the MQ transport already takes.
package/README.md CHANGED
@@ -15,7 +15,7 @@ MVC framework for Node.js and Bun with built-in HTTP/2, multi-bundle architectur
15
15
 
16
16
  | Feature | Detail |
17
17
  | --- | --- |
18
- | HTTP/2 server | Built-in `isaac` engine — TLS, h2c, ALPN, HTTP/1.1 fallback, 103 Early Hints, CVE-hardened |
18
+ | HTTP/2 server | Built-in `isaac` engine — TLS, h2c, ALPN, HTTP/1.1 fallback, 103 Early Hints, RFC 9218 request priorities, CVE-hardened |
19
19
  | Multi-bundle | One project, N independent bundles with shared config and project layer |
20
20
  | Scope isolation | `local` / `beta` / `production` — per-request and per-record |
21
21
  | MVC routing | `routing.json` — declare routes in config, not code; O(m) radix trie lookup |
@@ -66,37 +66,32 @@ open https://localhost:3100
66
66
 
67
67
  > **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
68
 
69
- ## What's in 0.6.30
69
+ ## What's in 0.6.31
70
70
 
71
- > **Restart your bundles *and* rebuild them.** `lib/routing` and the validator's
72
- > client half both ship in the browser bundle, so `gina.min.js` changed and
73
- > `gina bundle:restart` alone leaves the old client running. Rebuild each
74
- > consuming bundle, then restart.
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.
75
75
 
76
- > **No settings reset.** `0.6.30` is a patch — the `shortVersion` stays `0.6`,
76
+ > **No settings reset.** `0.6.31` is a patch — the `shortVersion` stays `0.6`,
77
77
  > so your `~/.gina/0.6/settings.json` is untouched. (`0.6.0` was the reset.)
78
78
 
79
- **The isolation release.** Most of what changed here is one piece of in-flight
80
- work seeing another's state: a response rendered with a concurrent request's
81
- language and webroot, a framework error answered to whichever request was routed
82
- most recently, a later caller of an entity method handed an earlier call's
83
- record, and one bundle's templates resolving against another bundle's root. Each
84
- was invisible in development, because dev mode rebuilds per request what
85
- production shares. Alongside them, `self.getConfig()` stops deep-copying the
86
- resolved configuration on every call. Full detail in [CHANGELOG.md](./CHANGELOG.md).
87
-
88
- - **Security — a rendered response no longer carries a concurrent request's context (#B514).** The `getUrl`, `getWebroot`, `t` and `tIcu` filters resolved per-request context through a process-wide singleton on the default render path, and both delegates await between stamping it and invoking the template. Measured on a built release: 50 of 50 concurrent pairs served one response carrying the other's negotiated culture and webroot before the fix, 0 of 100 after.
89
- - **Security — a later caller no longer receives an earlier call's record (#B441).** An entity method that emitted its completion more than once per call buffered every surplus emit, and the next `util.promisify`-style caller consumed it as its own result. Where such a method reads a user-scoped record, an ownership check could pass on another principal's row. Development mode masked it entirely.
90
- - **Security — a failed `getConfig()` / `getLib()` no longer writes its stack to the response (#B533).** The helper behind the implicit globals answered in every scope with the raw stack install path, application file paths and line numbers and logged nothing. It now mints an incident `ref`, logs one full-detail line, and sends the message alone outside local scope.
91
- - **Changed`self.getConfig()` returns a copy-on-write view (#P40).** Reads pass through to the shared configuration at no copy cost and writes land in the call's own overlay. A route behind two middlewares reading `this.getConfig()` went from 14,719 ms to 1,884 ms per 3,000 requests. `structuredClone`, `Object.freeze` and `util.inspect` behave differently on a node you have not enumerated; `controller.getConfig.mode: "clone"` opts back out.
92
- - **Addedlog rotation for the logger's opt-in `file` container.** On by default at 10MB with 5 files kept, the same shape as the kubelet's own limits. The live file is renamed and reopened rather than copied and truncated, so no line is lost while rotating.
93
- - **Added`gina tail` honours the logger's JSON render mode (#B524).** With `GINA_LOG_FORMAT=json` on the tail process, every relayed line is written as one JSON object the JSON answer for a container running a framework daemon, where the tail relay is the only path a runtime line has to `kubectl logs`.
94
- - **Fixed — the default swig path renders through a per-bundle engine (#B514).** One bundle's template root can no longer reach another's `include` / `extends` resolution, and `self.engine` now points at the engine that actually renders the bundle.
95
- - **Fixed — a framework error is answered to the request that raised it (#B534).** The response came from a process-wide slot the router fills on every routed request and never clears, so a callback resuming after an `await` wrote its failure to a later request's client while its own caller hung until timeout.
96
- - **Fixed — the `query` validation rule no longer writes into shared proxy config (#B522).** A rule targeting another bundle set `method`, `path` and a route-derived `requestTimeout` on the process-wide proxy target, so a later live-check from a different route silently ran on the earlier route's deadline — and on HTTP/2 the timeout destroys the pooled session shared with every other request to that authority.
97
- - **Fixed — the logger's `file` container writes (#B523).** It connected to the MQ, received every line and wrote nothing; it is now an in-process transport writing only its own process's lines, needing no daemon.
98
- - **Fixed — `gina-container` applies the container logging preset itself (#B524).** A bundle it runs emits JSON and skips the MQ transport, instead of writing coloured text while two processes dial a listener that cannot exist in that topology. Explicit values still win.
99
- - **Fixed — a req-less `getRoute()` returns a boolean `isProxyHost` (#B537).** Cloning such a route no longer logs a warning, with a stack, for a value that was legitimately unset.
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
+ - **AddedRFC 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
+ - **Fixeda 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
+ - **Fixeda 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.
100
95
 
101
96
 
102
97
  ## Documentation
package/ROADMAP.md CHANGED
@@ -82,9 +82,10 @@ This roadmap covers planned features, architectural improvements, new connectors
82
82
  | **Q4 2026** | `0.6.28` ✅ | **Security**: absolute URLs built by an application-level `getRoute().toUrl()` no longer inherit another request's proxy context — after a single request carrying a port-less `Host` (an orchestrator probe, a sibling-bundle call) reached a worker, every later direct request on it built URLs from a worker-global, dropping the port on HTTP/1.1 and emitting the *last port-less client's host* verbatim on HTTP/2 + HTTPS, which is a host-header-injection class for application-built links and redirects; the proxied classification and proxy hostname now resolve from the request itself, and on earlier versions `server.proxy.requireForwardedHeaders` closes the port-less-`Host` path only. **Added**: `self.forward()` relays a `multipart/form-data` request, uploads included, through a new RFC 7578 encoder and a raw-body pass-through, bounded by the source bundle's upload cap (413 on breach, 400 for a body-less method). **Fixed**: `self.forward()` forwards to the route it resolves instead of the target bundle's webroot alone; the browser client no longer stays half-booted on a light page or inside a cross-origin iframe; the HTTP/2 `rel=preload` header is sent on every response rather than only the first per view; the automatic 103 Early Hints response fires at all; the Inspector View tab shows its assets map again; a custom error page carries its preloads and its external plugins; a retried HTTP/1 request goes out with its body; the fluent `.onComplete()` handles of `query()`, `store()`, `run()` and `Shell::run()` refuse a callback they cannot call, and the dead one on entity method objects is removed; `{% extends %}` extraction stops at its own directive and tolerates the layout being named ahead of it; `POST /_gina/maintenance` refuses an invalid `ttlSeconds` instead of arming an unbounded window. Restart your bundles **and rebuild them** — three of the fixes are browser-bundled. |
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
- | **Q1 2027** | `0.6.x` | HTTP/2 priorities (blocked on Node scheduler hooks) · Beemaster admin + visual translation editor |
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
+ | **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 |
86
87
  | **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) |
87
- | **2027** | `0.8.0` | Financial-messaging foundations — XML request/response handling · pluggable message-schema validation · IBAN/BIC validation rules · money & ISO 4217 minor-unit utilities · idempotency keys |
88
+ | **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. |
88
89
  | **2027** | `0.9.0` | Financial-integration heavyweights — entity-layer datastore transaction seam · message-queue connector family (AMQP / Kafka / IBM MQ) |
89
90
  | **Q3 2027** | `1.0.0` | First stable release — Windows alpha compatibility is a hard gate |
90
91
 
@@ -106,7 +107,7 @@ This roadmap covers planned features, architectural improvements, new connectors
106
107
  | ✅ | **Stale built-release watch** — For LOCAL production rehearsals. A bundle serving a built release under `local` scope + a non-dev env has no hot-reload, so after you edit source it silently keeps serving the stale build. Opt in via `server.releaseWatch` in `settings.json`: the bundle watches its SOURCE tree, compares fingerprints against the manifest release stamp, and surfaces staleness on `GET /_gina/release/status` and a live `GET /_gina/release/events` SSE stream (notify mode, the default) — or auto-rebuilds on change (opt-in `auto` mode). `POST /_gina/release/rebuild` rebuilds with an **idle-gated restart** that waits on in-flight HTTP requests and `gina.registerBusyProbe` application probes, so a restart never interrupts in-flight work. Hard-gated on `local` scope + a non-dev env — never active on a real cluster. | `0.5.18-alpha` | 2026-07-16 |
107
108
  | ✅ | **Popin eager preload** — Opt-in idle warming for AJAX popin content. Mark a trigger with `data-gina-dialog-preload="eager"` (case-insensitive) and the popin plugin fetches its content after `window` load, at browser idle — one trigger at a time, off the critical path — so opening feels instant with no second GET. Same safety gates as the hover/focus warm: the `"false"` opt-out and the disabled skip apply identically, and an eager warm and a hover warm coalesce into a single GET (whichever runs second is a no-op). The pass is skipped when the browser signals Save-Data. Default behavior is unchanged — hover/focus warm remains the default. | `0.5.21-alpha` | 2026-07-19 |
108
109
  | ✅ | **Upload progress + drag-and-drop** — Extend the `data-gina-form-upload-*` staged client layer with transfer progress and drop-target support. **Progress shipped** (`0.5.24-alpha.2`): the staging POST reports real upload progress (`xhr.upload.onprogress`) through the registered `uploadProgress.<id>` client event, a `data-gina-form-upload-on-progress` window callback, and a declarative indicator (`data-gina-form-upload-progress`, default `<fieldId>-progress`) with a fully managed lifecycle. **Drag-and-drop shipped** (`0.5.24-alpha.2`): an attribute-marked dropzone (`data-gina-form-upload-dropzone="<elementId>"`, explicit id, opt-in) accepting dropped files through the exact same staging pipeline as the native file input — group tagging, previews, hidden metadata fields, reset/delete and upload progress included — with `idle`/`over`/`dropped` CSS state hooks, file-drags-only reaction, and first-file truncation on single-file inputs. Opt-in attributes, zero new dependencies, no server-contract change. | `0.5.24-alpha.2` | 2026-07-22 |
109
- | 📋 | **Pluggable object storage** — Named drivers pairing an **adapter** (where the bytes live) with a **strategy** (how keys are laid out), behind one callback-shaped contract. Keys are opaque, so a later layout change never breaks stored references; writes publish atomically by temp-and-rename, so a reader never observes a partial object; and every object carries a metadata row written through a pluggable store seam — an embedded SQLite file by default, or a `connectors.json` entry when several processes share one root. A driver root that sits inside any web-served directory refuses the boot, since objects there would be publicly fetchable. Much of the layer has already shipped: the `local` adapter with the `sharded` (dated), `cas` (content-addressed, deduplicating, refcounted) and `stream` (large sequential media, with resumable out-of-order segment uploads) strategies, size tiering, byte-range reads, the metadata seam and its Couchbase store, boot validation, the `gina.storage()` accessor, upload groups publishing straight to a driver, the `storage:stats` / `storage:gc` / `storage:verify` maintenance CLI with its admin-gated `/_gina/storage/*` endpoints, and HTTP Range serving on both engines (`serveFromStorage()` — 206/416/304, conditional GET, strong key ETags). The `s3` adapter — storeless (the provider owns each object's metadata), S3-compatible, its client a project-side dependency, with presigned-URL offload serving (307) — has shipped on the development branch, completing the layer; the milestone closes with the release that carries it. | `0.8.x` | 2027 |
110
+ | | **Pluggable object storage** — Named drivers pairing an **adapter** (where the bytes live) with a **strategy** (how keys are laid out), behind one callback-shaped contract. Keys are opaque, so a later layout change never breaks stored references; writes publish atomically by temp-and-rename, so a reader never observes a partial object; and every object carries a metadata row written through a pluggable store seam — an embedded SQLite file by default, or a `connectors.json` entry when several processes share one root. A driver root that sits inside any web-served directory refuses the boot, since objects there would be publicly fetchable. Much of the layer has already shipped: the `local` adapter with the `sharded` (dated), `cas` (content-addressed, deduplicating, refcounted) and `stream` (large sequential media, with resumable out-of-order segment uploads) strategies, size tiering, byte-range reads, the metadata seam and its Couchbase store, boot validation, the `gina.storage()` accessor, upload groups publishing straight to a driver, the `storage:stats` / `storage:gc` / `storage:verify` maintenance CLI with its admin-gated `/_gina/storage/*` endpoints, and HTTP Range serving on both engines (`serveFromStorage()` — 206/416/304, conditional GET, strong key ETags). The `s3` adapter — storeless (the provider owns each object's metadata), S3-compatible, its client a project-side dependency, with presigned-URL offload serving (307) — completed the layer and shipped in `0.6.8`, which closes this milestone. Remaining maintenance verbs (`storage:migrate`, a deep `verify`, sharded verify) are demand-gated and tracked separately. | `0.6.8` | 2026-08-15 |
110
111
 
111
112
  ---
112
113
 
@@ -438,7 +439,7 @@ A cold audit of the Couchbase connector identified two critical security vulnera
438
439
  | ✅ | **Application-level rapid reset rate limiter** (CVE-2023-44487) — per-session stream creation counter | `0.3.13` | 2026-05-14 | The Isaac HTTP/2 session handler counts new streams in a rolling 1s window per session; over `maxStreamsPerSecond` (default 200) it sends a GOAWAY and closes the session. More targeted than `maxSessionRejectedStreams` (which counts refused streams, not created ones). Configurable via `settings.json` `http2Options.maxStreamsPerSecond`; `/_gina/info` exposes a `rapidResetBlocked` counter. |
439
440
  | ✅ | **Trailer support** — `stream.sendTrailers()` + `waitForTrailers: true` | `0.4.0` | 2026-05-22 | Opt-in HTTP/2 response trailers via `self.sendTrailers(fields)`. The render pipeline sets `waitForTrailers` and emits the trailing headers after the body (in the `wantTrailers` event), across all render delegates. Activated only when a controller calls `self.sendTrailers(fields)`; HTTP/1.1 and the no-trailers path are unchanged. For gRPC-style streaming (`grpc-status`) and content-integrity (`Digest`) use cases. |
440
441
  | ✅ | **Alt-Svc header** — advertise HTTP/3 availability | `0.4.2` | 2026-06-02 | Set `Alt-Svc: h3=":443"; ma=86400` response header to advertise HTTP/3 (QUIC) availability via a QUIC-capable reverse proxy (nginx, Caddy, Cloudflare). Gina does not need to implement QUIC — just announce it. Opt-in via `settings.server.json`. Native HTTP/3 is out of scope: Node.js has no stable QUIC API, and the standard deployment topology (Gina → proxy → client) already delivers HTTP/3 at the edge. |
441
- | 📋 | **RFC 9218 Extensible Priorities** — read, expose and propagate the `Priority: u=N, i` header | `0.6.x` | Q1 2027 | Read the client's declared urgency, expose it on the request, propagate it on outbound HTTP/2 calls, and use it where gina schedules its own work (async jobs, load shedding). Browsers do send it over HTTP/2 — Chrome spans the full urgency range and distinguishes documents, stylesheets, scripts, images and `fetch()` — while HTTP/1.1 sends nothing. Ordering the response writes themselves is **not** included: Node exposes no `PRIORITY_UPDATE` frame and no send-scheduler hook, so that half waits on the runtime. |
442
+ | | **RFC 9218 Extensible Priorities** — read, expose and propagate the `Priority: u=N, i` header | `0.6.31` | 2026-09-14 | Shipped: `req.priority` (urgency 0–7, the incremental flag, `present`) parsed on both engines, propagated on outbound `self.query()` / `self.forward()` calls (a caller-set header wins, `priority: false` suppresses), emitted with `self.setPriority()`, and consulted by the async-job worker through `startJob(fn, { urgency })` — explicit, never inherited from the request. Browsers do send it over HTTP/2 — Chrome spans the full urgency range and distinguishes documents, stylesheets, scripts, images and `fetch()` — while HTTP/1.1 sends nothing. Ordering the response writes themselves is **not** included: Node exposes no `PRIORITY_UPDATE` frame and no send-scheduler hook, so that half waits on the runtime. |
442
443
  | ✅ | **WebSocket over HTTP/2** (RFC 8441 extended CONNECT) — opt-in via `http2Options.enableConnectProtocol` (default off; https and cleartext h2c HTTP/2 bundles). From `onInitialize`, `app.onWebSocket(path, handler)` registers per-path WebSocket handlers; accepted streams arrive as full sessions backed by a built-in dependency-free RFC 6455 codec (auto-pong, timed close handshake, UTF-8 + close-code validation, payload/fragment DoS caps, backpressure passthrough, graceful shutdown drain). Unknown paths are refused with 404, plain CONNECT keeps its 405, and default-off deployments are byte-identical. **Extended in `0.5.5`:** endpoints are declarable in `routing.json` (`method: "ws"` + `param.wsHandler` → `channels/<name>.js`, `:param` paths, per-route `param.wsOptions`), and handlers can call other bundles over HTTP with `session.query()`. | `0.4.7` | 2026-06-11 |
443
444
 
444
445
  ---
@@ -0,0 +1 @@
1
+ 0.6.31
@@ -3037,6 +3037,33 @@ if ( ( typeof(module) !== 'undefined' ) && module.exports ) {
3037
3037
  * `_validator.<rule>` namespace (catalog wins per key, English defaults fill).
3038
3038
  * A non-string (e.g. the routing-mode rule object) is ignored by the overlay guard.
3039
3039
  * */
3040
+ /**
3041
+ * Own-property count, reached WITHOUT the shadowable `<container>.count()` lookup (#B546).
3042
+ *
3043
+ * gina installs a `count()` helper on `Object.prototype` (`utils/prototypes.js`), so the
3044
+ * shorthand is an ordinary property lookup that an OWN property of the same name shadows.
3045
+ * Every container counted through this function is keyed by the CLIENT — a request body, a
3046
+ * query bag, route params, uploaded files, caller-supplied query data — so one field named
3047
+ * `count` made the framework call a string instead of the helper: a 500 on the guarded body
3048
+ * branches, and an uncaughtException that exited the process on the unguarded query ones.
3049
+ *
3050
+ * `ownCount()` reaches the helper itself, which no own property can
3051
+ * shadow, and is the same function body, so every receiver shape counts exactly as before.
3052
+ * The null/undefined branch is deliberate rather than defensive: `.call(null)` would bind
3053
+ * `this` to the global object and return ITS key count, while the shorthand threw — and the
3054
+ * empty-object seeding in the body-parse branches is built on that throw.
3055
+ *
3056
+ * @param {*} container - Any value the shorthand would have been called on.
3057
+ * @returns {number} Own enumerable property count.
3058
+ * @inner
3059
+ */
3060
+ function ownCount(container) {
3061
+ if (container === null || typeof container === 'undefined') {
3062
+ return container.count(); // preserve the exact TypeError the shorthand raised
3063
+ }
3064
+ return Object.prototype.count.call(container);
3065
+ }
3066
+
3040
3067
  function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet, culture) {
3041
3068
 
3042
3069
  var isGFFCtx = ( ( typeof(module) !== 'undefined' ) && module.exports ) ? false : true;
@@ -4250,7 +4277,10 @@ function FormValidatorUtil(data, $fields, xhrOptions, fieldsSet, culture) {
4250
4277
  : serverInstance;
4251
4278
  controller.setOptions(request, response, next, controllerOptions);
4252
4279
 
4253
- var data = ( typeof(options.data) == 'object' && options.data.count() > 0 )
4280
+ // #B546 `options.data` carries the rule's declared data merged with the request's
4281
+ // own body/query bag (lib/routing), so its keys are client-chosen; counted through
4282
+ // `Object.prototype.count` so a field named `count` cannot shadow the helper.
4283
+ var data = ( typeof(options.data) == 'object' && ownCount(options.data) > 0 )
4254
4284
  ? options.data
4255
4285
  : {};
4256
4286
  // inherited data from current query asking for validation
@@ -52,7 +52,7 @@ G[u]==null||typeof G[u][T]=='undefined'||p[u][T]!=G[u][T]||(v[u]=A?G[u]:p[u]):v.
52
52
  !1);return!G.constructor||A||T?!0:!1};K.setKeyComparison=function(G){L.keyComparison=G;return K};K.getKeyComparison=function(){var G=L.keyComparison||'id';L.keyComparison='id';return G};return K}typeof module!=='undefined'&&module.exports?(typeof JSON.clone=='undefined'&&(JSON.clone=require(__dirname+'/../../../../../utils/prototypes.json_clone')),module.exports=Merge()):typeof define==='function'&&define.amd&&define('lib/merge',[],function(){return Merge()});
53
53
  var _alphabet='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',_mask=63,_step=7;function uuid(g){g=g||4;for(var v=g<=4?_step:Math.ceil(1.6*(_mask+1)*g/_alphabet.length),F='';;)for(var K=crypto.getRandomValues(new Uint8Array(v)),L=0;L<v;L++){var H=K[L]&_mask;if(H<62&&(F+=_alphabet[H],F.length===g))return F}}
54
54
  uuid.customAlphabet=function(g,v){v=v||4;for(var F=1;F<g.length-1;)F=F<<1|1;var K=Math.ceil(1.6*(F+1)*v/g.length);K<5&&(K=5);return function(L){L=L||v;for(var H='';;)for(var G=crypto.getRandomValues(new Uint8Array(K)),p=0;p<K;p++){var A=G[p]&F;if(A<g.length&&(H+=g[A],H.length===L))return H}}};
55
- if(typeof module!=='undefined'&&module.exports){if(typeof crypto==='undefined'||typeof crypto.getRandomValues!=='function'){var _webcrypto=require('crypto').webcrypto||require('crypto');typeof globalThis!=='undefined'?globalThis.crypto=_webcrypto:crypto=_webcrypto}module.exports=uuid}else typeof define==='function'&&define.amd&&define('lib/uuid',[],function(){return uuid});
55
+ if(typeof module!=='undefined'&&module.exports){if(typeof crypto==='undefined'||typeof crypto.getRandomValues!=='function'){var _webcrypto=require('crypto').webcrypto||require('crypto');typeof globalThis!=='undefined'?globalThis.crypto=_webcrypto:crypto=_webcrypto}module.exports=uuid}else typeof define==='function'&&define.amd&&define('lib/uuid',[],function(){return uuid});function ownCount(g){return g===null||typeof g==='undefined'?g.count():Object.prototype.count.call(g)}
56
56
  function FormValidatorUtil(g,v,F,K,L){var H=typeof module!=='undefined'&&module.exports?!1:!0,G=H?require('lib/merge'):require('../../../../../lib/merge');H||require('../../../../../helpers');H&&require('helpers/dateFormat');var p=H?require('lib/routing'):require('../../../../../lib/routing'),A=H?null:require('../../../../../lib/i18n'),T=function(){if(typeof document==='undefined'||!document||typeof document.cookie!=='string')return null;var Q=document.cookie||'';if(!Q)return null;Q=Q.split(';');
57
57
  for(var X=0,ha=Q.length;X<ha;++X){for(var Fa=Q[X];Fa.charAt(0)===' '||Fa.charAt(0)==='\t';)Fa=Fa.slice(1);var N=Fa.indexOf('=');if(!(N<0)&&Fa.slice(0,N)==='gina-csrf-token'){Q=Fa.slice(N+1);try{return decodeURIComponent(Q)}catch(P){return Q}}}return null},q=function(Q){if(typeof Q!=='string'||!Q)return!1;Q=Q.toUpperCase();return Q!=='GET'&&Q!=='HEAD'&&Q!=='OPTIONS'},u=function(){var Q=!1,X=null;H?H&&typeof gina.forms!='undefined'&&(X=gina.forms):X=getContext('gina').forms||null;X&&typeof X.validators!=
58
58
  'undefined'&&(Q=!0);return Q},y={errors:{},keys:{'%l':'label','%n':'name','%s':'size'},errorLabels:{},data:{},excluded:[]},k={is:'Condition not satisfied',isEmail:'A valid email is required',isRequired:'Cannot be left empty',isBoolean:'Must be a valid boolean',isNumber:'Must be a number: allowed values are integers or floats',isNumberLength:'Must contain %s characters',isNumberMinLength:'Should be at least %s characters',isNumberMaxLength:'Should not be more than %s characters',isInteger:'Must be an integer',
@@ -82,7 +82,7 @@ A=async function(Q,X,ha,Fa){var N=(new (require(_(GINA_FRAMEWORK_DIR+'/core/conf
82
82
  Ja=JSON.clone(p.getRoute(Q.url,Q.data));var ma=N[da][N.env],Oa=ma.content.server;typeof Oa._cached=='undefined'&&(Oa._cached=new Map);typeof Oa._cachedPath=='undefined'&&(Oa._cachePath=Oa.cache.path);typeof Oa._cacheIsEnabled=='undefined'&&(Oa._cacheIsEnabled=Oa.cache.enable);P||(N.bundle==da&&(P=getConfig(va,'settings').server.credentials,Q.ca=P.ca||null,Q.hostname=ma.server.scheme+'://'+ma.host,Q.port=ma.port[ma.server.protocol][ma.server.scheme],Q.protocol=ma.server.protocol,Q.rejectUnauthorized=
83
83
  !1),P={ca:Q.ca,hostname:Q.hostname,port:Q.port,path:Q.path},typeof Q.protocol!='undefined'&&(P.protocol=Q.protocol),typeof Q.rejectUnauthorized!='undefined'&&(P.rejectUnauthorized=Q.rejectUnauthorized));ia={method:Ja.method,requirements:Ja.requirements,namespace:Ja.namespace||void 0,url:decodeURI(Ja.url),rule:ia+'@'+da,param:JSON.clone(Ja.param),middleware:JSON.clone(Ja.middleware),bundle:Ja.bundle,isXMLRequest:X.isXMLRequest,isWithCredentials:X.isWithCredentials};da=ia.rule.replace('@'+da,'')||'_common';
84
84
  da={template:typeof ma.content.templates!='undefined'?ma.content.templates[da]||ma.content.templates._common:void 0,isCacheless:ma.isCacheless};da=G(da,ia);ma=JSON.clone(ma);da.conf=ma;da.conf.content.routing[da.rule].param=ia.param;da.template&&typeof da.template.ginaLoader=='undefined'&&(da.template.ginaLoader=da.conf.content.templates._common.ginaLoader);da.conf.content.routing[da.rule].param=ia.param;delete da.middleware;delete da.param;delete da.requirements;ma=new (require(_(GINA_FRAMEWORK_DIR+
85
- '/core/controller/controller.js'),!0))(da);ma.name=Ja.param.control;ma.serverInstance=process.gina&&process.gina._serverInstance?process.gina._serverInstance:Oa;ma.setOptions(X,ha,Fa,da);X=typeof Q.data=='object'&&Q.data.count()>0?Q.data:{};if(/^get|delete|put$/i.test(Q.method)){ha=0;for(let Ma in X)typeof X[Ma]=='object'&&encodeRFC5987ValueChars(JSON.stringify(X[Ma])),ha++}P.method=Q.method;P.path=Ja.url;Q=require('util').promisify;var ja={isValid:!1},Ca=!1;await Q(ma.query)(P,X).then(function(Ma){ja=
85
+ '/core/controller/controller.js'),!0))(da);ma.name=Ja.param.control;ma.serverInstance=process.gina&&process.gina._serverInstance?process.gina._serverInstance:Oa;ma.setOptions(X,ha,Fa,da);X=typeof Q.data=='object'&&ownCount(Q.data)>0?Q.data:{};if(/^get|delete|put$/i.test(Q.method)){ha=0;for(let Ma in X)typeof X[Ma]=='object'&&encodeRFC5987ValueChars(JSON.stringify(X[Ma])),ha++}P.method=Q.method;P.path=Ja.url;Q=require('util').promisify;var ja={isValid:!1},Ca=!1;await Q(ma.query)(P,X).then(function(Ma){ja=
86
86
  Ma}).catch(function(Ma){Ca=Ma});Ca&&(console.error(Ca),ja.error=Ca);return ja};var ea=null;ea=H?la:A;var ta=function(Q,X){var ha=null,Fa=null;typeof m[Q]=='undefined'&&typeof X!='undefined'&&(m[Q]=ha=X);if(typeof m[Q]=='object')try{ha=JSON.parse(JSON.stringify(m[Q]))}catch(N){ha=m[Q]}else ha=m[Q];Fa='';H&&typeof v!='undefined'&&(Fa=v[Q].getAttribute('data-gina-form-field-label')||'');m[Q]={target:H&&typeof v!='undefined'?v[Q]:null,name:Q,value:ha,valid:!1,label:Fa,exclude:!1};m[Q].is=function(N,P,
87
87
  ia){var da=!1,va=typeof window!='undefined'?window:typeof global!='undefined'?global:null,Ja=va&&typeof va._currentValidatorAlias!='undefined'?va._currentValidatorAlias:'is';va&&va._currentValidatorAlias&&delete va._currentValidatorAlias;va=m[this.name].errors||{};y.data[this.name]=m[this.name].value;this.value===''&&(da=!0);if(!da&&/^(true|false)$/i.test(N))da=N;else if(!da){var ma=null,Oa=null;if(/[!=>><a-z 0-9]+/i.test(N)){if((Oa=N.match(/\${0}[-_,.\[\]a-z0-9]+/ig))&&Oa.length>0){for(var ja=0,
88
88
  Ca=Oa.length;ja<Ca;++ja)typeof m[Oa[ja]]!='undefined'&&Oa[ja]&&(ma=new RegExp('\\$'+Oa[ja]+'(?!\\S+)','g'),N=m[Oa[ja]].value==''?N.replace(ma,'""'):typeof m[Oa[ja]].value=='string'?N.replace(ma,'"'+m[Oa[ja]].value+'"'):N.replace(ma,m[Oa[ja]].value));try{if(/^\//.test(N)){var Ma=N.match(/^\/(.+)\/([a-z]*)$/);if(!Ma)throw Error('Invalid regex literal: `'+N+'`');da=(new RegExp(Ma[1],Ma[2])).test(this.value)}else{N=N.replace(/(\(|\)|return)/g,'');Ma=/^\s*(null|undefined|true|false|"[^"]*"|-?\d+(?:\.\d+)?)\s*(===|!==|<=|>=|==|!=|<|>)\s*(null|undefined|true|false|"[^"]*"|-?\d+(?:\.\d+)?)\s*$/;
@@ -8,6 +8,7 @@
8
8
  */
9
9
  //Imports.
10
10
  var fs = require('fs');
11
+ var path = require('path');
11
12
  var os = require('os');
12
13
  var dns = require('dns');
13
14
  var util = require('util');
@@ -241,6 +242,14 @@ function Config(opt, contextResetNeeded) {
241
242
  console.error(_bundlesMsg);
242
243
  // Guarantee the reason survives process.exit() on an async pipe (e.g. bin/gina-container).
243
244
  try { fs.writeSync(2, _bundlesMsg + '\n'); } catch (_e) { /* best-effort */ }
245
+ // #B542 — retain the reason. Init is fully SYNCHRONOUS, so this
246
+ // branch runs INSIDE `new Config(...)` while the exit below is
247
+ // still only scheduled; a caller that chains `.getInstance()` in
248
+ // the same statement (helpers/context.js does) gets there first,
249
+ // with `Config.initialized` and `Config.instance` both unset.
250
+ // Without this, getInstance had nothing to report and invented an
251
+ // instance instead — see the guard in getInstance below.
252
+ Config.initError = err;
244
253
  setTimeout(() => {
245
254
  process.exit(1);
246
255
  }, 0);
@@ -310,11 +319,34 @@ function Config(opt, contextResetNeeded) {
310
319
  * @memberof module:gina/core/config
311
320
  * @param {string} [bundle] - Bundle name; omit to return the full envConf
312
321
  * @returns {object|undefined} Config instance, envConf slice, or undefined
322
+ * @throws {Error} If initialisation aborted — the retained reason, named (#B542)
313
323
  */
314
324
  this.getInstance = function(bundle) {
315
325
 
326
+ // #B542 — refuse rather than fabricate. When init aborted, `Config.instance`
327
+ // is undefined (it is only assigned on the success branch) and the process is
328
+ // already scheduled to exit; a caller reaching here in the meantime used to
329
+ // fall into the merge below and get something that is not a Config back. Say
330
+ // what actually went wrong, once, instead of a downstream TypeError that names
331
+ // neither the bundle nor the file.
332
+ if ( typeof(Config.initialized) == 'undefined' && Config.initError ) {
333
+ throw new Error('[ CONFIG ] initialisation failed — '
334
+ + (Config.initError.message || Config.initError));
335
+ }
336
+
316
337
  if ( typeof(Config.instance) == 'undefined' && typeof(getContext('gina')) != 'undefined' ) {
317
- Config.instance = merge( self, getContext('gina').config, true );
338
+ // #B542 — lib/merge returns a non-object source WHOLESALE, and the worker
339
+ // branch of helpers/context.js puts the Config CONSTRUCTOR on `gina.config`.
340
+ // Unguarded, that made `Config.instance === Config`, whose `.Env` is
341
+ // undefined — the self-sustaining `Cannot set properties of undefined
342
+ // (setting 'parent')` two lines down, which survives every later call
343
+ // because this block's own guard then reads as satisfied.
344
+ var _merged = merge( self, getContext('gina').config, true );
345
+ if ( typeof(_merged) != 'object' || !_merged ) {
346
+ throw new Error('[ CONFIG ] cannot resolve an instance: the global context holds no usable `gina.config` (got '
347
+ + (_merged === null ? 'null' : typeof(_merged)) + ')');
348
+ }
349
+ Config.instance = _merged;
318
350
  self.envConf = Config.instance.envConf
319
351
  }
320
352
 
@@ -916,11 +948,50 @@ function Config(opt, contextResetNeeded) {
916
948
  // reverted: async readdir (#P33) breaks synchronous Config init contract
917
949
  configFiles = fs.readdirSync(_(appSrcPath + '/config'));
918
950
  } catch (srcReadErr) {
919
- return callback(srcReadErr);
951
+ // #B542 — the last-chance branch: the release tree had no
952
+ // readable config/ and neither does the source tree. Report
953
+ // BOTH paths. `appPath` still holds the release link here
954
+ // (the `appPath = appSrcPath` reassignment is below), so the
955
+ // operator sees exactly what was tried and in what order,
956
+ // instead of a bare ENOENT naming only the second attempt.
957
+ let _noConfigMsg = '[ ' + app + ' ][ ' + env + ' ] no readable config/ in the release tree ('
958
+ + appPath + ') nor in the source tree (' + appSrcPath + ') — '
959
+ + (srcReadErr.message || srcReadErr) + '; refusing to start';
960
+ console.error(_noConfigMsg);
961
+ // Guarantee the reason survives process.exit() on an async pipe (e.g. bin/gina-container).
962
+ try { fs.writeSync(2, _noConfigMsg + '\n'); } catch (_e) { /* best-effort */ }
963
+ return callback(new Error(_noConfigMsg));
920
964
  }
921
- setPath('bundles', _(appSrcPath, true));
965
+ // #B542 — this fallback is PER-APP and must stay per-app. It used to
966
+ // do two things that outlived the one bundle it was recovering:
967
+ //
968
+ // 1. `setPath('bundles', _(appSrcPath, true))` wrote this ONE
969
+ // bundle's own directory into the process-global `bundles`
970
+ // registry, which every other writer (gna.js, helpers/context.js)
971
+ // and reader (this function's own `bundlesPath` initialiser,
972
+ // lib/proc.js's unmount) treats as the CONTAINER of all
973
+ // bundles. Nothing restored it. It is not load-bearing here —
974
+ // `appPath = appSrcPath` on the next line is what makes the
975
+ // src config readable — so it is simply gone.
976
+ // 2. `= bundlesPath =` reassigned the function-scoped loop local
977
+ // declared at the top of loadWithTemplate, which the guarded
978
+ // assignment above hands to every LATER app in this same loop.
979
+ // One bundle whose release tree carries no config/ therefore
980
+ // rewrote the config root of every bundle walked after it: in
981
+ // a non-dev env they silently loaded their SRC config instead
982
+ // of their release config, or died on a spliced path with an
983
+ // unnamed ENOENT.
984
+ //
985
+ // The old value was also computed by stripping `'/'+ app` from the
986
+ // path with an UNANCHORED, UNESCAPED RegExp keyed on the manifest
987
+ // KEY while the path carries the src DIRNAME — so it silently
988
+ // produced a wrong path whenever the two differ, whenever the
989
+ // project path contains the bundle's name earlier (`/demo` inside
990
+ // `/demo-x` is stripped first), or whenever the name carries a
991
+ // regex metacharacter. `path.dirname()` answers the same question
992
+ // ("which directory contains this bundle?") without any of that.
922
993
  appPath = appSrcPath;
923
- newContent[app][env].bundlesPath = bundlesPath = appSrcPath.replace( new RegExp('/'+ app), '' );
994
+ newContent[app][env].bundlesPath = path.dirname(appSrcPath);
924
995
  console.warn('[CONFIG] Dependency bundle config loaded from '+ appSrcPath);
925
996
  }
926
997
 
@@ -1783,7 +1854,20 @@ function Config(opt, contextResetNeeded) {
1783
1854
  try {
1784
1855
  configFiles = fs.readdirSync(_(appPath + '/config', true));
1785
1856
  } catch (configReadErr) {
1786
- return callback(configReadErr);
1857
+ // #B542 — name it. This abort ends the SHARED config load for every
1858
+ // bundle in the project, and the bare `callback(err)` it replaces sent
1859
+ // up a raw ENOENT whose only clue was a path — which, when it came from
1860
+ // loadWithTemplate's src fallback, was a path no operator had ever
1861
+ // written down. `bundle`, `env` and `appPath` are all in scope here, so
1862
+ // "which bundle?" costs nothing to answer. Same shape as the #B132
1863
+ // routing.json refusal below, with #B181(b)'s stderr flush.
1864
+ e = '[ ' + bundle + ' ][ ' + env + ' ] config directory not readable at '
1865
+ + appPath + '/config — ' + (configReadErr.message || configReadErr)
1866
+ + '; refusing to start';
1867
+ console.error(e);
1868
+ // Guarantee the reason survives process.exit() on an async pipe (e.g. bin/gina-container).
1869
+ try { fs.writeSync(2, e + '\n'); } catch (_e) { /* best-effort */ }
1870
+ return callback(new Error(e));
1787
1871
  }
1788
1872
 
1789
1873
  if ( sharedConfigPathObj.existsSync() ) {
@@ -1792,7 +1876,17 @@ function Config(opt, contextResetNeeded) {
1792
1876
  try {
1793
1877
  sharedConfigFiles = fs.readdirSync(sharedconfigPath);
1794
1878
  } catch (sharedReadErr) {
1795
- return callback(sharedReadErr);
1879
+ // #B542 — same treatment as the bundle config/ refusal above. The
1880
+ // path reached existsSync() one line earlier, so a failure here is a
1881
+ // permissions or race condition, not a typo — say which bundle's load
1882
+ // it killed and which directory it was.
1883
+ e = '[ ' + bundle + ' ][ ' + env + ' ] shared config directory not readable at '
1884
+ + sharedconfigPath + ' — ' + (sharedReadErr.message || sharedReadErr)
1885
+ + '; refusing to start';
1886
+ console.error(e);
1887
+ // Guarantee the reason survives process.exit() on an async pipe (e.g. bin/gina-container).
1888
+ try { fs.writeSync(2, e + '\n'); } catch (_e) { /* best-effort */ }
1889
+ return callback(new Error(e));
1796
1890
  }
1797
1891
  for (let i=0, len = sharedConfigFiles.length; i<len; i++) {
1798
1892
  let file = sharedConfigFiles[i];
@@ -818,7 +818,7 @@ function Couchbase(conn, infos) {
818
818
  //
819
819
  // For more, visit :
820
820
  // - https://blog.couchbase.com/high-performance-consistency/
821
- // - https://developer.couchbase.com/documentation/server/current/architecture/querying-data-with-n1ql.html
821
+ // - https://docs.couchbase.com/server/current/learn/services-and-indexes/services/query-service.html
822
822
  // Query options values by default
823
823
  var queryOptions = {
824
824
  // Do not turn off the adhoc flag for each query since
@@ -10,6 +10,9 @@ var lib = gina.lib;
10
10
  var console = lib.logger;
11
11
  var merge = lib.merge;
12
12
  var modelUtil = new lib.Model();
13
+ // #B432 — per-call at-most-once settle guard for a connector outcome
14
+ // (core/connectors/settle-once.js).
15
+ var settleOnce = require('./../../settle-once');
13
16
 
14
17
 
15
18
  /**
@@ -24,6 +27,10 @@ var modelUtil = new lib.Model();
24
27
  * `1m` will set the ping interval to 1 minute
25
28
  * `1h` will set the ping interval to 1 hour
26
29
  * `1d` will set the ping interval to 1 day
30
+ * - readyTimeout (default: 50000)
31
+ * milliseconds to wait for the connector to become ready at boot before
32
+ * failing loudly. Values at or above the CLI's ~64s bundle-start budget
33
+ * (`lib/cmd/bundle/start.js`) cannot take effect.
27
34
  *
28
35
  * @class
29
36
  * */
@@ -39,6 +46,8 @@ function Connector(dbString) {
39
46
  collection: '_default', // by default
40
47
  keepAlive: true,
41
48
  pingInterval : "2m",
49
+ // #B541 — boot readiness deadline, in milliseconds.
50
+ readyTimeout: 50000,
42
51
  configProfile: "wan"
43
52
  }
44
53
  }
@@ -47,6 +56,38 @@ function Connector(dbString) {
47
56
  }
48
57
  ;
49
58
 
59
+ // #B541 — boot readiness state. `_markSettled()` records that `ready` has
60
+ // been settled and disarms the boot deadline armed in init(); it does NOT
61
+ // gate `self.emit('ready', …)`. Repeat emits are load-bearing:
62
+ // `core/model/index.js` attaches a persistent `.on('ready')` that surfaces
63
+ // reconnect churn on the Inspector event signal, and both `onReady`
64
+ // consumers register `once`, which already drops a late delivery.
65
+ var _settled = false
66
+ , _deadlineId = null
67
+ ;
68
+
69
+ /**
70
+ * Record that `ready` has been settled and disarm the boot deadline.
71
+ *
72
+ * Idempotent — a reconnect calls it again, by which point the timer is
73
+ * already `null`.
74
+ *
75
+ * @memberof Connector
76
+ * @inner
77
+ * @returns {void}
78
+ *
79
+ * @example
80
+ * _markSettled();
81
+ * self.emit('ready', false, self.instance);
82
+ */
83
+ var _markSettled = function() {
84
+ _settled = true;
85
+ if (_deadlineId) {
86
+ clearTimeout(_deadlineId);
87
+ _deadlineId = null;
88
+ }
89
+ };
90
+
50
91
  /**
51
92
  * arrayToValues
52
93
  * Eg.: array like: ['a', 0.5, 'b', false]
@@ -72,7 +113,25 @@ function Connector(dbString) {
72
113
  // Attention: the connection is lost 5 minutes once the bucket is opened.
73
114
  var conn = null;
74
115
 
75
- var onError = function (err, next) {
116
+ // #B541 one outcome per connect attempt.
117
+ //
118
+ // On failure the couchbase SDK settles BOTH of its channels: it invokes
119
+ // the onBucketOpened callback AND rejects the awaited promise. So a
120
+ // single failed attempt called onError twice, arming TWO retry chains —
121
+ // and each of those, failing in turn, armed two more (2 -> 4 -> 8 ...) —
122
+ // while double-counting _reconnectAttempts, so the backoff escalated at
123
+ // twice the intended rate and reached its 60s cap after five real
124
+ // attempts instead of ten. The guard is minted PER connect() invocation,
125
+ // never at module scope, so a later reconnect's own attempt stays
126
+ // independently reportable.
127
+ var onError = settleOnce('couchbase-v' + sdk.version + ':connector#connect', function onErrorImpl(err, next) {
128
+ // The promise channel can run WITHOUT the callback channel having
129
+ // run first (a rejection that never calls back), and only the
130
+ // callback channel assigns self.instance — which is not initialised
131
+ // at construction. Without this guard that ordering throws here,
132
+ // before any retry is armed, and the throw surfaces only as an
133
+ // unhandled rejection of the bare self.connect(dbString) call.
134
+ if (!self.instance) self.instance = {};
76
135
  delete self.instance.reconnecting;
77
136
  self.instance.reconnected = self.instance.connected = false;
78
137
  console.debug('[CONNECTOR][' + local.bundle +'] Scope is: '+ process.env.NODE_SCOPE );
@@ -98,7 +157,7 @@ function Connector(dbString) {
98
157
  }
99
158
  }, _backoffDelay)
100
159
 
101
- };
160
+ }, console);
102
161
 
103
162
  // once
104
163
  var onConnect = function onConnect(cb){
@@ -239,6 +298,8 @@ function Connector(dbString) {
239
298
  // setTimeout(() => {
240
299
  // self.emit('ready', false, self.instance);
241
300
  // }, 300);
301
+ // #B541 — disarm the boot deadline; the emit itself stays ungated.
302
+ _markSettled();
242
303
  self.emit('ready', false, self.instance);
243
304
  }
244
305
 
@@ -392,6 +453,40 @@ function Connector(dbString) {
392
453
  dbString = merge(dbString, local.options);
393
454
  local.options = dbString;
394
455
 
456
+ // #B541 — arm the boot readiness deadline.
457
+ //
458
+ // Every failure path in connect() routes to onError(), which only
459
+ // re-arms a retry — it never emits. Without this, a connector that
460
+ // cannot reach couchbase at boot NEVER settles: lib/model.js's
461
+ // all-or-nothing ready gate never closes, the bundle never prints
462
+ // the flags bundle:start watches for, and the CLI SIGKILLs it at
463
+ // ~64s (lib/cmd/bundle/start.js: maxRetry 15 x maxTimeout 4000ms)
464
+ // with no terminal error logged anywhere.
465
+ //
466
+ // lib/model.js's onModelReady ALREADY handles an error correctly —
467
+ // console.error + process.exit(1) — and that is how every other
468
+ // connector reports a dead database. It was simply unreachable
469
+ // here. So if nothing has settled by the deadline, emit the error
470
+ // ourselves and let that existing path run.
471
+ //
472
+ // NOT a retry cap: onError's uncapped reconnect is untouched, so a
473
+ // connector that HAS settled still recovers from a later blip.
474
+ // Deliberately NOT unref'd — were this the only handle holding the
475
+ // event loop, unref would let node exit 0 silently instead of
476
+ // reporting, and onError's retry timer already holds the loop.
477
+ var _readyTimeout = ( typeof(local.options.readyTimeout) == 'number' && local.options.readyTimeout > 0 )
478
+ ? local.options.readyTimeout
479
+ : 50000;
480
+
481
+ if ( !_settled && !_deadlineId ) {
482
+ _deadlineId = setTimeout(function onReadyDeadline() {
483
+ _deadlineId = null;
484
+ if (_settled) return;
485
+
486
+ _markSettled();
487
+ self.emit('ready', new Error('[CONNECTOR][' + local.bundle +'][' + dbString.connector +'][' + dbString.database +'] Couchbase did not become ready within '+ (_readyTimeout/1000) +'s @`'+ dbString.protocol + dbString.host +'`\nCheck:\n - if couchbase is running and reachable from this host\n - if bucket `'+ dbString.database +'` exists\n - if the credentials are valid\nRaise `readyTimeout` on this connector entry to wait longer; it must stay under the ~64s bundle-start budget to take effect.'), null);
488
+ }, _readyTimeout);
489
+ }
395
490
 
396
491
  console.info('[CONNECTOR][' + local.bundle +'][' + dbString.connector +'][' + dbString.database +'] authenticating to couchbase cluster @'+ dbString.protocol + dbString.host);
397
492
 
@@ -410,6 +505,8 @@ function Connector(dbString) {
410
505
 
411
506
  } catch (err) {
412
507
  console.error(err.stack);
508
+ // #B541 — a synchronous throw already settles; disarm the deadline.
509
+ _markSettled();
413
510
  self.emit('ready', err, null)
414
511
  }
415
512
  }