gina 0.6.14 → 0.6.15

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 (593) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +22 -25
  3. package/ROADMAP.md +1 -0
  4. package/framework/v0.6.15/VERSION +1 -0
  5. package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +1 -1
  6. package/framework/v0.6.15/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  7. package/framework/v0.6.15/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  8. package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/js/gina.js +120 -8
  9. package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +458 -456
  10. package/framework/v0.6.15/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  11. package/framework/v0.6.15/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  12. package/framework/{v0.6.14 → v0.6.15}/core/connectors/couchbase/index.js +41 -12
  13. package/framework/{v0.6.14 → v0.6.15}/lib/routing/src/main.js +9 -0
  14. package/framework/{v0.6.14 → v0.6.15}/package.json +1 -1
  15. package/gna.js +4 -4
  16. package/llms.txt +5 -3
  17. package/package.json +3 -3
  18. package/script/check_changie_entries.js +117 -23
  19. package/framework/v0.6.14/VERSION +0 -1
  20. package/framework/v0.6.14/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  21. package/framework/v0.6.14/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  22. package/framework/v0.6.14/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  23. package/framework/v0.6.14/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  24. /package/framework/{v0.6.14 → v0.6.15}/AUTHORS +0 -0
  25. /package/framework/{v0.6.14 → v0.6.15}/LICENSE +0 -0
  26. /package/framework/{v0.6.14 → v0.6.15}/core/asset/html/nolayout.html +0 -0
  27. /package/framework/{v0.6.14 → v0.6.15}/core/asset/html/static.html +0 -0
  28. /package/framework/{v0.6.14 → v0.6.15}/core/asset/img/android-chrome-192x192.png +0 -0
  29. /package/framework/{v0.6.14 → v0.6.15}/core/asset/img/android-chrome-512x512.png +0 -0
  30. /package/framework/{v0.6.14 → v0.6.15}/core/asset/img/apple-touch-icon.png +0 -0
  31. /package/framework/{v0.6.14 → v0.6.15}/core/asset/img/favicon-16x16.png +0 -0
  32. /package/framework/{v0.6.14 → v0.6.15}/core/asset/img/favicon-32x32.png +0 -0
  33. /package/framework/{v0.6.14 → v0.6.15}/core/asset/img/favicon.ico +0 -0
  34. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/README.md +0 -0
  35. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  36. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  37. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  38. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  39. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  40. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  41. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  42. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  43. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  44. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  45. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  46. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  47. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  48. /package/framework/{v0.6.14 → v0.6.15}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  49. /package/framework/{v0.6.14 → v0.6.15}/core/config.js +0 -0
  50. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/ai/index.js +0 -0
  51. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/ai/lib/connector.js +0 -0
  52. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/couchbase/lib/connector.js +0 -0
  53. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  54. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  55. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/couchbase/lib/n1ql.js +0 -0
  56. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/couchbase/lib/session-store.js +0 -0
  57. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  58. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  59. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/couchbase/lib/storage-store.js +0 -0
  60. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/duckdb/index.js +0 -0
  61. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/duckdb/lib/connector.js +0 -0
  62. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/mongodb/index.js +0 -0
  63. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/mongodb/lib/connector.js +0 -0
  64. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/mongodb/lib/job-store.js +0 -0
  65. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
  66. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/mongodb/lib/session-store.js +0 -0
  67. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/mysql/index.js +0 -0
  68. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/mysql/lib/connector.js +0 -0
  69. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/param-redact.js +0 -0
  70. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/postgresql/index.js +0 -0
  71. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/postgresql/lib/connector.js +0 -0
  72. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/redis/index.js +0 -0
  73. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/redis/lib/connector.js +0 -0
  74. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/redis/lib/job-store.js +0 -0
  75. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/redis/lib/kv-store.js +0 -0
  76. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/redis/lib/render-cache-store.js +0 -0
  77. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/redis/lib/session-store.js +0 -0
  78. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/scylladb/index.js +0 -0
  79. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/scylladb/lib/connector.js +0 -0
  80. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/scylladb/lib/session-store.js +0 -0
  81. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/sql-parser.js +0 -0
  82. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/sqlite/index.js +0 -0
  83. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/sqlite/lib/connector.js +0 -0
  84. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/sqlite/lib/job-store.js +0 -0
  85. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/sqlite/lib/kv-store.js +0 -0
  86. /package/framework/{v0.6.14 → v0.6.15}/core/connectors/sqlite/lib/session-store.js +0 -0
  87. /package/framework/{v0.6.14 → v0.6.15}/core/content.encoding +0 -0
  88. /package/framework/{v0.6.14 → v0.6.15}/core/controller/controller.framework.js +0 -0
  89. /package/framework/{v0.6.14 → v0.6.15}/core/controller/controller.js +0 -0
  90. /package/framework/{v0.6.14 → v0.6.15}/core/controller/controller.render-json.js +0 -0
  91. /package/framework/{v0.6.14 → v0.6.15}/core/controller/controller.render-nunjucks-async.js +0 -0
  92. /package/framework/{v0.6.14 → v0.6.15}/core/controller/controller.render-nunjucks.js +0 -0
  93. /package/framework/{v0.6.14 → v0.6.15}/core/controller/controller.render-stream.js +0 -0
  94. /package/framework/{v0.6.14 → v0.6.15}/core/controller/controller.render-swig-async.js +0 -0
  95. /package/framework/{v0.6.14 → v0.6.15}/core/controller/controller.render-swig.js +0 -0
  96. /package/framework/{v0.6.14 → v0.6.15}/core/controller/controller.render-v1.js +0 -0
  97. /package/framework/{v0.6.14 → v0.6.15}/core/controller/index.js +0 -0
  98. /package/framework/{v0.6.14 → v0.6.15}/core/controller/inspector-window-emit.js +0 -0
  99. /package/framework/{v0.6.14 → v0.6.15}/core/controller/release-banner.js +0 -0
  100. /package/framework/{v0.6.14 → v0.6.15}/core/dev/index.js +0 -0
  101. /package/framework/{v0.6.14 → v0.6.15}/core/dev/lib/class.js +0 -0
  102. /package/framework/{v0.6.14 → v0.6.15}/core/dev/lib/factory.js +0 -0
  103. /package/framework/{v0.6.14 → v0.6.15}/core/dev/lib/tools.js +0 -0
  104. /package/framework/{v0.6.14 → v0.6.15}/core/gna.js +0 -0
  105. /package/framework/{v0.6.14 → v0.6.15}/core/locales/README.md +0 -0
  106. /package/framework/{v0.6.14 → v0.6.15}/core/locales/currency.json +0 -0
  107. /package/framework/{v0.6.14 → v0.6.15}/core/locales/dist/language/en.json +0 -0
  108. /package/framework/{v0.6.14 → v0.6.15}/core/locales/dist/language/fr.json +0 -0
  109. /package/framework/{v0.6.14 → v0.6.15}/core/locales/dist/region/en.json +0 -0
  110. /package/framework/{v0.6.14 → v0.6.15}/core/locales/dist/region/fr.json +0 -0
  111. /package/framework/{v0.6.14 → v0.6.15}/core/locales/index.js +0 -0
  112. /package/framework/{v0.6.14 → v0.6.15}/core/mime.types +0 -0
  113. /package/framework/{v0.6.14 → v0.6.15}/core/model/entity.js +0 -0
  114. /package/framework/{v0.6.14 → v0.6.15}/core/model/index.js +0 -0
  115. /package/framework/{v0.6.14 → v0.6.15}/core/model/template/entityFactory.js +0 -0
  116. /package/framework/{v0.6.14 → v0.6.15}/core/model/template/index.js +0 -0
  117. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/README.md +0 -0
  118. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/index.js +0 -0
  119. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/csrf/README.md +0 -0
  120. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/csrf/package.json +0 -0
  121. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/csrf/src/main.js +0 -0
  122. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/README.md +0 -0
  123. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/coep/README.md +0 -0
  124. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/coep/package.json +0 -0
  125. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
  126. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/coop/README.md +0 -0
  127. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/coop/package.json +0 -0
  128. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
  129. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/corp/README.md +0 -0
  130. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/corp/package.json +0 -0
  131. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
  132. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/csp/README.md +0 -0
  133. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/csp/package.json +0 -0
  134. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
  135. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
  136. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
  137. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
  138. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/hsts/README.md +0 -0
  139. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/hsts/package.json +0 -0
  140. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
  141. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
  142. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
  143. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
  144. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/package.json +0 -0
  145. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
  146. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
  147. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
  148. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/src/main.js +0 -0
  149. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
  150. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
  151. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
  152. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
  153. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
  154. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
  155. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
  156. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
  157. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
  158. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
  159. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
  160. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
  161. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
  162. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
  163. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
  164. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
  165. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
  166. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
  167. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/session/README.md +0 -0
  168. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/session/package.json +0 -0
  169. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/session/src/main.js +0 -0
  170. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/storage/README.md +0 -0
  171. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/storage/build.json +0 -0
  172. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/storage/package.json +0 -0
  173. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/storage/src/main.js +0 -0
  174. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/validator/README.md +0 -0
  175. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/validator/build.json +0 -0
  176. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/validator/package.json +0 -0
  177. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/validator/src/form-validator.js +0 -0
  178. /package/framework/{v0.6.14 → v0.6.15}/core/plugins/lib/validator/src/main.js +0 -0
  179. /package/framework/{v0.6.14 → v0.6.15}/core/router.js +0 -0
  180. /package/framework/{v0.6.14 → v0.6.15}/core/server.express.js +0 -0
  181. /package/framework/{v0.6.14 → v0.6.15}/core/server.isaac.js +0 -0
  182. /package/framework/{v0.6.14 → v0.6.15}/core/server.js +0 -0
  183. /package/framework/{v0.6.14 → v0.6.15}/core/status.codes +0 -0
  184. /package/framework/{v0.6.14 → v0.6.15}/core/template/_gitignore +0 -0
  185. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle/config/app.json +0 -0
  186. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  187. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle/config/routing.json +0 -0
  188. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle/config/settings.json +0 -0
  189. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  190. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle/config/templates.json +0 -0
  191. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  192. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  193. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  194. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  195. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle/index.js +0 -0
  196. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle/locales/en.json +0 -0
  197. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  198. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  199. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  200. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  201. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  202. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
  203. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  204. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
  205. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_public/readme.md +0 -0
  206. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_public/sw.js +0 -0
  207. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  208. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  209. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  210. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  211. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
  212. /package/framework/{v0.6.14 → v0.6.15}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  213. /package/framework/{v0.6.14 → v0.6.15}/core/template/command/gina.bat.tpl +0 -0
  214. /package/framework/{v0.6.14 → v0.6.15}/core/template/command/gina.tpl +0 -0
  215. /package/framework/{v0.6.14 → v0.6.15}/core/template/conf/env.json +0 -0
  216. /package/framework/{v0.6.14 → v0.6.15}/core/template/conf/manifest.json +0 -0
  217. /package/framework/{v0.6.14 → v0.6.15}/core/template/conf/package.json +0 -0
  218. /package/framework/{v0.6.14 → v0.6.15}/core/template/conf/settings.json +0 -0
  219. /package/framework/{v0.6.14 → v0.6.15}/core/template/conf/statics.json +0 -0
  220. /package/framework/{v0.6.14 → v0.6.15}/core/template/conf/templates.json +0 -0
  221. /package/framework/{v0.6.14 → v0.6.15}/core/template/error/client/json/401.json +0 -0
  222. /package/framework/{v0.6.14 → v0.6.15}/core/template/error/client/json/403.json +0 -0
  223. /package/framework/{v0.6.14 → v0.6.15}/core/template/error/client/json/404.json +0 -0
  224. /package/framework/{v0.6.14 → v0.6.15}/core/template/error/server/html/50x.html +0 -0
  225. /package/framework/{v0.6.14 → v0.6.15}/core/template/error/server/json/500.json +0 -0
  226. /package/framework/{v0.6.14 → v0.6.15}/core/template/error/server/json/503.json +0 -0
  227. /package/framework/{v0.6.14 → v0.6.15}/core/template/extensions/logger/config.json +0 -0
  228. /package/framework/{v0.6.14 → v0.6.15}/helpers/console.js +0 -0
  229. /package/framework/{v0.6.14 → v0.6.15}/helpers/context.js +0 -0
  230. /package/framework/{v0.6.14 → v0.6.15}/helpers/data/LICENSE +0 -0
  231. /package/framework/{v0.6.14 → v0.6.15}/helpers/data/README.md +0 -0
  232. /package/framework/{v0.6.14 → v0.6.15}/helpers/data/package.json +0 -0
  233. /package/framework/{v0.6.14 → v0.6.15}/helpers/data/src/main.js +0 -0
  234. /package/framework/{v0.6.14 → v0.6.15}/helpers/dateFormat.js +0 -0
  235. /package/framework/{v0.6.14 → v0.6.15}/helpers/index.js +0 -0
  236. /package/framework/{v0.6.14 → v0.6.15}/helpers/json/LICENSE +0 -0
  237. /package/framework/{v0.6.14 → v0.6.15}/helpers/json/README.md +0 -0
  238. /package/framework/{v0.6.14 → v0.6.15}/helpers/json/package.json +0 -0
  239. /package/framework/{v0.6.14 → v0.6.15}/helpers/json/src/main.js +0 -0
  240. /package/framework/{v0.6.14 → v0.6.15}/helpers/path.js +0 -0
  241. /package/framework/{v0.6.14 → v0.6.15}/helpers/plugins/README.md +0 -0
  242. /package/framework/{v0.6.14 → v0.6.15}/helpers/plugins/package.json +0 -0
  243. /package/framework/{v0.6.14 → v0.6.15}/helpers/plugins/src/api-error.js +0 -0
  244. /package/framework/{v0.6.14 → v0.6.15}/helpers/plugins/src/main.js +0 -0
  245. /package/framework/{v0.6.14 → v0.6.15}/helpers/prototypes.js +0 -0
  246. /package/framework/{v0.6.14 → v0.6.15}/helpers/task.js +0 -0
  247. /package/framework/{v0.6.14 → v0.6.15}/helpers/text.js +0 -0
  248. /package/framework/{v0.6.14 → v0.6.15}/lib/admin/package.json +0 -0
  249. /package/framework/{v0.6.14 → v0.6.15}/lib/admin/src/main.js +0 -0
  250. /package/framework/{v0.6.14 → v0.6.15}/lib/archiver/README.md +0 -0
  251. /package/framework/{v0.6.14 → v0.6.15}/lib/archiver/build.json +0 -0
  252. /package/framework/{v0.6.14 → v0.6.15}/lib/archiver/package.json +0 -0
  253. /package/framework/{v0.6.14 → v0.6.15}/lib/archiver/src/dep/jszip.min.js +0 -0
  254. /package/framework/{v0.6.14 → v0.6.15}/lib/archiver/src/main.js +0 -0
  255. /package/framework/{v0.6.14 → v0.6.15}/lib/async/package.json +0 -0
  256. /package/framework/{v0.6.14 → v0.6.15}/lib/async/src/main.js +0 -0
  257. /package/framework/{v0.6.14 → v0.6.15}/lib/audit/package.json +0 -0
  258. /package/framework/{v0.6.14 → v0.6.15}/lib/audit/src/main.js +0 -0
  259. /package/framework/{v0.6.14 → v0.6.15}/lib/audit-store.js +0 -0
  260. /package/framework/{v0.6.14 → v0.6.15}/lib/authn/package.json +0 -0
  261. /package/framework/{v0.6.14 → v0.6.15}/lib/authn/src/lockout.js +0 -0
  262. /package/framework/{v0.6.14 → v0.6.15}/lib/authn/src/main.js +0 -0
  263. /package/framework/{v0.6.14 → v0.6.15}/lib/authn/src/totp.js +0 -0
  264. /package/framework/{v0.6.14 → v0.6.15}/lib/authz-gate/package.json +0 -0
  265. /package/framework/{v0.6.14 → v0.6.15}/lib/authz-gate/src/main.js +0 -0
  266. /package/framework/{v0.6.14 → v0.6.15}/lib/cache/README.md +0 -0
  267. /package/framework/{v0.6.14 → v0.6.15}/lib/cache/build.json +0 -0
  268. /package/framework/{v0.6.14 → v0.6.15}/lib/cache/package.json +0 -0
  269. /package/framework/{v0.6.14 → v0.6.15}/lib/cache/src/main.js +0 -0
  270. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/aliases.json +0 -0
  271. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/audit/arguments.json +0 -0
  272. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/audit/help.txt +0 -0
  273. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/audit/verify.js +0 -0
  274. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/add.js +0 -0
  275. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/arguments.json +0 -0
  276. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/build.js +0 -0
  277. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/copy.js +0 -0
  278. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/cp.js +0 -0
  279. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/help.js +0 -0
  280. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/help.txt +0 -0
  281. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
  282. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/list.js +0 -0
  283. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/man.js +0 -0
  284. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/mcp-start.js +0 -0
  285. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/mcp.js +0 -0
  286. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/oas.js +0 -0
  287. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/openapi.js +0 -0
  288. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/remove.js +0 -0
  289. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/rename.js +0 -0
  290. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/restart.js +0 -0
  291. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/rm.js +0 -0
  292. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/start.js +0 -0
  293. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/status.js +0 -0
  294. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/stop.js +0 -0
  295. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/bundle/types.js +0 -0
  296. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/cache/arguments.json +0 -0
  297. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/cache/clear.js +0 -0
  298. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/cache/help.txt +0 -0
  299. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/cache/stats.js +0 -0
  300. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/connector/add.js +0 -0
  301. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/connector/arguments.json +0 -0
  302. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/connector/help.js +0 -0
  303. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/connector/help.txt +0 -0
  304. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/connector/infer.js +0 -0
  305. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/connector/list.js +0 -0
  306. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/connector/migrate.js +0 -0
  307. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/connector/models.js +0 -0
  308. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/connector/remove.js +0 -0
  309. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/connector/rm.js +0 -0
  310. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/connector/test.js +0 -0
  311. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/container/arguments.json +0 -0
  312. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/container/help.js +0 -0
  313. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/container/help.txt +0 -0
  314. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/container/man.js +0 -0
  315. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/container/ps.js +0 -0
  316. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/container/stop.js +0 -0
  317. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/controller/add.js +0 -0
  318. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/controller/arguments.json +0 -0
  319. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/controller/help.txt +0 -0
  320. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/controller/inc/args.js +0 -0
  321. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/controller/inc/namespace.js +0 -0
  322. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
  323. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/controller/inc/reference-scan.js +0 -0
  324. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/controller/inc/scaffold.js +0 -0
  325. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/controller/remove.js +0 -0
  326. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/controller/rename.js +0 -0
  327. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/controller/rm.js +0 -0
  328. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/env/add.js +0 -0
  329. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/env/get.js +0 -0
  330. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/env/help.js +0 -0
  331. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/env/help.txt +0 -0
  332. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/env/link-dev.js +0 -0
  333. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/env/list.js +0 -0
  334. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/env/remove.js +0 -0
  335. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/env/rm.js +0 -0
  336. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/env/set.js +0 -0
  337. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/env/unset.js +0 -0
  338. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/env/use.js +0 -0
  339. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/add.js +0 -0
  340. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/arguments.json +0 -0
  341. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/build.js +0 -0
  342. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/dot.js +0 -0
  343. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/get.js +0 -0
  344. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/help.js +0 -0
  345. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/help.txt +0 -0
  346. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/init.js +0 -0
  347. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/link-node-modules.js +0 -0
  348. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/link.js +0 -0
  349. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/list.js +0 -0
  350. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/man.js +0 -0
  351. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/msg.json +0 -0
  352. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/open.js +0 -0
  353. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/remove.js +0 -0
  354. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/reset.js +0 -0
  355. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/restart.js +0 -0
  356. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/set.js +0 -0
  357. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/start.js +0 -0
  358. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/status.js +0 -0
  359. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/stop.js +0 -0
  360. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/tail.js +0 -0
  361. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/update.js +0 -0
  362. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/framework/version.js +0 -0
  363. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/gina-dev.1.md +0 -0
  364. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/gina-framework.1.md +0 -0
  365. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/gina.1.md +0 -0
  366. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/helper.js +0 -0
  367. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/i18n/add.js +0 -0
  368. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/i18n/arguments.json +0 -0
  369. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/i18n/export.js +0 -0
  370. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/i18n/help.js +0 -0
  371. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/i18n/help.txt +0 -0
  372. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/i18n/import.js +0 -0
  373. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/i18n/scan.js +0 -0
  374. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/image/_host.js +0 -0
  375. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/image/arguments.json +0 -0
  376. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/image/build.js +0 -0
  377. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/image/help.js +0 -0
  378. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/image/help.txt +0 -0
  379. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/image/list.js +0 -0
  380. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/image/man.js +0 -0
  381. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/image/rm.js +0 -0
  382. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/image/run.js +0 -0
  383. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/index.js +0 -0
  384. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/inspector/help.js +0 -0
  385. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/inspector/help.txt +0 -0
  386. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/inspector/open.js +0 -0
  387. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/man-render.js +0 -0
  388. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/minion/arguments.json +0 -0
  389. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/minion/help.js +0 -0
  390. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/minion/help.txt +0 -0
  391. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/minion/kill.js +0 -0
  392. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/minion/list.js +0 -0
  393. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/msg.json +0 -0
  394. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/port/help.js +0 -0
  395. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/port/help.txt +0 -0
  396. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/port/inc/scan.js +0 -0
  397. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/port/list.js +0 -0
  398. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/port/reset.js +0 -0
  399. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/port/set.js +0 -0
  400. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/add.js +0 -0
  401. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/arguments.json +0 -0
  402. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/backup.js +0 -0
  403. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/build.js +0 -0
  404. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/help.js +0 -0
  405. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/help.txt +0 -0
  406. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/import.js +0 -0
  407. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/list.js +0 -0
  408. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/man.js +0 -0
  409. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/move.js +0 -0
  410. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/remove.js +0 -0
  411. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/rename.js +0 -0
  412. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/restart.js +0 -0
  413. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/restore.js +0 -0
  414. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/rm.js +0 -0
  415. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/start.js +0 -0
  416. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/status.js +0 -0
  417. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/project/stop.js +0 -0
  418. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/protocol/arguments.json +0 -0
  419. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/protocol/help.js +0 -0
  420. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/protocol/help.txt +0 -0
  421. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/protocol/list.js +0 -0
  422. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/protocol/remove.js +0 -0
  423. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/protocol/set.js +0 -0
  424. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/scope/add.js +0 -0
  425. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/scope/help.js +0 -0
  426. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/scope/help.txt +0 -0
  427. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/scope/link-local.js +0 -0
  428. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/scope/link-production.js +0 -0
  429. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/scope/list.js +0 -0
  430. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/scope/remove.js +0 -0
  431. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/scope/rm.js +0 -0
  432. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/scope/use.js +0 -0
  433. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/secrets/arguments.json +0 -0
  434. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/secrets/check.js +0 -0
  435. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/secrets/help.js +0 -0
  436. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/secrets/help.txt +0 -0
  437. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/secrets/scan.js +0 -0
  438. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/service/help.js +0 -0
  439. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/service/help.txt +0 -0
  440. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/service/list.js +0 -0
  441. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/service/man.js +0 -0
  442. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/service/start.js +0 -0
  443. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/storage/arguments.json +0 -0
  444. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/storage/gc.js +0 -0
  445. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/storage/help.txt +0 -0
  446. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/storage/stats.js +0 -0
  447. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/storage/verify.js +0 -0
  448. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd/view/add.js +0 -0
  449. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd-status-format/package.json +0 -0
  450. /package/framework/{v0.6.14 → v0.6.15}/lib/cmd-status-format/src/main.js +0 -0
  451. /package/framework/{v0.6.14 → v0.6.15}/lib/collection/README.md +0 -0
  452. /package/framework/{v0.6.14 → v0.6.15}/lib/collection/build.json +0 -0
  453. /package/framework/{v0.6.14 → v0.6.15}/lib/collection/package.json +0 -0
  454. /package/framework/{v0.6.14 → v0.6.15}/lib/collection/src/main.js +0 -0
  455. /package/framework/{v0.6.14 → v0.6.15}/lib/config.js +0 -0
  456. /package/framework/{v0.6.14 → v0.6.15}/lib/connector-config/package.json +0 -0
  457. /package/framework/{v0.6.14 → v0.6.15}/lib/connector-config/src/main.js +0 -0
  458. /package/framework/{v0.6.14 → v0.6.15}/lib/connector-error/package.json +0 -0
  459. /package/framework/{v0.6.14 → v0.6.15}/lib/connector-error/src/main.js +0 -0
  460. /package/framework/{v0.6.14 → v0.6.15}/lib/connector-registry/package.json +0 -0
  461. /package/framework/{v0.6.14 → v0.6.15}/lib/connector-registry/src/main.js +0 -0
  462. /package/framework/{v0.6.14 → v0.6.15}/lib/cron/README.md +0 -0
  463. /package/framework/{v0.6.14 → v0.6.15}/lib/cron/package.json +0 -0
  464. /package/framework/{v0.6.14 → v0.6.15}/lib/cron/src/main.js +0 -0
  465. /package/framework/{v0.6.14 → v0.6.15}/lib/domain/LICENSE +0 -0
  466. /package/framework/{v0.6.14 → v0.6.15}/lib/domain/README.md +0 -0
  467. /package/framework/{v0.6.14 → v0.6.15}/lib/domain/package.json +0 -0
  468. /package/framework/{v0.6.14 → v0.6.15}/lib/domain/src/main.js +0 -0
  469. /package/framework/{v0.6.14 → v0.6.15}/lib/dto/package.json +0 -0
  470. /package/framework/{v0.6.14 → v0.6.15}/lib/dto/src/main.js +0 -0
  471. /package/framework/{v0.6.14 → v0.6.15}/lib/dto-pipe/package.json +0 -0
  472. /package/framework/{v0.6.14 → v0.6.15}/lib/dto-pipe/src/main.js +0 -0
  473. /package/framework/{v0.6.14 → v0.6.15}/lib/dto-types/package.json +0 -0
  474. /package/framework/{v0.6.14 → v0.6.15}/lib/dto-types/src/main.js +0 -0
  475. /package/framework/{v0.6.14 → v0.6.15}/lib/generator/index.js +0 -0
  476. /package/framework/{v0.6.14 → v0.6.15}/lib/i18n/package.json +0 -0
  477. /package/framework/{v0.6.14 → v0.6.15}/lib/i18n/src/main.js +0 -0
  478. /package/framework/{v0.6.14 → v0.6.15}/lib/image-build/package.json +0 -0
  479. /package/framework/{v0.6.14 → v0.6.15}/lib/image-build/src/main.js +0 -0
  480. /package/framework/{v0.6.14 → v0.6.15}/lib/index.js +0 -0
  481. /package/framework/{v0.6.14 → v0.6.15}/lib/inherits/LICENSE +0 -0
  482. /package/framework/{v0.6.14 → v0.6.15}/lib/inherits/README.md +0 -0
  483. /package/framework/{v0.6.14 → v0.6.15}/lib/inherits/package.json +0 -0
  484. /package/framework/{v0.6.14 → v0.6.15}/lib/inherits/src/main.js +0 -0
  485. /package/framework/{v0.6.14 → v0.6.15}/lib/inspector-events/package.json +0 -0
  486. /package/framework/{v0.6.14 → v0.6.15}/lib/inspector-events/src/main.js +0 -0
  487. /package/framework/{v0.6.14 → v0.6.15}/lib/inspector-redact/package.json +0 -0
  488. /package/framework/{v0.6.14 → v0.6.15}/lib/inspector-redact/src/main.js +0 -0
  489. /package/framework/{v0.6.14 → v0.6.15}/lib/instrument/package.json +0 -0
  490. /package/framework/{v0.6.14 → v0.6.15}/lib/instrument/src/main.js +0 -0
  491. /package/framework/{v0.6.14 → v0.6.15}/lib/job/package.json +0 -0
  492. /package/framework/{v0.6.14 → v0.6.15}/lib/job/src/main.js +0 -0
  493. /package/framework/{v0.6.14 → v0.6.15}/lib/job-store.js +0 -0
  494. /package/framework/{v0.6.14 → v0.6.15}/lib/json-config-header/package.json +0 -0
  495. /package/framework/{v0.6.14 → v0.6.15}/lib/json-config-header/src/main.js +0 -0
  496. /package/framework/{v0.6.14 → v0.6.15}/lib/kv/package.json +0 -0
  497. /package/framework/{v0.6.14 → v0.6.15}/lib/kv/src/main.js +0 -0
  498. /package/framework/{v0.6.14 → v0.6.15}/lib/kv-store.js +0 -0
  499. /package/framework/{v0.6.14 → v0.6.15}/lib/loading-state/package.json +0 -0
  500. /package/framework/{v0.6.14 → v0.6.15}/lib/loading-state/src/main.js +0 -0
  501. /package/framework/{v0.6.14 → v0.6.15}/lib/logger/README.md +0 -0
  502. /package/framework/{v0.6.14 → v0.6.15}/lib/logger/package.json +0 -0
  503. /package/framework/{v0.6.14 → v0.6.15}/lib/logger/src/containers/default/index.js +0 -0
  504. /package/framework/{v0.6.14 → v0.6.15}/lib/logger/src/containers/file/index.js +0 -0
  505. /package/framework/{v0.6.14 → v0.6.15}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  506. /package/framework/{v0.6.14 → v0.6.15}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  507. /package/framework/{v0.6.14 → v0.6.15}/lib/logger/src/containers/mq/index.js +0 -0
  508. /package/framework/{v0.6.14 → v0.6.15}/lib/logger/src/containers/mq/listener.js +0 -0
  509. /package/framework/{v0.6.14 → v0.6.15}/lib/logger/src/containers/mq/speaker.js +0 -0
  510. /package/framework/{v0.6.14 → v0.6.15}/lib/logger/src/helper.js +0 -0
  511. /package/framework/{v0.6.14 → v0.6.15}/lib/logger/src/main.js +0 -0
  512. /package/framework/{v0.6.14 → v0.6.15}/lib/maintenance/package.json +0 -0
  513. /package/framework/{v0.6.14 → v0.6.15}/lib/maintenance/src/main.js +0 -0
  514. /package/framework/{v0.6.14 → v0.6.15}/lib/math/index.js +0 -0
  515. /package/framework/{v0.6.14 → v0.6.15}/lib/mcp-dispatch/package.json +0 -0
  516. /package/framework/{v0.6.14 → v0.6.15}/lib/mcp-dispatch/src/main.js +0 -0
  517. /package/framework/{v0.6.14 → v0.6.15}/lib/mcp-http/package.json +0 -0
  518. /package/framework/{v0.6.14 → v0.6.15}/lib/mcp-http/src/main.js +0 -0
  519. /package/framework/{v0.6.14 → v0.6.15}/lib/mcp-server/package.json +0 -0
  520. /package/framework/{v0.6.14 → v0.6.15}/lib/mcp-server/src/main.js +0 -0
  521. /package/framework/{v0.6.14 → v0.6.15}/lib/merge/README.md +0 -0
  522. /package/framework/{v0.6.14 → v0.6.15}/lib/merge/package.json +0 -0
  523. /package/framework/{v0.6.14 → v0.6.15}/lib/merge/src/main.js +0 -0
  524. /package/framework/{v0.6.14 → v0.6.15}/lib/metrics/package.json +0 -0
  525. /package/framework/{v0.6.14 → v0.6.15}/lib/metrics/src/main.js +0 -0
  526. /package/framework/{v0.6.14 → v0.6.15}/lib/model.js +0 -0
  527. /package/framework/{v0.6.14 → v0.6.15}/lib/net-locality/package.json +0 -0
  528. /package/framework/{v0.6.14 → v0.6.15}/lib/net-locality/src/main.js +0 -0
  529. /package/framework/{v0.6.14 → v0.6.15}/lib/nunjucks-filters/README.md +0 -0
  530. /package/framework/{v0.6.14 → v0.6.15}/lib/nunjucks-filters/package.json +0 -0
  531. /package/framework/{v0.6.14 → v0.6.15}/lib/nunjucks-filters/src/main.js +0 -0
  532. /package/framework/{v0.6.14 → v0.6.15}/lib/nunjucks-resolver/package.json +0 -0
  533. /package/framework/{v0.6.14 → v0.6.15}/lib/nunjucks-resolver/src/main.js +0 -0
  534. /package/framework/{v0.6.14 → v0.6.15}/lib/proc.js +0 -0
  535. /package/framework/{v0.6.14 → v0.6.15}/lib/push/package.json +0 -0
  536. /package/framework/{v0.6.14 → v0.6.15}/lib/push/src/main.js +0 -0
  537. /package/framework/{v0.6.14 → v0.6.15}/lib/rate-limit/package.json +0 -0
  538. /package/framework/{v0.6.14 → v0.6.15}/lib/rate-limit/src/main.js +0 -0
  539. /package/framework/{v0.6.14 → v0.6.15}/lib/release-watch/package.json +0 -0
  540. /package/framework/{v0.6.14 → v0.6.15}/lib/release-watch/src/main.js +0 -0
  541. /package/framework/{v0.6.14 → v0.6.15}/lib/render-cache/package.json +0 -0
  542. /package/framework/{v0.6.14 → v0.6.15}/lib/render-cache/src/main.js +0 -0
  543. /package/framework/{v0.6.14 → v0.6.15}/lib/render-cache-store.js +0 -0
  544. /package/framework/{v0.6.14 → v0.6.15}/lib/routing/README.md +0 -0
  545. /package/framework/{v0.6.14 → v0.6.15}/lib/routing/build.json +0 -0
  546. /package/framework/{v0.6.14 → v0.6.15}/lib/routing/package.json +0 -0
  547. /package/framework/{v0.6.14 → v0.6.15}/lib/routing/src/radix.js +0 -0
  548. /package/framework/{v0.6.14 → v0.6.15}/lib/routing-introspect/package.json +0 -0
  549. /package/framework/{v0.6.14 → v0.6.15}/lib/routing-introspect/src/main.js +0 -0
  550. /package/framework/{v0.6.14 → v0.6.15}/lib/secrets/package.json +0 -0
  551. /package/framework/{v0.6.14 → v0.6.15}/lib/secrets/src/backends/env.js +0 -0
  552. /package/framework/{v0.6.14 → v0.6.15}/lib/secrets/src/backends/exec.js +0 -0
  553. /package/framework/{v0.6.14 → v0.6.15}/lib/secrets/src/backends/file.js +0 -0
  554. /package/framework/{v0.6.14 → v0.6.15}/lib/secrets/src/declaration.js +0 -0
  555. /package/framework/{v0.6.14 → v0.6.15}/lib/secrets/src/env-file.js +0 -0
  556. /package/framework/{v0.6.14 → v0.6.15}/lib/secrets/src/main.js +0 -0
  557. /package/framework/{v0.6.14 → v0.6.15}/lib/secrets/src/sources.js +0 -0
  558. /package/framework/{v0.6.14 → v0.6.15}/lib/session-store.js +0 -0
  559. /package/framework/{v0.6.14 → v0.6.15}/lib/shell.js +0 -0
  560. /package/framework/{v0.6.14 → v0.6.15}/lib/sqlite-driver.js +0 -0
  561. /package/framework/{v0.6.14 → v0.6.15}/lib/state.js +0 -0
  562. /package/framework/{v0.6.14 → v0.6.15}/lib/storage/package.json +0 -0
  563. /package/framework/{v0.6.14 → v0.6.15}/lib/storage/src/local-cas.js +0 -0
  564. /package/framework/{v0.6.14 → v0.6.15}/lib/storage/src/local-stream.js +0 -0
  565. /package/framework/{v0.6.14 → v0.6.15}/lib/storage/src/local.js +0 -0
  566. /package/framework/{v0.6.14 → v0.6.15}/lib/storage/src/main.js +0 -0
  567. /package/framework/{v0.6.14 → v0.6.15}/lib/storage/src/meta-store.js +0 -0
  568. /package/framework/{v0.6.14 → v0.6.15}/lib/storage/src/s3.js +0 -0
  569. /package/framework/{v0.6.14 → v0.6.15}/lib/storage/src/util.js +0 -0
  570. /package/framework/{v0.6.14 → v0.6.15}/lib/storage-store.js +0 -0
  571. /package/framework/{v0.6.14 → v0.6.15}/lib/swig-filters/README.md +0 -0
  572. /package/framework/{v0.6.14 → v0.6.15}/lib/swig-filters/package.json +0 -0
  573. /package/framework/{v0.6.14 → v0.6.15}/lib/swig-filters/src/main.js +0 -0
  574. /package/framework/{v0.6.14 → v0.6.15}/lib/swig-resolver/package.json +0 -0
  575. /package/framework/{v0.6.14 → v0.6.15}/lib/swig-resolver/src/main.js +0 -0
  576. /package/framework/{v0.6.14 → v0.6.15}/lib/template-loaders/package.json +0 -0
  577. /package/framework/{v0.6.14 → v0.6.15}/lib/template-loaders/src/loaders/http.js +0 -0
  578. /package/framework/{v0.6.14 → v0.6.15}/lib/template-loaders/src/loaders/memory.js +0 -0
  579. /package/framework/{v0.6.14 → v0.6.15}/lib/template-loaders/src/main.js +0 -0
  580. /package/framework/{v0.6.14 → v0.6.15}/lib/url/README.md +0 -0
  581. /package/framework/{v0.6.14 → v0.6.15}/lib/url/index.js +0 -0
  582. /package/framework/{v0.6.14 → v0.6.15}/lib/url/routing.json +0 -0
  583. /package/framework/{v0.6.14 → v0.6.15}/lib/uuid/package.json +0 -0
  584. /package/framework/{v0.6.14 → v0.6.15}/lib/uuid/src/main.js +0 -0
  585. /package/framework/{v0.6.14 → v0.6.15}/lib/validator.js +0 -0
  586. /package/framework/{v0.6.14 → v0.6.15}/lib/watcher/package.json +0 -0
  587. /package/framework/{v0.6.14 → v0.6.15}/lib/watcher/src/main.js +0 -0
  588. /package/framework/{v0.6.14 → v0.6.15}/lib/ws-framing/package.json +0 -0
  589. /package/framework/{v0.6.14 → v0.6.15}/lib/ws-framing/src/main.js +0 -0
  590. /package/framework/{v0.6.14 → v0.6.15}/lib/ws-query/package.json +0 -0
  591. /package/framework/{v0.6.14 → v0.6.15}/lib/ws-query/src/main.js +0 -0
  592. /package/framework/{v0.6.14 → v0.6.15}/lib/ws-session/package.json +0 -0
  593. /package/framework/{v0.6.14 → v0.6.15}/lib/ws-session/src/main.js +0 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,18 @@ 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.15 - 2026-08-24
10
+ ### Changed
11
+ * The changie pre-commit guard now also requires that a fragment whose FILENAME names a tracker id cites that id in its body (#B410). Only the body is rendered into CHANGELOG.md and the published tarball, so an id carried by the filename and the commit message but missing from the body ships an UNNUMBERED changelog entry, and anyone triaging by id gets a false zero. Measured across all 937 historical fragments, roughly 60 shipped entries are unnumbered this way; the guard stops the next one at commit time rather than at cut time. Recognised id families are an explicit allowlist rather than a generic letters-then-digits pattern, because the generic form false-positives on real filenames (express5, npm12, s3) and a false positive would block a commit; a filename encoding no recognised id is skipped, never failed.
12
+ ### Fixed
13
+ * The couchbase connector no longer hangs a request when a `@return {number}` COUNT query does not match its alias parser (#B412, consumer-reported). The branch parsed the COUNT alias out of the query text and dereferenced the match without a guard, so `SELECT COUNT(DISTINCT a.b) AS n` (the pattern could not span the space inside the parentheses) and an unaliased `SELECT COUNT(*)` both produced a null match and threw. Because the throw happened inside the connector's own result callback, the failure did not surface as a 5xx: a promisified caller never settled and the request hung until the client or proxy timed out, leaving only an uncorrelated log line, and behind an HTTP/2 inter-bundle client the stall was then retried. It was also invisible in development, where only the first comment block is stripped from the query text, so a commented-out parsable COUNT elsewhere in the file kept the parser satisfied locally while production - which strips every comment - threw on the identical file. The branch now derives the count from the first projected column with no regex at all, guarded against empty result sets, empty rows and null payloads, exactly as the mysql, postgresql, scylladb and sqlite connectors already did and as the documented contract (first key of first row) already stated. Also fixed on the same path: the `@return` annotation parser was greedy, so a second brace pair later on the same line over-captured (`@return {object} note {x}` yielded `object} note {x`) and the resulting unknown return type fell through every branch silently, handing the caller the raw row array instead of the declared shape; it is now bounded to the first brace pair like the sibling connectors. Behaviour change worth knowing: for a multi-column projection whose COUNT is not the first column, the returned value is now the first column rather than the aliased one - consistent with every other connector.
14
+ * The couchbase connector now normalises the types it reads from `@return` and `@param` annotations, and bounds both captures to the first brace pair (#B413). Both extracted types feed exact-match comparisons whose arms are all lowercase - the return type against the branch chain that dispatches the declared shape, and each param type against the switch in the parameter cast - so a capitalised or space-padded type such as `{Number}` or `{ number }` matched nothing and was SILENTLY skipped: the caller received the raw row array instead of the declared shape, and the parameter was left uncast. Both are now trimmed and lowercased at extraction, exactly as the mysql, postgresql, scylladb and sqlite connectors already did. The two captures were also greedy, so a second brace pair on the same line bled into the extracted type (`@param {a} and {b}` yielded `a} and {b`), which then matched no cast arm either; both are bounded to the first brace pair. Behaviour change worth knowing: annotations that previously fell through silently now reach their branch, so a query declaring `@return {Number}` begins returning the declared shape rather than the raw row array. The `@options` annotation deliberately keeps its greedy capture and is pinned as such - it holds a nestable object literal rather than a single type token, so bounding it would truncate a nested object and break the parse.
15
+ * Client-side handler release now awaits the routing table (#B414, consumer-reported with a two-way browser reproduction). The client routing table arrives only by async fetch (the page whispers an empty stub), yet `gina.ready` handlers and the auto-boot validator released at DOMContentLoaded - so any `getRoute()`/`toUrl()` during handler or form-bind initialisation ran against an empty table. Loopback wins that race by single-digit milliseconds, which is why development never sees it; a real deployment loses it by 150ms or more on every load, deterministically - a validator form rule naming a route then threw inside the init listener, the throw was swallowed by the event dispatch, and the instance's `ready` never fired, silently. All three release paths now gate on the dependency SETTLING: the ready-list scheduler, the validator auto-boot poll, and the late-registration path (a handler registered after DOMContentLoaded previously bypassed the scheduler entirely and fired immediately). Settled deliberately means loaded OR failed - a broken endpoint still releases handlers rather than hanging the page - and a parse-time 5-second fallback force-settles with a console error in degenerate shapes where the fetch is never issued. Behaviour change worth knowing: on deployed tiers, `gina.ready` handlers now fire when routing is actually available (typically 150ms-1.3s later than before, per the consumer's measurements); on loopback and in development the difference is single-digit milliseconds. Pages that do not use client routing are unaffected in every case but the timing.
16
+ * Client-side `getRoute()` no longer crashes with a context-free TypeError when a bundle's routing table is absent (#B415). The client `getRouting()` returns null by design when nothing matches - an empty table before the routing fetch lands, or a bundle with no rules - and the bare dereference of that null sat one line above the very diagnostic built for the degraded-table case, so the case it existed for was exactly the one it could never report. A named guard now throws `bundle X has no routing table for rule Y (client: routing config not loaded yet, or empty)`, restoring the diagnostic's intent on both the client and the server.
17
+ * A failed client routing fetch now leaves console evidence (#B416). The dependency bus event fires on fetch failure as well as success - that is what keeps the page booting - but the listener discarded the error it carried, so a genuinely failed fetch (a non-OK status caught by the response guard) booted the framework permanently degraded, with an empty routing table and zero console output. The listener now reads and reports the carried error, naming the consequence: client `getRoute()`/`toUrl()` degraded until reload.
18
+ * Fixed #B328 — calling the public link API with a url no link is registered for (gina.link.request(url), or a registered link's .request(url) with a foreign url) threw a bare TypeError. It now throws a named error identifying the url and the likely cause — never bound, or bound by a later construction the published instance cannot see. The miss is also detected before the supersede step, so a mistyped url no longer aborts a legitimate request still in flight. Click-driven links are unaffected: both click paths always resolve a real registration.
19
+ * Fixed #B329 — the popin stylesheet no longer restyles every dialog on the page: its ::backdrop rule (dark overlay + blur) is now scoped to gina's own popin dialogs (dialog.gina-popin-container::backdrop), matching the reduced-motion rules that were already scoped. Consumer-visible: a page that relied on the unscoped rule to style its own dialogs must now style them itself, and a popin dialog element supplied by the page's own markup needs the gina-popin-container class to keep gina's backdrop.
20
+
9
21
  ## 0.6.14 - 2026-08-23
10
22
  ### Added
11
23
  * Secrets exec bridge (#SECRETS3): a bundle may declare `settings.secrets.exec` — one operator-declared command (`{"command": ["sops", "decrypt", "--output-type", "json", "${project}/secrets.enc.json"], "timeout": 10000}`, argv form, no shell) whose stdout must be a single flat JSON object of string values, layered UNDERNEATH the environment exactly like the `file` tier and mutually exclusive with it (a bundle inheriting a project-wide `file` chain opts out with `"file": null` beside its `exec` block). The command runs once per bundle per config-load cycle, at boot only, and failure is always a per-bundle boot REFUSAL, never a hang: the child is bounded by `timeout` (default 10000ms) and killed with SIGKILL on expiry, so a wedged secrets endpoint becomes a fast, named boot failure. The fetched output is never echoed into any error, log or report. A non-empty environment value still beats the fetched map — decrypting at the container entrypoint remains the better pattern wherever the entrypoint can be controlled; this tier exists for environments where it cannot. `gina secrets:check` validates and RUNS the same command through the same code, so the CI gate's verdict matches the boot's. Also stricter, deliberately: `settings.secrets` now refuses unknown keys and non-object values at boot instead of silently ignoring them — a typo'd tier name used to degrade to environment-only resolution without a word.
package/README.md CHANGED
@@ -62,39 +62,36 @@ open https://localhost:3100
62
62
 
63
63
  > **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.)
64
64
 
65
- ## What's in 0.6.14
65
+ ## What's in 0.6.15
66
66
 
67
- > **Restart your bundles no rebuild needed.** Every change in this release is
68
- > server-side. The browser bundle's executable content is byte-identical to
69
- > `0.6.13` (the only `dist/` delta is a documentation comment, which
70
- > minification strips), so `gina bundle:restart` is enough and you do not need
71
- > to re-run `gina bundle:build`.
67
+ > **Restart your bundles AND rebuild them.** This release changes the browser
68
+ > bundle: both `gina.min.js` and `gina.min.css` differ from `0.6.14`. A restart
69
+ > alone updates the server half only each bundle bakes its own copy of the
70
+ > client assets, so `gina bundle:build` is required for the client-boot,
71
+ > link and popin fixes below to reach a browser at all.
72
72
 
73
- > **No settings reset.** `0.6.14` is a patch — the `shortVersion` stays `0.6`, so
73
+ > **No settings reset.** `0.6.15` is a patch — the `shortVersion` stays `0.6`, so
74
74
  > your `~/.gina/0.6/settings.json` is untouched. (`0.6.0` was the reset.)
75
75
 
76
- **One new opt-in capability, and a correctness pass over how `self.query()` hands
77
- results back to your code.** The headline is a secrets bridge that reads from a
78
- network-backed store without a vendor SDK and without risking a hung boot.
79
- Alongside it, six fixes close the seams where a query's outcome could be lost:
80
- a rejected `async` callback that hung the request, a throw that killed the whole
81
- bundle process, an HTTP/2 failure answered twice, a handle-mode listener that
82
- never fired, and non-5xx statuses that never reached the callback at all.
76
+ **A correctness pass over client boot, and two connector defects that could hang
77
+ a request.** The headline is a race that only a real deployment can lose: the
78
+ client routing table arrives by async fetch, but handlers were released before it
79
+ landed so anything resolving a route during initialisation ran against an empty
80
+ table, deterministically, on every page load away from loopback. Alongside it,
81
+ the couchbase connector no longer hangs a request on an unparsed `COUNT`, and two
82
+ client plugins stop leaking their behaviour onto pages that never asked for it.
83
83
  **Several behaviour changes are worth checking before you upgrade** — each is
84
84
  called out in its bullet below, with the details in the
85
85
  [migration guide](https://gina.io/docs/migration).
86
86
 
87
- - **Newnetwork-backed secrets without a vendor SDK or a hung boot (#SECRETS3).** A bundle may declare one operator-supplied fetch command under `settings.secrets.exec` argv form, no shell (`{"command": ["sops", "decrypt", "--output-type", "json", "${project}/secrets.enc.json"], "timeout": 10000}`) whose stdout must be a single flat JSON object of string values. It runs once per bundle per config-load cycle, at boot only, and is layered *underneath* the environment exactly like the existing `file` tier: a non-empty environment value still wins. The two declared tiers are mutually exclusive, and a bundle inheriting a project-wide `file` chain opts out with `"file": null` beside its own `exec` block. **A failing fetch is always a fast, named per-bundle boot refusal, never a hang** the child is bounded by `timeout` (default 10000ms) and killed with `SIGKILL` on expiry, so a wedged secrets endpoint costs you a failed boot rather than a process that never comes up. The fetched output is never echoed into any error, log or report, and `gina secrets:check` validates *and runs* the same command through the same code, so the CI gate's verdict matches the boot's by construction. Recipes for `vault`, `kubectl` and `sops` are in the guide. Decrypting at the container entrypoint remains the better pattern wherever you control the entrypoint; this tier exists for the environments where you do not. **Also stricter, deliberately:** `settings.secrets` now refuses unknown keys and non-object values at boot instead of silently ignoring them a typo'd tier name used to degrade to environment-only resolution without a word.
88
- - **Fixed — an exception in an `async` query callback can no longer vanish (#B399).** Every app-callback delivery in a controller's `self.query()` the Node-style callback form and the `{onComplete}` facade, on both HTTP/1.1 and HTTP/2 invoked your callback bare. A synchronous throw was caught by the success-delivery guards, but an asynchronous *rejection* was unowned: the request hung to client or proxy timeout and the only trace floated up to the process-level rejection handler. Every delivery now routes a rejected callback promise to the same `throwError` shape the synchronous guards build. **Behaviour change:** an `async` query callback whose promise rejects now answers 500 (with the `#ERRREF` correlation ref) where it previously hung. A callback that already responded before rejecting is absorbed by the released-response guard logged server-side, never a double response. Synchronous behaviour at every delivery site is byte-unchanged, and plain callbacks mint no promises.
89
- - **Fixed — a throw inside a query callback on a transport-error delivery no longer kills the bundle (#B402).** All 14 formerly-bare error-path deliveries host-missing, circuit refusal, the query-scope outer catch, both certificate-read catches, HTTP/1.1 ALPN and request-error, the HTTP/2 typed terminals and both pre-flight PING failures now wrap the callback. Previously, on the event- and timer-frame sites a throw escaped to the process handler as an emergency-level exit, **killing the whole bundle on both engines**; on the caller-frame sites the query-scope catch re-invoked your callback a second time, passing its own exception as the error argument. **Behaviour change:** a throwing callback on an error-path delivery now answers a flat 500 instead of killing the bundle or double-invoking. Your callback still receives the original transport error first, and callbacks that do not throw are untouched.
90
- - **Fixed — an HTTP/2 transport failure is now answered exactly once (#B403).** The app callback received the typed error from the stream-level delivery while the *session* error handler independently answered the same request through `throwError` racing graceful degraded-mode handling, so the framework's 500 could reach the wire before your own response. On a reused session it was worse: session listeners bind once at connect, so the handler could answer using the *creating* request's context. The session-level answer is retired; session cleanup and logging stay, and request notification is owned solely by the stream-level deliveries, which fire for every live stream when a session fails. HTTP/1.1, which has no session layer, already behaved this way.
91
- - **Fixed — handle-mode query errors now reach your `onComplete` listener (#B404).** Every error-path `query#complete` emit is single-argument, mirroring the callback form's `callback(err)` contract, but both facades' `(err, data)` dispatch dereferenced `data.status` unconditionally so a transport error or a non-2xx outcome crashed the facade and answered 500 with a marker that misattributed the failure to your callback, which never ran. Both facades now deliver the single-argument payload as the error: on failure `cb(err)` with `data` undefined (a plain `{status, error}` object for a non-2xx status or a transport failure, a native `Error` for a pre-transport failure such as a missing host, an unreadable certificate or an open circuit), and on success `cb(false, data)`. **Action required if a handle-mode query of yours can fail:** your listener is now *invoked* with the error, where the framework previously answered 500 before it could runthe outcome is yours to own, exactly as in the callback form.
92
- - **Fixed — HTTP/2 queries in callback mode now deliver every non-2xx status (#B405).** The dispatch split 5xx to your callback and every *other* deliverable non-2xx to the framework's own error answer, so graceful degradation was impossible for something as ordinary as a 404 from an HTTP/2 upstream and, measured, the documented `util.promisify(self.query)` idiom **never settled** on any non-5xx status: the `await` hung and its continuation was silently abandoned. HTTP/1.1 has delivered every non-2xx to the callback since its own earlier change. The split is retired: every body-announced non-2xx with a known status code now invokes your callback on both transports. **Behaviour change:** an HTTP/2 callback-mode query that previously auto-answered the original request with the upstream's non-5xx status now invokes your callback instead decide there whether to degrade or surface. The 3xx-with-headers redirect replay is unchanged.
93
- - **Fixed — `self.query()`'s documented return contract (#B401).** The JSDoc claimed the no-callback form returns a Promise. It returns a handle exposing `.onComplete(cb)`, which is not a thenable so `await self.query({...})` resolved immediately with the handle and silently dropped the result. The JSDoc and the online guide now document the real contract and the supported `await` idiom, `await require('util').promisify(self.query)(options, {})`, including its rejection shapes: a non-2xx status rejects with the plain `{status, error, message}` object, a connection failure with a native `Error`. Both were verified against the runtime.
94
- - **Fixed — a crash during bundle bootstrap now aborts loudly instead of hanging silently (#B406).** The boot callback in `core/gna.js` is declared `async`, so a synchronous throw anywhere in its frame became a promise rejection: the process-level net logged it at error level and stopped there no emergency marker for the daemon's startup watchdog, no exitso `gina bundle:start` sat on its 60-second startup timer and reported a timeout with no cause attached. The whole frame is now owned by a `try`/`catch` routing every failure (including a non-`Error` rejection like `throw null`) into the existing boot terminal: an emergency-level line the watchdog matches on, a synchronous stderr flush that survives the exit, and exit code 1. **Behaviour change worth knowing:** a throw late in the boot frame that previously left a half-initialised process limping along now refuses the boot cleanly. If a bundle that used to "start" begins aborting after this release, the printed cause was always there — it was simply invisible.
95
- - **Fixed — GET and HEAD query parameters no longer lose backslash-escaped characters (#B407, consumer-reported).** The query pipeline serialized `request.query` and then stripped every backslash from the whole document in order to support nested-JSON value unwrapping. A newline (`%0A`) in a value degraded to the letter `n`, a tab to `t`, a backslash vanished outright, and a double quote or a JSON-array value produced invalid JSON that silently dropped **every** query parameter on the request. Nested-JSON string values (`?filter={"a":1}`) are now unwrapped by parsing them individually — the same intent, validated, and correct even when the nested content itself carries escapes, which the old unwrap also corrupted — and the query then serializes cleanly. Whole-value `true`/`false`/`on`/`null` coercion and plain values are unchanged; JSON-array parameters and unparsable `{`-leading values now arrive intact where they previously killed the whole query.
96
- - **Fixed — `gina secrets:check` now agrees with the boot (#B408, #B409).** The checker kept its own hand-written mirror of the runtime's `settings.secrets.file` declaration guards, and it had drifted — twice, both times permissively: a whitespace-only entry and a path whose `${…}` token collapsed to a double separator both reported **green** while the bundle refused to boot on them. The validation now lives in one shared implementation (`lib.secrets.validateFilePaths`) that boot and check both consume, and the check validates the declaration *before* reading any declared layer, exactly as the boot does — so an invalid chain now reports with no layers listed. **Behaviour change for CI:** the command now exits non-zero when a bundle's declaration is itself invalid or unreachable — an unreadable declared file, a malformed entry, a failing exec fetch — not only when a required key is unset. Previously such errors were printed while the exit code stayed 0 whenever the environment happened to carry the keys, so the gate green-lit configurations the runtime refuses to boot.
97
- - **Changed — one shared config-source walk behind `secrets:scan` and `secrets:check`.** The walk now lives in `lib.secrets` as `getProjectRequiredKeys(projectPath, {scope, bundle})`, with `loadManifest`, `readJsonSafe` and `resolveBundleSrc` exported alongside it for single-file reads. The two CLI handlers each carried a near-identical private copy and now delegate to the one implementation, so they enumerate the same config sources by construction and cannot drift apart. CLI behaviour and report output are unchanged by the relocation.
87
+ - **Fixedclient handlers now wait for the routing table (#B414, consumer-reported).** The client routing table arrives only by async fetchthe page deliberately whispers an empty stub rather than inlining ityet `gina.ready` handlers and the auto-boot validator released at `DOMContentLoaded`. Anything calling `getRoute()`/`toUrl()` during handler or form-bind initialisation therefore ran against an empty table. Loopback wins that race by single-digit milliseconds, which is why development and local suites never see it; a real deployment loses it by 150ms or more on *every* load. A validator form rule naming a route then threw inside the init listener, the event dispatch swallowed the throw, and the instance's `ready` never fired silently, with one uncorrelated console error as the only artefact. All three release paths now gate on the dependency *settling*: the ready-list scheduler, the validator auto-boot poll, and the late-registration path (a handler registered after `DOMContentLoaded` previously bypassed the scheduler and fired immediately). Settled deliberately means loaded **or** failed, so a broken endpoint still releases handlers rather than hanging the page, and a parse-time 5-second fallback force-settles with a console error in degenerate shapes where no fetch is ever issued. **Behaviour change:** on deployed tiers `gina.ready` handlers now fire when routing is actually available typically 150ms–1.3s later than before; on loopback and in development the difference is single-digit milliseconds. Pages that do not use client routing are unaffected but for the timing.
88
+ - **Fixed — `getRoute()` reports a missing routing table instead of crashing (#B415).** The client `getRouting()` returns `null` by design when nothing matchesan empty table before the fetch lands, or a bundle with no rules and the bare dereference of that `null` sat one line *above* the very diagnostic built for the degraded-table case, so the case it existed for was exactly the one it could never report. A named guard now throws `bundle X has no routing table for rule Y (client: routing config not loaded yet, or empty)`, on both the client and the server.
89
+ - **Fixed — a failed routing fetch now leaves console evidence (#B416).** The dependency bus fires on fetch failure as well as success that is what keeps the page bootingbut the listener discarded the error it carried. A genuinely failed fetch booted the framework permanently degraded, with an empty routing table and *zero* console output. The listener now reports the carried error and names the consequence: client `getRoute()`/`toUrl()` degraded until reload.
90
+ - **Fixed — a couchbase `COUNT` query can no longer hang the request (#B412, consumer-reported).** The `@return {number}` branch parsed the COUNT alias out of the query text and dereferenced the match unguarded, so `SELECT COUNT(DISTINCT a.b) AS n` — the pattern cannot span the space inside the parentheses — and an unaliased `SELECT COUNT(*)` both produced a null match and threw. The severity was not the throw but where it landed: inside the connector's own result callback, so no 5xx was ever produced, a promisified caller never settled, and the request hung until the client or proxy timed out leaving one uncorrelated log line, and behind an HTTP/2 inter-bundle client the stall was then retried. It was dev-invisible too: the dev path strips only the first comment block, so a commented-out parsable COUNT elsewhere in the file kept the regex satisfied locally while production, which strips every comment, threw on the identical file. The branch now derives the count from the first projected column with no regex at all, guarded against empty result sets, empty rows and null payloads exactly as mysql, postgresql, scylladb and sqlite already did, and as the documented contract already stated. **Behaviour change:** for a multi-column projection whose COUNT is not the first column, the returned value is now the first column rather than the aliased one — consistent with every other connector.
91
+ - **Fixed — couchbase annotation types are normalised and bounded (#B413).** Both the `@return` type and each `@param` type feed exact-match comparisons whose arms are all lowercase, so a capitalised or space-padded type such as `{Number}` or `{ number }` matched nothing and was silently skipped handing the caller the raw row array instead of the declared shape, and leaving the parameter uncast. Both are now trimmed and lowercased at extraction, as the sibling connectors already did. Both captures were also greedy, so a second brace pair on the same line bled into the extracted type (`@param {a} and {b}` yielded `a} and {b`), matching no cast arm either; both are bounded to the first brace pair. **Behaviour change:** annotations that previously fell through silently now reach their branch, so a query declaring `@return {Number}` begins returning the declared shape rather than the raw row array. `@options` deliberately keeps its greedy capture it holds a nestable object literal, not a single type token.
92
+ - **Fixed — the public link API names its error instead of throwing a bare TypeError (#B328).** Calling `gina.link.request(url)` or a registered link's `.request(url)` with a foreign url for a url no link is registered for dereferenced the null resolution. It now throws a named error identifying the url and the likely cause: never bound, or bound by a later construction the published instance cannot see. The miss is also detected *before* the supersede step, so a mistyped url no longer aborts a legitimate request still in flight. Click-driven links are unaffectedboth click paths always resolve a real registration.
93
+ - **Fixed — the popin stylesheet no longer restyles every dialog on the page (#B329).** Its `::backdrop` rule (dark overlay + blur) shipped unscoped on the bare `dialog` element, so gina painted its backdrop on any `<dialog>` a page opened. It is now scoped to `dialog.gina-popin-container::backdrop`, matching the reduced-motion rules that were already scoped. **Consumer-visible:** a page that relied on the unscoped rule to style its own dialogs must style them itself now, and a popin dialog element supplied by the page's own markup needs the `gina-popin-container` class to keep gina's backdrop.
94
+ - **Changed — a changelog fragment must cite the tracker id its filename names (#B410).** Only the body is rendered into `CHANGELOG.md` and the published tarball, so an id carried by the filename and the commit message but missing from the body ships an unnumbered changelog entry and anyone triaging by id gets a false zero. Measured across all 937 historical fragments, roughly 60 shipped entries are unnumbered this way; the guard stops the next one at commit time rather than at cut time. Recognised id families are an explicit allowlist rather than a generic letters-then-digits pattern, because the generic form false-positives on real filenames (`express5`, `npm12`, `s3`) and a false positive would block a commit; a filename encoding no recognised id is skipped, never failed.
98
95
 
99
96
  ## Documentation
100
97
 
package/ROADMAP.md CHANGED
@@ -66,6 +66,7 @@ This roadmap covers planned features, architectural improvements, new connectors
66
66
  | **Q4 2026** | `0.6.12` ✅ | **Fixed**: an undefined-valued filter key no longer makes a `Collection` query match every record — every `Collection` method that accepts a filter object round-tripped it through `JSON.stringify`, which silently drops keys whose value is `undefined`, so a filter built from a possibly-absent field degraded to the match-everything `{}` filter: `findOne()` returned the collection's first row instead of the `null` the calling guard expected, `update()` wrote its `set` onto every record, and `delete()` returned an empty collection with every record removed. All eight filter-object methods now throw a descriptive error naming the offending key — `find()`, `findOne()`, `or()`, `update()`, `replace()`, `max()`, `notIn()` and `delete()`, the last two because `notIn()` routes a filter-object argument through `find()`; only `notIn()`'s array form, `notIn(rows, key)`, is exempt (ACTION REQUIRED if you relied on an undefined value meaning "no constraint" — build the filter conditionally; an explicitly empty `{}` still means no constraint, and `null` remains a legal needle). A non-string field value no longer aborts the whole form validation pass — `isEmail`, `isJsonWebToken` and `trim` called a string method on the value without a type check, so a `123`, `true` or `[]` arriving from a JSON body or a checkbox threw and the rule driver re-threw, killing every remaining field: the request went unvalidated server-side, and client-side the boot-time binding loop died so forms bound after it silently lost both validation and CSRF token injection. All three now leave a non-string untouched — the two checks record their normal rule error and `trim` passes it through untransformed, matching how `isFloat` already behaved (no action required; a defensive upstream coercion added to work around the crash can be removed). Documentation: the external references carried by the framework READMEs are current again, the retired Simple Data Format specification link replaced by the Tabular Data Package specification that superseded it, and every remaining plain-HTTP reference moved to HTTPS. Pickup: restart **and** rebuild your bundles (the browser bundle changed). |
67
67
  | **Q4 2026** | `0.6.13` ✅ | **Added**: a general-purpose key-value primitive — declare namespaces under `settings.json > kv.namespaces` and reach them as `gina.kv('<namespace>')`, a promise-native handle with 13 operations including the ones that are hard to get right by hand: set-if-absent, atomic read-and-delete (a one-shot token's second reader gets `null`), compare-and-delete as the safe lock-release primitive, TTL-on-create-only counters, and fetch-or-compute with per-process single-flight. Three backends: in-memory with zero config, redis for namespaces shared across hosts and replicas (every guarantee server-side — `SET .. PX .. NX`, `GETDEL` with a Lua fallback below redis 6.2), and SQLite as the zero-dependency durable option that survives a restart and stays atomic across processes via `IMMEDIATE` transactions, using `node:sqlite` so there is nothing to install. Namespaces are strict-declared — an unknown name throws at the call site rather than silently minting an empty store — and each owns its failure policy; all three backends are verified against one shared contract spec. Deliberately not a redis client: no data structures, batch operations, key scanning, binary values or first-class locks. Identified-caller rate limiting — opt-in quota enforcement at the router keyed on the authenticated principal (a session user via an operator-named field, or a machine caller), with fixed-window counters in a kv namespace you declare, so choosing that namespace's backend chooses the quota's scope: redis or SQLite share one quota across replicas, in-memory counts per process. The gate runs after route authorization and before payload validation, so the refusal order is 401 → 429 → 422 and a throttled caller never receives a field map; it throttles identified callers only, and a request with no resolvable principal is skipped rather than bucketed by IP, since behind a reverse proxy that would be one bucket for the whole internet — anonymous flood control stays with your edge proxy. Denials answer 429 with `Retry-After` plus the `RateLimit` / `RateLimit-Policy` structured fields, which allowed limited requests carry too, and per-route overrides ride a top-level `rateLimit` key in `routing.json`. An opt-in per-authority circuit breaker for `Controller::query()` — after N consecutive transport-class failures to one authority the circuit opens and further calls fail fast with a machine-readable `CIRCUIT_OPEN` error instead of hammering a dead upstream, admitting exactly one critical request as the half-open probe after the cooldown; the gate sits above the HTTP/1.x / HTTP/2 dispatch so retries can never hammer an open circuit by construction, and only transport-class errors count, so an application response of any status cannot trip it. **Fixed**: an exception in a controller's `onReady` or `setup` hook can no longer vanish — both dispatch sites invoked the reserved-action hooks outside the guarded band, so a synchronous throw escaped to the process level (on the built-in engine an uncaught exception killing the whole bundle process, while Express answered its own 500 — an engine asymmetry) and an asynchronous rejection was unowned, leaving the request to hang to client or proxy timeout while work after the throw silently never happened; both loops now run inside the dispatch `try` and every hook's promise is owned by the same guard the main action carried, with the synthesized `setup` wrapper returning the app call's own result so an async `setup.js` rejection actually reaches it (ACTION REQUIRED if a hook of yours can throw: it now answers 500 where it previously crashed, hung, or was masked — and since hooks are still dispatched without awaiting, a hook rejection does not stop the action, so its side effects may already have run when the 500 lands). The entity dispatch diagnostics are readable again — five markers were raw `console.log` calls, which in gina bypasses both the container dispatch and the level gate, so they reached neither a bundle log file nor container logs and were visible only by running a bundle in the foreground; they now go through `console.debug`, off by default and appearing at the `debug` hierarchy as originally intended. **Documentation**: the published claim that gina ships a companion reverse-proxy service is retired — no release ever carried the bundle the help text advertised, and each surface now states the position the rest of the documentation already assumed, that gina ships no edge or reverse proxy by design; run nginx, Traefik or an ingress controller in front of your bundles. Two deliberate boundaries are now stated rather than left as absences: API versioning (no version route field, no version-aware dispatch — with the three shapes the existing primitives already cover) and database migrations (the per-database tools to use, plus running them as a discrete step before the new version serves rather than at bundle boot where replicas race each other, and keeping changes additive during a rolling deploy), and `connector:migrate` is explicitly flagged as not a database migration. Pickup: restart **and** rebuild your bundles — the browser bundle changed, though its client-side delta is inert. |
68
68
  | **Q4 2026** | `0.6.14` ✅ | **Added**: network-backed secrets without a vendor SDK or a hung boot — a bundle may declare one operator-supplied fetch command under `settings.secrets.exec` (argv form, no shell) whose stdout must be a single flat JSON object of string values, layered underneath the environment exactly like the existing file tier and mutually exclusive with it, a bundle inheriting a project-wide file chain opting out with `"file": null` beside its own block. It runs once per bundle per config-load cycle, at boot only, and a failing fetch is always a fast, named per-bundle boot refusal rather than a hang: the child is bounded by its own timeout and killed with SIGKILL on expiry, so a wedged secrets endpoint costs a failed boot instead of a process that never comes up. The fetched output is never echoed into any error, log or report, and `gina secrets:check` validates *and runs* the same command through the same code, so the CI gate's verdict matches the boot's by construction; recipes for vault, kubectl and sops ship with the guide, and decrypting at the container entrypoint remains the better pattern wherever the entrypoint can be controlled. `settings.secrets` is also stricter, deliberately: unknown keys and non-object values now refuse the boot instead of silently degrading to environment-only resolution. **Fixed**: a correctness pass over how `self.query()` hands results back to application code. An exception in an `async` query callback could vanish — every app-callback delivery (the Node-style callback form and the `{onComplete}` facade, on both transports) invoked the callback bare, so an asynchronous rejection was unowned and the request hung to client or proxy timeout; rejections now answer 500 with the correlation ref. A synchronous throw inside a callback invoked on a transport-error delivery escaped to the process handler on the event- and timer-frame sites, killing the whole bundle on both engines, and re-invoked the callback with its own exception on the caller-frame sites; all fourteen error-path deliveries are now guarded. An HTTP/2 transport failure was answered twice, the session-level error handler racing the stream-level delivery — and on a reused session answering with the *creating* request's context, since session listeners bind once at connect; notification is now owned solely by the stream-level terminals. Handle-mode error deliveries never reached the app's `onComplete` listener, because both facades dereferenced `data.status` on a single-argument error emit and crashed into a 500 that misattributed the failure to the app callback; the listener is now invoked with the error, and owns the outcome as the callback form does. And HTTP/2 callback mode never delivered a non-5xx error status at all, so graceful degradation was impossible for something as ordinary as a 404 from an HTTP/2 upstream and the documented promisify idiom never settled on one — every body-announced non-2xx now reaches the callback on both transports. `self.query()`'s JSDoc no longer claims the no-callback form returns a Promise: it returns a handle exposing `.onComplete(cb)`, which is not a thenable, so `await self.query({...})` resolved immediately with the handle and silently dropped the result — the real contract and the supported `await` idiom are documented with their rejection shapes, each verified against the runtime. A crash during bundle bootstrap now aborts loudly instead of hanging silently — the async boot frame turned a synchronous throw into a rejection logged at error level with no emergency marker and no exit, so `gina bundle:start` sat on its startup timer and reported a timeout with no cause attached. GET and HEAD query parameters keep their backslash-escaped characters: the pipeline stripped every backslash from the whole serialized document, so a newline degraded to the letter `n`, a backslash vanished, and a double quote or JSON-array value produced invalid JSON that silently dropped every parameter on the request. And `gina secrets:check` now agrees with the boot — its hand-kept mirror of the `settings.secrets.file` declaration guards had drifted permissively twice, reporting green on configurations the bundle refuses to start on, and the command now exits non-zero when a declaration is itself invalid or unreachable rather than only when a required key is unset. **Changed**: the config-source walk behind `secrets:scan` and `secrets:check` now lives in `lib.secrets`, so the two commands enumerate the same config sources by construction and cannot drift apart; CLI behaviour and report output are unchanged. Pickup: restart your bundles — no rebuild needed, the browser bundle's executable content is byte-identical to `0.6.13`. |
69
+ | **Q4 2026** | `0.6.15` ✅ | **Fixed**: client-side handler release now awaits the routing table — the table arrives only by async fetch (the page deliberately whispers an empty stub rather than inlining it) yet `gina.ready` handlers and the auto-boot validator released at `DOMContentLoaded`, so anything calling `getRoute()`/`toUrl()` during handler or form-bind initialisation ran against an empty table; loopback wins that race by single-digit milliseconds, which is why development and the local suites never see it, while a real deployment loses it by 150ms or more on every load, deterministically — a validator form rule naming a route then threw inside the init listener, the event dispatch swallowed the throw, and the instance's `ready` never fired, silently. All three release paths now gate on the dependency settling (the ready-list scheduler, the validator auto-boot poll, and the late-registration path that previously bypassed the scheduler entirely and fired immediately), settled deliberately meaning loaded **or** failed so a broken endpoint still releases handlers rather than hanging the page, with a parse-time 5-second fallback force-settling in degenerate shapes where no fetch is ever issued (ACTION REQUIRED only in the sense of timing: on deployed tiers handlers now fire 150ms–1.3s later than before, when routing is actually available). Alongside it, client `getRoute()` no longer crashes with a context-free TypeError when a bundle's routing table is absent — the client `getRouting()` returns null by design, and the bare dereference of that null sat one line above the very diagnostic built for the degraded-table case, so the case it existed for was exactly the one it could never report — and a failed routing fetch now leaves console evidence instead of booting the framework permanently degraded in silence. The couchbase connector no longer hangs a request when a `@return {number}` COUNT query does not match its alias parser: the branch dereferenced an unguarded regex match, so `SELECT COUNT(DISTINCT a.b) AS n` and an unaliased `SELECT COUNT(*)` both threw inside the connector's own result callback — no 5xx was ever produced, a promisified caller never settled, and the request hung until the client or proxy timed out, a stall then retried behind an HTTP/2 inter-bundle client; it was dev-invisible too, since the dev path strips only the first comment block, so a commented-out parsable COUNT elsewhere in the file kept the regex satisfied locally while production threw on the identical file. The branch now derives the count from the first projected column with no regex at all, guarded against empty result sets, empty rows and null payloads, exactly as mysql, postgresql, scylladb and sqlite already did (ACTION REQUIRED if a multi-column projection puts its COUNT anywhere but first: the returned value is now the first column rather than the aliased one, consistent with every other connector). The same connector now trims and lowercases the types it reads from `@return` and `@param`, and bounds both captures to the first brace pair — the extracted types feed exact-match comparisons whose arms are all lowercase, so `{Number}` or `{ number }` matched nothing and was silently skipped, handing back the raw row array instead of the declared shape and leaving the parameter uncast, while a second brace pair on the same line bled into the greedy capture (ACTION REQUIRED: annotations that previously fell through silently now reach their branch, so a query declaring `@return {Number}` begins returning the declared shape; `@options` deliberately keeps its greedy capture, holding a nestable object literal rather than a single type token). Two client plugins stop leaking behaviour onto pages that never asked for it: the public link API throws a named error identifying the url and the likely cause instead of a bare TypeError, and detects the miss before the supersede step so a mistyped url no longer aborts a legitimate request still in flight; and the popin stylesheet's `::backdrop` rule is scoped to gina's own popin dialogs rather than every `<dialog>` on the page (ACTION REQUIRED if a page relied on the unscoped rule to style its own dialogs, or supplies a popin dialog element from its own markup — that element needs the `gina-popin-container` class to keep gina's backdrop). **Changed**: a changelog fragment whose filename names a tracker id must now cite that id in its body, since only the body renders into `CHANGELOG.md` and the published tarball — an id carried by filename and commit message alone ships an unnumbered entry and anyone triaging by id gets a false zero (roughly 60 of 937 historical fragments shipped that way); recognised id families are an explicit allowlist rather than a generic pattern, because the generic form false-positives on real filenames and a false positive would block a commit. Pickup: restart **and** rebuild your bundles (the browser bundle changed — both `gina.min.js` and `gina.min.css` differ from `0.6.14`). |
69
70
  | **Q1 2027** | `0.6.x` | HTTP/2 priorities (blocked on Node scheduler hooks) · Beemaster admin + visual translation editor |
70
71
  | **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`) |
71
72
  | **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 · sequence primitive · OAuth2 client-credentials egress |
@@ -0,0 +1 @@
1
+ 0.6.15
@@ -1 +1 @@
1
- @charset "UTF-8";@keyframes gina-popin-skeleton-shimmer{0%{background-position:200%0}to{background-position:-200%0}}@layer gina{[data-gina-loading=true]{cursor:progress}@keyframes gina-loading-pulse{0%{opacity:1}to{opacity:.55}}@media (prefers-reduced-motion:no-preference){[data-gina-loading=true]{animation:gina-loading-pulse .9s ease-in-out infinite alternate}}@media (prefers-reduced-motion:reduce){[data-gina-loading=true]{opacity:.7}}[data-gina-form-submit-gated=true]{cursor:not-allowed;opacity:.7}}@font-face{font-family:"have_heart_oneregular";src:url(fonts/have_heart_one-webfont.woff2)format("woff2"),url(fonts/have_heart_one-webfont.woff)format("woff");font-weight:400;font-style:normal}.gina-popin-container{background:#fff}.gina-popins-overlay,div.gina-popin-container{visibility:hidden;opacity:0;z-index:1;transition:opacity .3s,visibility 0 .3s}.gina-popins-overlay.gina-popin-is-active,div.gina-popin-container.gina-popin-is-active{opacity:1;visibility:visible;transition-delay:0}dialog.gina-popin-container{padding:0;border:0;z-index:1}@media (prefers-reduced-motion:no-preference){dialog.gina-popin-container{opacity:0;transform:translateY(-.5rem);transition:opacity .2s ease,transform .2s ease,overlay .2s ease allow-discrete,display .2s ease allow-discrete}dialog.gina-popin-container[open]{opacity:1;transform:translateY(0)}@starting-style{dialog.gina-popin-container[open]{opacity:0;transform:translateY(-.5rem)}}dialog.gina-popin-container::backdrop{opacity:0;transition:opacity .2s ease,overlay .2s ease allow-discrete,display .2s ease allow-discrete}dialog.gina-popin-container[open]::backdrop{opacity:1}@starting-style{dialog.gina-popin-container[open]::backdrop{opacity:0}}}body[data-gina-popin-scroll-lock]{overflow:hidden}.gina-popins-overlay{position:fixed;left:0;top:0;display:grid;place-items:center;width:100%;height:100%;transition:opacity .3s,visibility .3s;overflow:auto;background:rgba(0,0,0,.75)}.gina-popins-overlay.gina-popin-is-active{backdrop-filter:blur(6px)}dialog::backdrop{background-color:rgba(0,0,0,.75);backdrop-filter:blur(6px)}.gina-popin-skeleton{padding:1.5rem;min-width:18rem;max-width:90vw}.gina-popin-skeleton .gina-popin-skeleton-line{height:.85rem;margin-bottom:.75rem;border-radius:4px;background:linear-gradient(90deg,#ededed 25%,#f7f7f7 50%,#ededed 75%);background-size:200% 100%;animation:gina-popin-skeleton-shimmer 1.4s ease-in-out infinite}.gina-popin-skeleton .gina-popin-skeleton-line:last-child{margin-bottom:0}.gina-popin-skeleton .gina-popin-skeleton-title{height:1.4rem;width:60%;margin-bottom:1.25rem}.gina-popin-skeleton .gina-popin-skeleton-line--short{width:40%}@media (prefers-reduced-motion:reduce){.gina-popin-skeleton .gina-popin-skeleton-line{animation:none}}
1
+ @charset "UTF-8";@keyframes gina-popin-skeleton-shimmer{0%{background-position:200%0}to{background-position:-200%0}}@layer gina{[data-gina-loading=true]{cursor:progress}@keyframes gina-loading-pulse{0%{opacity:1}to{opacity:.55}}@media (prefers-reduced-motion:no-preference){[data-gina-loading=true]{animation:gina-loading-pulse .9s ease-in-out infinite alternate}}@media (prefers-reduced-motion:reduce){[data-gina-loading=true]{opacity:.7}}[data-gina-form-submit-gated=true]{cursor:not-allowed;opacity:.7}}@font-face{font-family:"have_heart_oneregular";src:url(fonts/have_heart_one-webfont.woff2)format("woff2"),url(fonts/have_heart_one-webfont.woff)format("woff");font-weight:400;font-style:normal}.gina-popin-container{background:#fff}.gina-popins-overlay,div.gina-popin-container{visibility:hidden;opacity:0;z-index:1;transition:opacity .3s,visibility 0 .3s}.gina-popins-overlay.gina-popin-is-active,div.gina-popin-container.gina-popin-is-active{opacity:1;visibility:visible;transition-delay:0}dialog.gina-popin-container{padding:0;border:0;z-index:1}@media (prefers-reduced-motion:no-preference){dialog.gina-popin-container{opacity:0;transform:translateY(-.5rem);transition:opacity .2s ease,transform .2s ease,overlay .2s ease allow-discrete,display .2s ease allow-discrete}dialog.gina-popin-container[open]{opacity:1;transform:translateY(0)}@starting-style{dialog.gina-popin-container[open]{opacity:0;transform:translateY(-.5rem)}}dialog.gina-popin-container::backdrop{opacity:0;transition:opacity .2s ease,overlay .2s ease allow-discrete,display .2s ease allow-discrete}dialog.gina-popin-container[open]::backdrop{opacity:1}@starting-style{dialog.gina-popin-container[open]::backdrop{opacity:0}}}body[data-gina-popin-scroll-lock]{overflow:hidden}.gina-popins-overlay{position:fixed;left:0;top:0;display:grid;place-items:center;width:100%;height:100%;transition:opacity .3s,visibility .3s;overflow:auto;background:rgba(0,0,0,.75)}.gina-popins-overlay.gina-popin-is-active{backdrop-filter:blur(6px)}dialog.gina-popin-container::backdrop{background-color:rgba(0,0,0,.75);backdrop-filter:blur(6px)}.gina-popin-skeleton{padding:1.5rem;min-width:18rem;max-width:90vw}.gina-popin-skeleton .gina-popin-skeleton-line{height:.85rem;margin-bottom:.75rem;border-radius:4px;background:linear-gradient(90deg,#ededed 25%,#f7f7f7 50%,#ededed 75%);background-size:200% 100%;animation:gina-popin-skeleton-shimmer 1.4s ease-in-out infinite}.gina-popin-skeleton .gina-popin-skeleton-line:last-child{margin-bottom:0}.gina-popin-skeleton .gina-popin-skeleton-title{height:1.4rem;width:60%;margin-bottom:1.25rem}.gina-popin-skeleton .gina-popin-skeleton-line--short{width:40%}@media (prefers-reduced-motion:reduce){.gina-popin-skeleton .gina-popin-skeleton-line{animation:none}}
@@ -6675,6 +6675,15 @@ function Routing() {
6675
6675
  // }
6676
6676
 
6677
6677
 
6678
+ // #B415 — client-side getRouting returns null BY DESIGN when nothing
6679
+ // matches (a {} table before the routing fetch lands, or a bundle with
6680
+ // no rules). The bare `routing[rule]` deref below then threw a context-
6681
+ // free TypeError ONE LINE ABOVE the #B132 diagnostic — so the degraded-
6682
+ // table case #B132 was built for was exactly the one it could never
6683
+ // report. Name the bundle and the likely cause instead.
6684
+ if ( !routing ) {
6685
+ throw new Error('[ RoutingHelper::getRoute(rule, params) ] : bundle `'+ bundle +'` has no routing table for rule `'+ rule +'` (client: routing config not loaded yet, or empty)')
6686
+ }
6678
6687
  if ( typeof(routing[rule]) == 'undefined' ) {
6679
6688
  // #B132 — name the bundle + its table size so a degraded/near-empty
6680
6689
  // table (e.g. a bundle whose routing config never loaded) is
@@ -10075,6 +10084,10 @@ define('gina/link', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge',
10075
10084
  * url lookup run. Before this order existed, two anchors sharing one url
10076
10085
  * collapsed onto whichever registered first, whichever was clicked.
10077
10086
  *
10087
+ * A url that resolves to no registration throws a named error BEFORE the
10088
+ * supersede step (#B328) — a miss can never abort a request already in
10089
+ * flight, and the message names the url plus the likely cause.
10090
+ *
10078
10091
  * Side effects: supersedes any request still in flight, arms `data-gina-loading`
10079
10092
  * on the anchor for the duration of this one, and releases it from a `loadend`
10080
10093
  * listener. An indefinite hang is the single outcome that never releases, because
@@ -10083,6 +10096,8 @@ define('gina/link', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge',
10083
10096
  * @param {string} url - URL to request
10084
10097
  * @param {object} [options] - XHR options, merged over the link's own
10085
10098
  *
10099
+ * @throws {Error} when `url` matches no registration (the public-path miss)
10100
+ *
10086
10101
  * @returns {void}
10087
10102
  *
10088
10103
  * @example
@@ -10097,6 +10112,20 @@ define('gina/link', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge',
10097
10112
  var $operated = _operatedLink;
10098
10113
  _operatedLink = null;
10099
10114
 
10115
+ // link object — #B287: the operated registration wins; the first-match
10116
+ // url lookup remains only for the public `gina.link.request(url)` path.
10117
+ // #B328 — resolved (and guarded) BEFORE the transport block below:
10118
+ // resolving after it meant a mistyped public url had already aborted a
10119
+ // legitimate in-flight request before throwing a bare TypeError on
10120
+ // `$link.id`. A miss now leaves transport state untouched.
10121
+ var $link = $operated || getLinkByUrl(url);
10122
+ if ( !$link ) {
10123
+ // Named like #B415's null-table guard: tell a mistyped url from the
10124
+ // real second shape — a registration added by a later construction,
10125
+ // which the published instance's walk cannot see (#B326).
10126
+ throw new Error('[ LinkHandler::request(url, options) ] : no link is registered for url `'+ url +'` (never bound, or bound by a later construction — the published instance walks only its own registrations)');
10127
+ }
10128
+
10100
10129
  // One transport per request, and a sequence taken BEFORE the abort so a
10101
10130
  // supersede-abort is stale by construction — its handler sees
10102
10131
  // `seq !== _linkSeq` and drops out, which is what keeps the abort from
@@ -10110,9 +10139,6 @@ define('gina/link', [ 'require', 'lib/domain', 'lib/loading-state', 'lib/merge',
10110
10139
  var xhr = createXhr();
10111
10140
  _linkXhr = xhr;
10112
10141
 
10113
- // link object — #B287: the operated registration wins; the first-match
10114
- // url lookup remains only for the public `gina.link.request(url)` path.
10115
- var $link = $operated || getLinkByUrl(url);
10116
10142
  var id = $link.id;
10117
10143
 
10118
10144
 
@@ -28625,6 +28651,55 @@ var readyList = [
28625
28651
  var readyFired = false;
28626
28652
  var readyEventHandlersInstalled = false;
28627
28653
 
28654
+ // #B414 — the framework's ONE mandatory client dependency (the routing table,
28655
+ // fetched by getDependencies from `<webroot>_gina/assets/routing.json`) must be
28656
+ // SETTLED before any consumer handler runs: the server whispers
28657
+ // `page.environment.routing` as a hardcoded '{}' (the real export is commented
28658
+ // out — "Adding 289 KB"), so between DOMContentLoaded and the fetch landing,
28659
+ // `gina.config.routing` is {} and any getRoute()/toUrl() in handler init throws
28660
+ // or misroutes. Loopback wins that race by single-digit ms; a real deployment
28661
+ // LOSES it by 150ms+ on every load — deterministic breakage that local dev can
28662
+ // never see. "Settled" deliberately means loaded OR failed: loadRoutingConf
28663
+ // dispatches `deps.loaded` on both paths, so a broken endpoint still releases
28664
+ // handlers (with console evidence via the listener) instead of hanging the page.
28665
+ var _ginaDepsSettled = false;
28666
+ var _ginaDepsQueue = [];
28667
+ /**
28668
+ * Marks the mandatory client deps settled and drains every queued callback.
28669
+ * Idempotent — the forced (timeout) and real (deps.loaded) paths can both fire.
28670
+ * @param {boolean} [forced] - true when the 5s fallback fired before the deps
28671
+ * @inner
28672
+ */
28673
+ function _settleDeps(forced) {
28674
+ if (_ginaDepsSettled) return;
28675
+ _ginaDepsSettled = true;
28676
+ if (forced && typeof(console) != 'undefined' && console.error) {
28677
+ console.error('[gina] routing dependency still pending after 5s — releasing handlers with a degraded routing table');
28678
+ }
28679
+ while (_ginaDepsQueue.length) {
28680
+ try { _ginaDepsQueue.shift()(); } catch (depsCbErr) {
28681
+ if ( typeof(console) != 'undefined' && console.error ) {
28682
+ console.error(depsCbErr.stack || depsCbErr.message || depsCbErr);
28683
+ }
28684
+ }
28685
+ }
28686
+ }
28687
+ /**
28688
+ * Runs `fn` now if the mandatory deps have settled, else queues it for the
28689
+ * settle drain (real or forced).
28690
+ * @param {function} fn
28691
+ * @inner
28692
+ */
28693
+ function _whenDepsSettled(fn) {
28694
+ if (_ginaDepsSettled) { fn(); return; }
28695
+ _ginaDepsQueue.push(fn);
28696
+ }
28697
+ // Armed at PARSE TIME on purpose — NOT inside getDependencies: on a page where
28698
+ // the script-tag scan matches nothing (renamed src, static harness) the fetch
28699
+ // is never issued, so a timer armed there would never start and the gate would
28700
+ // hang handlers forever in exactly the degenerate case it exists to protect.
28701
+ setTimeout(function () { _settleDeps(true); }, 5000);
28702
+
28628
28703
  // call this when the document is ready
28629
28704
  // this function protects itself against being called more than once
28630
28705
  function ready() {
@@ -28651,7 +28726,13 @@ function ready() {
28651
28726
  result = readyList[i].fn.call(window, readyList[i].ctx, window.require);
28652
28727
 
28653
28728
  // clear
28654
- if (result) {
28729
+ // #B414 — advance past the gina entry only once the
28730
+ // routing dependency has settled too: a truthy
28731
+ // onGinaLoaded means only that the LOADER's whispers
28732
+ // ran (isFrameworkLoaded), never that the async
28733
+ // routing fetch landed. Releasing here without it
28734
+ // ran consumer handlers against a {} table.
28735
+ if (result && _ginaDepsSettled) {
28655
28736
  window.clearInterval(scheduler);
28656
28737
  ++i;
28657
28738
  handleEvent(i, readyList);
@@ -28742,7 +28823,12 @@ if ( typeof(window['gina']) == 'undefined' ) { // could have be defined by loade
28742
28823
  /**
28743
28824
  * ready
28744
28825
  * This is the one public interface use to wrap `handlers`
28745
- * It is an equivalent of document.addEventListener('DOMContentLoaded', cb)
28826
+ * It fires once BOTH document readiness (DOMContentLoaded-equivalent)
28827
+ * AND the framework's mandatory routing dependency have settled — the
28828
+ * routing table arrives by async fetch, so DOMContentLoaded alone was
28829
+ * too early on deployed tiers (#B414). If the fetch fails or never
28830
+ * starts, handlers still release (settle-on-error / 5s fallback), with
28831
+ * console evidence.
28746
28832
  *
28747
28833
  * No need to use it for `handlers`, it is automatically applied for each `handler`
28748
28834
  *
@@ -28756,7 +28842,14 @@ if ( typeof(window['gina']) == 'undefined' ) { // could have be defined by loade
28756
28842
  // if ready has already beenfired, then just schedule the callback
28757
28843
  // to fire asynchronously, but right away
28758
28844
  if (readyFired) {
28759
- setTimeout(function() {callback(context);}, 1);
28845
+ // #B414 — the late-registration path must gate on the routing
28846
+ // dependency too: this branch bypasses the readyList scheduler
28847
+ // entirely, so without the gate a handler registered after
28848
+ // DOMContentLoaded (a deferred script, a handler registered
28849
+ // from another handler) still ran against a {} table.
28850
+ _whenDepsSettled(function () {
28851
+ setTimeout(function() {callback(context);}, 1);
28852
+ });
28760
28853
  return;
28761
28854
  } else {
28762
28855
  // add the function and context to the list
@@ -28882,7 +28975,14 @@ require([
28882
28975
  var _validatorBootTries = 0;
28883
28976
  var bootValidator = function () {
28884
28977
  try {
28885
- if ( !window['gina'] || !window['gina']['isFrameworkLoaded'] ) {
28978
+ // #B414 `_ginaDepsSettled` joins the gate: `isFrameworkLoaded`
28979
+ // guarantees the whispers (incl. gina.forms) ran, but NOT that the
28980
+ // async routing fetch landed — and a form rule may name a route
28981
+ // (the `query` rule), which evaluates at bind. Constructing before
28982
+ // the deps settle bound forms against a {} table and died inside
28983
+ // the init listener. Settle-on-error + the 5s fallback keep this
28984
+ // poll terminating in every degenerate shape.
28985
+ if ( !window['gina'] || !window['gina']['isFrameworkLoaded'] || !_ginaDepsSettled ) {
28886
28986
  if ( _validatorBootTries++ < 100 ) {
28887
28987
  (window['setTimeout'] || function (fn) { fn(); })(bootValidator, 50);
28888
28988
  }
@@ -29046,9 +29146,21 @@ function getDependencies(gina, cb) {
29046
29146
  // }
29047
29147
  ];
29048
29148
  depsEventBus.addEventListener('deps.loaded', (event) => {
29149
+ // #B416 — surface the failure the event carries: loadRoutingConf
29150
+ // dispatches this on ERROR too (that is what keeps the boot alive),
29151
+ // but the detail was discarded — a failed fetch (#B213's guard
29152
+ // throwing on a non-OK status) booted the framework permanently
29153
+ // degraded (routing {}) with ZERO console evidence.
29154
+ if ( event && event.detail && event.detail.error ) {
29155
+ if ( typeof(console) != 'undefined' && console.error ) {
29156
+ console.error('[gina] routing dependency failed to load — client getRoute()/toUrl() will be degraded until reload:', event.detail.error.stack || event.detail.error.message || event.detail.error);
29157
+ }
29158
+ }
29049
29159
  arr.splice(0,1);
29050
29160
  if (!arr.length) {
29051
- // Deps ready
29161
+ // Deps settled (loaded or failed) — release the #B414 gate, then
29162
+ // run the script-onload continuation (the ginaloaded attach).
29163
+ _settleDeps();
29052
29164
  cb()
29053
29165
  }
29054
29166
  });