gina 0.6.1 → 0.6.2

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 (561) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +15 -25
  3. package/ROADMAP.md +8 -6
  4. package/framework/v0.6.2/VERSION +1 -0
  5. package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/js/gina.js +12 -3
  6. package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +160 -160
  7. package/framework/v0.6.2/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  8. package/framework/v0.6.2/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  9. package/framework/{v0.6.1 → v0.6.2}/core/config.js +63 -2
  10. package/framework/{v0.6.1 → v0.6.2}/core/controller/controller.js +279 -10
  11. package/framework/{v0.6.1 → v0.6.2}/core/controller/controller.render-nunjucks.js +5 -1
  12. package/framework/{v0.6.1 → v0.6.2}/core/controller/controller.render-swig.js +13 -1
  13. package/framework/{v0.6.1 → v0.6.2}/core/gna.js +31 -0
  14. package/framework/{v0.6.1 → v0.6.2}/core/template/conf/env.json +12 -0
  15. package/framework/{v0.6.1 → v0.6.2}/lib/nunjucks-filters/src/main.js +7 -1
  16. package/framework/{v0.6.1 → v0.6.2}/lib/proc.js +15 -1
  17. package/framework/{v0.6.1 → v0.6.2}/lib/swig-filters/src/main.js +12 -1
  18. package/framework/{v0.6.1 → v0.6.2}/lib/uuid/src/main.js +12 -3
  19. package/framework/{v0.6.1 → v0.6.2}/package.json +1 -1
  20. package/gna.js +4 -4
  21. package/llms.txt +5 -3
  22. package/package.json +3 -3
  23. package/schema/settings.json +22 -0
  24. package/script/perf/analyze-cpuprofile.js +187 -0
  25. package/script/perf/profile-baseline.js +811 -0
  26. package/script/perf/ws-codec-server.js +44 -0
  27. package/utils/prototypes.json_clone.js +5 -2
  28. package/framework/v0.6.1/VERSION +0 -1
  29. package/framework/v0.6.1/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  30. package/framework/v0.6.1/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  31. /package/framework/{v0.6.1 → v0.6.2}/AUTHORS +0 -0
  32. /package/framework/{v0.6.1 → v0.6.2}/LICENSE +0 -0
  33. /package/framework/{v0.6.1 → v0.6.2}/core/asset/html/nolayout.html +0 -0
  34. /package/framework/{v0.6.1 → v0.6.2}/core/asset/html/static.html +0 -0
  35. /package/framework/{v0.6.1 → v0.6.2}/core/asset/img/android-chrome-192x192.png +0 -0
  36. /package/framework/{v0.6.1 → v0.6.2}/core/asset/img/android-chrome-512x512.png +0 -0
  37. /package/framework/{v0.6.1 → v0.6.2}/core/asset/img/apple-touch-icon.png +0 -0
  38. /package/framework/{v0.6.1 → v0.6.2}/core/asset/img/favicon-16x16.png +0 -0
  39. /package/framework/{v0.6.1 → v0.6.2}/core/asset/img/favicon-32x32.png +0 -0
  40. /package/framework/{v0.6.1 → v0.6.2}/core/asset/img/favicon.ico +0 -0
  41. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/README.md +0 -0
  42. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  43. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  44. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  45. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  46. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  47. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  48. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  49. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  50. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  51. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  52. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  53. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  54. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  55. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  56. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  57. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  58. /package/framework/{v0.6.1 → v0.6.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  59. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/ai/index.js +0 -0
  60. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/ai/lib/connector.js +0 -0
  61. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/couchbase/index.js +0 -0
  62. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/couchbase/lib/connector.js +0 -0
  63. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  64. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  65. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/couchbase/lib/n1ql.js +0 -0
  66. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/couchbase/lib/session-store.js +0 -0
  67. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  68. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  69. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/duckdb/index.js +0 -0
  70. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/duckdb/lib/connector.js +0 -0
  71. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/mongodb/index.js +0 -0
  72. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/mongodb/lib/connector.js +0 -0
  73. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/mongodb/lib/job-store.js +0 -0
  74. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
  75. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/mongodb/lib/session-store.js +0 -0
  76. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/mysql/index.js +0 -0
  77. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/mysql/lib/connector.js +0 -0
  78. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/postgresql/index.js +0 -0
  79. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/postgresql/lib/connector.js +0 -0
  80. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/redis/index.js +0 -0
  81. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/redis/lib/connector.js +0 -0
  82. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/redis/lib/job-store.js +0 -0
  83. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/redis/lib/render-cache-store.js +0 -0
  84. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/redis/lib/session-store.js +0 -0
  85. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/scylladb/index.js +0 -0
  86. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/scylladb/lib/connector.js +0 -0
  87. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/scylladb/lib/session-store.js +0 -0
  88. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/sql-parser.js +0 -0
  89. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/sqlite/index.js +0 -0
  90. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/sqlite/lib/connector.js +0 -0
  91. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/sqlite/lib/job-store.js +0 -0
  92. /package/framework/{v0.6.1 → v0.6.2}/core/connectors/sqlite/lib/session-store.js +0 -0
  93. /package/framework/{v0.6.1 → v0.6.2}/core/content.encoding +0 -0
  94. /package/framework/{v0.6.1 → v0.6.2}/core/controller/controller.framework.js +0 -0
  95. /package/framework/{v0.6.1 → v0.6.2}/core/controller/controller.render-json.js +0 -0
  96. /package/framework/{v0.6.1 → v0.6.2}/core/controller/controller.render-nunjucks-async.js +0 -0
  97. /package/framework/{v0.6.1 → v0.6.2}/core/controller/controller.render-stream.js +0 -0
  98. /package/framework/{v0.6.1 → v0.6.2}/core/controller/controller.render-swig-async.js +0 -0
  99. /package/framework/{v0.6.1 → v0.6.2}/core/controller/controller.render-v1.js +0 -0
  100. /package/framework/{v0.6.1 → v0.6.2}/core/controller/index.js +0 -0
  101. /package/framework/{v0.6.1 → v0.6.2}/core/controller/inspector-window-emit.js +0 -0
  102. /package/framework/{v0.6.1 → v0.6.2}/core/controller/release-banner.js +0 -0
  103. /package/framework/{v0.6.1 → v0.6.2}/core/dev/index.js +0 -0
  104. /package/framework/{v0.6.1 → v0.6.2}/core/dev/lib/class.js +0 -0
  105. /package/framework/{v0.6.1 → v0.6.2}/core/dev/lib/factory.js +0 -0
  106. /package/framework/{v0.6.1 → v0.6.2}/core/dev/lib/tools.js +0 -0
  107. /package/framework/{v0.6.1 → v0.6.2}/core/locales/README.md +0 -0
  108. /package/framework/{v0.6.1 → v0.6.2}/core/locales/currency.json +0 -0
  109. /package/framework/{v0.6.1 → v0.6.2}/core/locales/dist/language/en.json +0 -0
  110. /package/framework/{v0.6.1 → v0.6.2}/core/locales/dist/language/fr.json +0 -0
  111. /package/framework/{v0.6.1 → v0.6.2}/core/locales/dist/region/en.json +0 -0
  112. /package/framework/{v0.6.1 → v0.6.2}/core/locales/dist/region/fr.json +0 -0
  113. /package/framework/{v0.6.1 → v0.6.2}/core/locales/index.js +0 -0
  114. /package/framework/{v0.6.1 → v0.6.2}/core/mime.types +0 -0
  115. /package/framework/{v0.6.1 → v0.6.2}/core/model/entity.js +0 -0
  116. /package/framework/{v0.6.1 → v0.6.2}/core/model/index.js +0 -0
  117. /package/framework/{v0.6.1 → v0.6.2}/core/model/template/entityFactory.js +0 -0
  118. /package/framework/{v0.6.1 → v0.6.2}/core/model/template/index.js +0 -0
  119. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/README.md +0 -0
  120. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/index.js +0 -0
  121. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/csrf/README.md +0 -0
  122. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/csrf/package.json +0 -0
  123. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/csrf/src/main.js +0 -0
  124. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/README.md +0 -0
  125. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/coep/README.md +0 -0
  126. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/coep/package.json +0 -0
  127. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
  128. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/coop/README.md +0 -0
  129. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/coop/package.json +0 -0
  130. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
  131. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/corp/README.md +0 -0
  132. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/corp/package.json +0 -0
  133. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
  134. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/csp/README.md +0 -0
  135. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/csp/package.json +0 -0
  136. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
  137. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
  138. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
  139. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
  140. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/hsts/README.md +0 -0
  141. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/hsts/package.json +0 -0
  142. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
  143. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
  144. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
  145. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
  146. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/package.json +0 -0
  147. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
  148. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
  149. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
  150. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/src/main.js +0 -0
  151. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
  152. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
  153. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
  154. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
  155. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
  156. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
  157. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
  158. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
  159. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
  160. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
  161. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
  162. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
  163. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
  164. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
  165. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
  166. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
  167. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
  168. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
  169. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/session/README.md +0 -0
  170. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/session/package.json +0 -0
  171. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/session/src/main.js +0 -0
  172. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/storage/README.md +0 -0
  173. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/storage/build.json +0 -0
  174. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/storage/package.json +0 -0
  175. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/storage/src/main.js +0 -0
  176. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/validator/README.md +0 -0
  177. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/validator/build.json +0 -0
  178. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/validator/package.json +0 -0
  179. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/validator/src/form-validator.js +0 -0
  180. /package/framework/{v0.6.1 → v0.6.2}/core/plugins/lib/validator/src/main.js +0 -0
  181. /package/framework/{v0.6.1 → v0.6.2}/core/router.js +0 -0
  182. /package/framework/{v0.6.1 → v0.6.2}/core/server.express.js +0 -0
  183. /package/framework/{v0.6.1 → v0.6.2}/core/server.isaac.js +0 -0
  184. /package/framework/{v0.6.1 → v0.6.2}/core/server.js +0 -0
  185. /package/framework/{v0.6.1 → v0.6.2}/core/status.codes +0 -0
  186. /package/framework/{v0.6.1 → v0.6.2}/core/template/_gitignore +0 -0
  187. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle/config/app.json +0 -0
  188. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  189. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle/config/routing.json +0 -0
  190. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle/config/settings.json +0 -0
  191. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  192. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle/config/templates.json +0 -0
  193. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  194. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  195. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  196. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  197. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle/index.js +0 -0
  198. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle/locales/en.json +0 -0
  199. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  200. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  201. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  202. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  203. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  204. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
  205. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  206. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
  207. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_public/readme.md +0 -0
  208. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_public/sw.js +0 -0
  209. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  210. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  211. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  212. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  213. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
  214. /package/framework/{v0.6.1 → v0.6.2}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  215. /package/framework/{v0.6.1 → v0.6.2}/core/template/command/gina.bat.tpl +0 -0
  216. /package/framework/{v0.6.1 → v0.6.2}/core/template/command/gina.tpl +0 -0
  217. /package/framework/{v0.6.1 → v0.6.2}/core/template/conf/manifest.json +0 -0
  218. /package/framework/{v0.6.1 → v0.6.2}/core/template/conf/package.json +0 -0
  219. /package/framework/{v0.6.1 → v0.6.2}/core/template/conf/settings.json +0 -0
  220. /package/framework/{v0.6.1 → v0.6.2}/core/template/conf/statics.json +0 -0
  221. /package/framework/{v0.6.1 → v0.6.2}/core/template/conf/templates.json +0 -0
  222. /package/framework/{v0.6.1 → v0.6.2}/core/template/error/client/json/401.json +0 -0
  223. /package/framework/{v0.6.1 → v0.6.2}/core/template/error/client/json/403.json +0 -0
  224. /package/framework/{v0.6.1 → v0.6.2}/core/template/error/client/json/404.json +0 -0
  225. /package/framework/{v0.6.1 → v0.6.2}/core/template/error/server/html/50x.html +0 -0
  226. /package/framework/{v0.6.1 → v0.6.2}/core/template/error/server/json/500.json +0 -0
  227. /package/framework/{v0.6.1 → v0.6.2}/core/template/error/server/json/503.json +0 -0
  228. /package/framework/{v0.6.1 → v0.6.2}/core/template/extensions/logger/config.json +0 -0
  229. /package/framework/{v0.6.1 → v0.6.2}/helpers/console.js +0 -0
  230. /package/framework/{v0.6.1 → v0.6.2}/helpers/context.js +0 -0
  231. /package/framework/{v0.6.1 → v0.6.2}/helpers/data/LICENSE +0 -0
  232. /package/framework/{v0.6.1 → v0.6.2}/helpers/data/README.md +0 -0
  233. /package/framework/{v0.6.1 → v0.6.2}/helpers/data/package.json +0 -0
  234. /package/framework/{v0.6.1 → v0.6.2}/helpers/data/src/main.js +0 -0
  235. /package/framework/{v0.6.1 → v0.6.2}/helpers/dateFormat.js +0 -0
  236. /package/framework/{v0.6.1 → v0.6.2}/helpers/index.js +0 -0
  237. /package/framework/{v0.6.1 → v0.6.2}/helpers/json/LICENSE +0 -0
  238. /package/framework/{v0.6.1 → v0.6.2}/helpers/json/README.md +0 -0
  239. /package/framework/{v0.6.1 → v0.6.2}/helpers/json/package.json +0 -0
  240. /package/framework/{v0.6.1 → v0.6.2}/helpers/json/src/main.js +0 -0
  241. /package/framework/{v0.6.1 → v0.6.2}/helpers/path.js +0 -0
  242. /package/framework/{v0.6.1 → v0.6.2}/helpers/plugins/README.md +0 -0
  243. /package/framework/{v0.6.1 → v0.6.2}/helpers/plugins/package.json +0 -0
  244. /package/framework/{v0.6.1 → v0.6.2}/helpers/plugins/src/api-error.js +0 -0
  245. /package/framework/{v0.6.1 → v0.6.2}/helpers/plugins/src/main.js +0 -0
  246. /package/framework/{v0.6.1 → v0.6.2}/helpers/prototypes.js +0 -0
  247. /package/framework/{v0.6.1 → v0.6.2}/helpers/task.js +0 -0
  248. /package/framework/{v0.6.1 → v0.6.2}/helpers/text.js +0 -0
  249. /package/framework/{v0.6.1 → v0.6.2}/lib/admin/package.json +0 -0
  250. /package/framework/{v0.6.1 → v0.6.2}/lib/admin/src/main.js +0 -0
  251. /package/framework/{v0.6.1 → v0.6.2}/lib/archiver/README.md +0 -0
  252. /package/framework/{v0.6.1 → v0.6.2}/lib/archiver/build.json +0 -0
  253. /package/framework/{v0.6.1 → v0.6.2}/lib/archiver/package.json +0 -0
  254. /package/framework/{v0.6.1 → v0.6.2}/lib/archiver/src/dep/jszip.min.js +0 -0
  255. /package/framework/{v0.6.1 → v0.6.2}/lib/archiver/src/main.js +0 -0
  256. /package/framework/{v0.6.1 → v0.6.2}/lib/async/package.json +0 -0
  257. /package/framework/{v0.6.1 → v0.6.2}/lib/async/src/main.js +0 -0
  258. /package/framework/{v0.6.1 → v0.6.2}/lib/audit/package.json +0 -0
  259. /package/framework/{v0.6.1 → v0.6.2}/lib/audit/src/main.js +0 -0
  260. /package/framework/{v0.6.1 → v0.6.2}/lib/audit-store.js +0 -0
  261. /package/framework/{v0.6.1 → v0.6.2}/lib/authn/package.json +0 -0
  262. /package/framework/{v0.6.1 → v0.6.2}/lib/authn/src/lockout.js +0 -0
  263. /package/framework/{v0.6.1 → v0.6.2}/lib/authn/src/main.js +0 -0
  264. /package/framework/{v0.6.1 → v0.6.2}/lib/authn/src/totp.js +0 -0
  265. /package/framework/{v0.6.1 → v0.6.2}/lib/authz-gate/package.json +0 -0
  266. /package/framework/{v0.6.1 → v0.6.2}/lib/authz-gate/src/main.js +0 -0
  267. /package/framework/{v0.6.1 → v0.6.2}/lib/cache/README.md +0 -0
  268. /package/framework/{v0.6.1 → v0.6.2}/lib/cache/build.json +0 -0
  269. /package/framework/{v0.6.1 → v0.6.2}/lib/cache/package.json +0 -0
  270. /package/framework/{v0.6.1 → v0.6.2}/lib/cache/src/main.js +0 -0
  271. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/aliases.json +0 -0
  272. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/audit/arguments.json +0 -0
  273. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/audit/help.txt +0 -0
  274. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/audit/verify.js +0 -0
  275. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/add.js +0 -0
  276. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/arguments.json +0 -0
  277. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/build.js +0 -0
  278. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/copy.js +0 -0
  279. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/cp.js +0 -0
  280. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/help.js +0 -0
  281. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/help.txt +0 -0
  282. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
  283. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/list.js +0 -0
  284. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/man.js +0 -0
  285. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/mcp-start.js +0 -0
  286. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/mcp.js +0 -0
  287. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/oas.js +0 -0
  288. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/openapi.js +0 -0
  289. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/remove.js +0 -0
  290. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/rename.js +0 -0
  291. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/restart.js +0 -0
  292. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/rm.js +0 -0
  293. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/start.js +0 -0
  294. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/status.js +0 -0
  295. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/stop.js +0 -0
  296. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/bundle/types.js +0 -0
  297. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/cache/arguments.json +0 -0
  298. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/cache/clear.js +0 -0
  299. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/cache/help.txt +0 -0
  300. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/cache/stats.js +0 -0
  301. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/connector/add.js +0 -0
  302. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/connector/arguments.json +0 -0
  303. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/connector/help.js +0 -0
  304. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/connector/help.txt +0 -0
  305. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/connector/infer.js +0 -0
  306. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/connector/list.js +0 -0
  307. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/connector/migrate.js +0 -0
  308. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/connector/models.js +0 -0
  309. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/connector/remove.js +0 -0
  310. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/connector/rm.js +0 -0
  311. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/connector/test.js +0 -0
  312. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/container/arguments.json +0 -0
  313. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/container/help.js +0 -0
  314. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/container/help.txt +0 -0
  315. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/container/man.js +0 -0
  316. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/container/ps.js +0 -0
  317. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/container/stop.js +0 -0
  318. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/controller/add.js +0 -0
  319. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/controller/arguments.json +0 -0
  320. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/controller/help.txt +0 -0
  321. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/controller/inc/args.js +0 -0
  322. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/controller/inc/namespace.js +0 -0
  323. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
  324. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/controller/inc/reference-scan.js +0 -0
  325. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/controller/inc/scaffold.js +0 -0
  326. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/controller/remove.js +0 -0
  327. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/controller/rename.js +0 -0
  328. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/controller/rm.js +0 -0
  329. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/env/add.js +0 -0
  330. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/env/get.js +0 -0
  331. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/env/help.js +0 -0
  332. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/env/help.txt +0 -0
  333. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/env/link-dev.js +0 -0
  334. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/env/list.js +0 -0
  335. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/env/remove.js +0 -0
  336. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/env/rm.js +0 -0
  337. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/env/set.js +0 -0
  338. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/env/unset.js +0 -0
  339. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/env/use.js +0 -0
  340. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/add.js +0 -0
  341. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/arguments.json +0 -0
  342. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/build.js +0 -0
  343. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/dot.js +0 -0
  344. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/get.js +0 -0
  345. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/help.js +0 -0
  346. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/help.txt +0 -0
  347. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/init.js +0 -0
  348. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/link-node-modules.js +0 -0
  349. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/link.js +0 -0
  350. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/list.js +0 -0
  351. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/man.js +0 -0
  352. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/msg.json +0 -0
  353. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/open.js +0 -0
  354. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/remove.js +0 -0
  355. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/reset.js +0 -0
  356. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/restart.js +0 -0
  357. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/set.js +0 -0
  358. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/start.js +0 -0
  359. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/status.js +0 -0
  360. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/stop.js +0 -0
  361. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/tail.js +0 -0
  362. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/update.js +0 -0
  363. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/framework/version.js +0 -0
  364. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/gina-dev.1.md +0 -0
  365. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/gina-framework.1.md +0 -0
  366. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/gina.1.md +0 -0
  367. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/helper.js +0 -0
  368. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/i18n/add.js +0 -0
  369. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/i18n/arguments.json +0 -0
  370. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/i18n/export.js +0 -0
  371. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/i18n/help.js +0 -0
  372. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/i18n/help.txt +0 -0
  373. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/i18n/import.js +0 -0
  374. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/i18n/scan.js +0 -0
  375. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/image/_host.js +0 -0
  376. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/image/arguments.json +0 -0
  377. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/image/build.js +0 -0
  378. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/image/help.js +0 -0
  379. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/image/help.txt +0 -0
  380. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/image/list.js +0 -0
  381. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/image/man.js +0 -0
  382. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/image/rm.js +0 -0
  383. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/image/run.js +0 -0
  384. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/index.js +0 -0
  385. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/inspector/help.js +0 -0
  386. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/inspector/help.txt +0 -0
  387. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/inspector/open.js +0 -0
  388. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/man-render.js +0 -0
  389. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/minion/arguments.json +0 -0
  390. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/minion/help.js +0 -0
  391. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/minion/help.txt +0 -0
  392. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/minion/kill.js +0 -0
  393. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/minion/list.js +0 -0
  394. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/msg.json +0 -0
  395. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/port/help.js +0 -0
  396. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/port/help.txt +0 -0
  397. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/port/inc/scan.js +0 -0
  398. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/port/list.js +0 -0
  399. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/port/reset.js +0 -0
  400. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/port/set.js +0 -0
  401. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/add.js +0 -0
  402. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/arguments.json +0 -0
  403. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/backup.js +0 -0
  404. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/build.js +0 -0
  405. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/help.js +0 -0
  406. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/help.txt +0 -0
  407. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/import.js +0 -0
  408. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/list.js +0 -0
  409. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/man.js +0 -0
  410. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/move.js +0 -0
  411. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/remove.js +0 -0
  412. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/rename.js +0 -0
  413. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/restart.js +0 -0
  414. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/restore.js +0 -0
  415. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/rm.js +0 -0
  416. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/start.js +0 -0
  417. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/status.js +0 -0
  418. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/project/stop.js +0 -0
  419. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/protocol/arguments.json +0 -0
  420. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/protocol/help.js +0 -0
  421. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/protocol/help.txt +0 -0
  422. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/protocol/list.js +0 -0
  423. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/protocol/remove.js +0 -0
  424. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/protocol/set.js +0 -0
  425. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/scope/add.js +0 -0
  426. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/scope/help.js +0 -0
  427. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/scope/help.txt +0 -0
  428. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/scope/link-local.js +0 -0
  429. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/scope/link-production.js +0 -0
  430. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/scope/list.js +0 -0
  431. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/scope/remove.js +0 -0
  432. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/scope/rm.js +0 -0
  433. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/scope/use.js +0 -0
  434. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/secrets/arguments.json +0 -0
  435. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/secrets/check.js +0 -0
  436. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/secrets/help.js +0 -0
  437. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/secrets/help.txt +0 -0
  438. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/secrets/scan.js +0 -0
  439. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/service/help.js +0 -0
  440. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/service/help.txt +0 -0
  441. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/service/list.js +0 -0
  442. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/service/man.js +0 -0
  443. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/service/start.js +0 -0
  444. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd/view/add.js +0 -0
  445. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd-status-format/package.json +0 -0
  446. /package/framework/{v0.6.1 → v0.6.2}/lib/cmd-status-format/src/main.js +0 -0
  447. /package/framework/{v0.6.1 → v0.6.2}/lib/collection/README.md +0 -0
  448. /package/framework/{v0.6.1 → v0.6.2}/lib/collection/build.json +0 -0
  449. /package/framework/{v0.6.1 → v0.6.2}/lib/collection/package.json +0 -0
  450. /package/framework/{v0.6.1 → v0.6.2}/lib/collection/src/main.js +0 -0
  451. /package/framework/{v0.6.1 → v0.6.2}/lib/config.js +0 -0
  452. /package/framework/{v0.6.1 → v0.6.2}/lib/connector-config/package.json +0 -0
  453. /package/framework/{v0.6.1 → v0.6.2}/lib/connector-config/src/main.js +0 -0
  454. /package/framework/{v0.6.1 → v0.6.2}/lib/connector-error/package.json +0 -0
  455. /package/framework/{v0.6.1 → v0.6.2}/lib/connector-error/src/main.js +0 -0
  456. /package/framework/{v0.6.1 → v0.6.2}/lib/connector-registry/package.json +0 -0
  457. /package/framework/{v0.6.1 → v0.6.2}/lib/connector-registry/src/main.js +0 -0
  458. /package/framework/{v0.6.1 → v0.6.2}/lib/cron/README.md +0 -0
  459. /package/framework/{v0.6.1 → v0.6.2}/lib/cron/package.json +0 -0
  460. /package/framework/{v0.6.1 → v0.6.2}/lib/cron/src/main.js +0 -0
  461. /package/framework/{v0.6.1 → v0.6.2}/lib/domain/LICENSE +0 -0
  462. /package/framework/{v0.6.1 → v0.6.2}/lib/domain/README.md +0 -0
  463. /package/framework/{v0.6.1 → v0.6.2}/lib/domain/package.json +0 -0
  464. /package/framework/{v0.6.1 → v0.6.2}/lib/domain/src/main.js +0 -0
  465. /package/framework/{v0.6.1 → v0.6.2}/lib/dto/package.json +0 -0
  466. /package/framework/{v0.6.1 → v0.6.2}/lib/dto/src/main.js +0 -0
  467. /package/framework/{v0.6.1 → v0.6.2}/lib/dto-pipe/package.json +0 -0
  468. /package/framework/{v0.6.1 → v0.6.2}/lib/dto-pipe/src/main.js +0 -0
  469. /package/framework/{v0.6.1 → v0.6.2}/lib/dto-types/package.json +0 -0
  470. /package/framework/{v0.6.1 → v0.6.2}/lib/dto-types/src/main.js +0 -0
  471. /package/framework/{v0.6.1 → v0.6.2}/lib/generator/index.js +0 -0
  472. /package/framework/{v0.6.1 → v0.6.2}/lib/i18n/package.json +0 -0
  473. /package/framework/{v0.6.1 → v0.6.2}/lib/i18n/src/main.js +0 -0
  474. /package/framework/{v0.6.1 → v0.6.2}/lib/image-build/package.json +0 -0
  475. /package/framework/{v0.6.1 → v0.6.2}/lib/image-build/src/main.js +0 -0
  476. /package/framework/{v0.6.1 → v0.6.2}/lib/index.js +0 -0
  477. /package/framework/{v0.6.1 → v0.6.2}/lib/inherits/LICENSE +0 -0
  478. /package/framework/{v0.6.1 → v0.6.2}/lib/inherits/README.md +0 -0
  479. /package/framework/{v0.6.1 → v0.6.2}/lib/inherits/package.json +0 -0
  480. /package/framework/{v0.6.1 → v0.6.2}/lib/inherits/src/main.js +0 -0
  481. /package/framework/{v0.6.1 → v0.6.2}/lib/inspector-events/package.json +0 -0
  482. /package/framework/{v0.6.1 → v0.6.2}/lib/inspector-events/src/main.js +0 -0
  483. /package/framework/{v0.6.1 → v0.6.2}/lib/inspector-redact/package.json +0 -0
  484. /package/framework/{v0.6.1 → v0.6.2}/lib/inspector-redact/src/main.js +0 -0
  485. /package/framework/{v0.6.1 → v0.6.2}/lib/instrument/package.json +0 -0
  486. /package/framework/{v0.6.1 → v0.6.2}/lib/instrument/src/main.js +0 -0
  487. /package/framework/{v0.6.1 → v0.6.2}/lib/job/package.json +0 -0
  488. /package/framework/{v0.6.1 → v0.6.2}/lib/job/src/main.js +0 -0
  489. /package/framework/{v0.6.1 → v0.6.2}/lib/job-store.js +0 -0
  490. /package/framework/{v0.6.1 → v0.6.2}/lib/json-config-header/package.json +0 -0
  491. /package/framework/{v0.6.1 → v0.6.2}/lib/json-config-header/src/main.js +0 -0
  492. /package/framework/{v0.6.1 → v0.6.2}/lib/logger/README.md +0 -0
  493. /package/framework/{v0.6.1 → v0.6.2}/lib/logger/package.json +0 -0
  494. /package/framework/{v0.6.1 → v0.6.2}/lib/logger/src/containers/default/index.js +0 -0
  495. /package/framework/{v0.6.1 → v0.6.2}/lib/logger/src/containers/file/index.js +0 -0
  496. /package/framework/{v0.6.1 → v0.6.2}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  497. /package/framework/{v0.6.1 → v0.6.2}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  498. /package/framework/{v0.6.1 → v0.6.2}/lib/logger/src/containers/mq/index.js +0 -0
  499. /package/framework/{v0.6.1 → v0.6.2}/lib/logger/src/containers/mq/listener.js +0 -0
  500. /package/framework/{v0.6.1 → v0.6.2}/lib/logger/src/containers/mq/speaker.js +0 -0
  501. /package/framework/{v0.6.1 → v0.6.2}/lib/logger/src/helper.js +0 -0
  502. /package/framework/{v0.6.1 → v0.6.2}/lib/logger/src/main.js +0 -0
  503. /package/framework/{v0.6.1 → v0.6.2}/lib/math/index.js +0 -0
  504. /package/framework/{v0.6.1 → v0.6.2}/lib/mcp-dispatch/package.json +0 -0
  505. /package/framework/{v0.6.1 → v0.6.2}/lib/mcp-dispatch/src/main.js +0 -0
  506. /package/framework/{v0.6.1 → v0.6.2}/lib/mcp-http/package.json +0 -0
  507. /package/framework/{v0.6.1 → v0.6.2}/lib/mcp-http/src/main.js +0 -0
  508. /package/framework/{v0.6.1 → v0.6.2}/lib/mcp-server/package.json +0 -0
  509. /package/framework/{v0.6.1 → v0.6.2}/lib/mcp-server/src/main.js +0 -0
  510. /package/framework/{v0.6.1 → v0.6.2}/lib/merge/README.md +0 -0
  511. /package/framework/{v0.6.1 → v0.6.2}/lib/merge/package.json +0 -0
  512. /package/framework/{v0.6.1 → v0.6.2}/lib/merge/src/main.js +0 -0
  513. /package/framework/{v0.6.1 → v0.6.2}/lib/metrics/package.json +0 -0
  514. /package/framework/{v0.6.1 → v0.6.2}/lib/metrics/src/main.js +0 -0
  515. /package/framework/{v0.6.1 → v0.6.2}/lib/model.js +0 -0
  516. /package/framework/{v0.6.1 → v0.6.2}/lib/net-locality/package.json +0 -0
  517. /package/framework/{v0.6.1 → v0.6.2}/lib/net-locality/src/main.js +0 -0
  518. /package/framework/{v0.6.1 → v0.6.2}/lib/nunjucks-filters/README.md +0 -0
  519. /package/framework/{v0.6.1 → v0.6.2}/lib/nunjucks-filters/package.json +0 -0
  520. /package/framework/{v0.6.1 → v0.6.2}/lib/nunjucks-resolver/package.json +0 -0
  521. /package/framework/{v0.6.1 → v0.6.2}/lib/nunjucks-resolver/src/main.js +0 -0
  522. /package/framework/{v0.6.1 → v0.6.2}/lib/release-watch/package.json +0 -0
  523. /package/framework/{v0.6.1 → v0.6.2}/lib/release-watch/src/main.js +0 -0
  524. /package/framework/{v0.6.1 → v0.6.2}/lib/render-cache/package.json +0 -0
  525. /package/framework/{v0.6.1 → v0.6.2}/lib/render-cache/src/main.js +0 -0
  526. /package/framework/{v0.6.1 → v0.6.2}/lib/render-cache-store.js +0 -0
  527. /package/framework/{v0.6.1 → v0.6.2}/lib/routing/README.md +0 -0
  528. /package/framework/{v0.6.1 → v0.6.2}/lib/routing/build.json +0 -0
  529. /package/framework/{v0.6.1 → v0.6.2}/lib/routing/package.json +0 -0
  530. /package/framework/{v0.6.1 → v0.6.2}/lib/routing/src/main.js +0 -0
  531. /package/framework/{v0.6.1 → v0.6.2}/lib/routing/src/radix.js +0 -0
  532. /package/framework/{v0.6.1 → v0.6.2}/lib/routing-introspect/package.json +0 -0
  533. /package/framework/{v0.6.1 → v0.6.2}/lib/routing-introspect/src/main.js +0 -0
  534. /package/framework/{v0.6.1 → v0.6.2}/lib/secrets/package.json +0 -0
  535. /package/framework/{v0.6.1 → v0.6.2}/lib/secrets/src/backends/env.js +0 -0
  536. /package/framework/{v0.6.1 → v0.6.2}/lib/secrets/src/main.js +0 -0
  537. /package/framework/{v0.6.1 → v0.6.2}/lib/session-store.js +0 -0
  538. /package/framework/{v0.6.1 → v0.6.2}/lib/shell.js +0 -0
  539. /package/framework/{v0.6.1 → v0.6.2}/lib/sqlite-driver.js +0 -0
  540. /package/framework/{v0.6.1 → v0.6.2}/lib/state.js +0 -0
  541. /package/framework/{v0.6.1 → v0.6.2}/lib/swig-filters/README.md +0 -0
  542. /package/framework/{v0.6.1 → v0.6.2}/lib/swig-filters/package.json +0 -0
  543. /package/framework/{v0.6.1 → v0.6.2}/lib/swig-resolver/package.json +0 -0
  544. /package/framework/{v0.6.1 → v0.6.2}/lib/swig-resolver/src/main.js +0 -0
  545. /package/framework/{v0.6.1 → v0.6.2}/lib/template-loaders/package.json +0 -0
  546. /package/framework/{v0.6.1 → v0.6.2}/lib/template-loaders/src/loaders/http.js +0 -0
  547. /package/framework/{v0.6.1 → v0.6.2}/lib/template-loaders/src/loaders/memory.js +0 -0
  548. /package/framework/{v0.6.1 → v0.6.2}/lib/template-loaders/src/main.js +0 -0
  549. /package/framework/{v0.6.1 → v0.6.2}/lib/url/README.md +0 -0
  550. /package/framework/{v0.6.1 → v0.6.2}/lib/url/index.js +0 -0
  551. /package/framework/{v0.6.1 → v0.6.2}/lib/url/routing.json +0 -0
  552. /package/framework/{v0.6.1 → v0.6.2}/lib/uuid/package.json +0 -0
  553. /package/framework/{v0.6.1 → v0.6.2}/lib/validator.js +0 -0
  554. /package/framework/{v0.6.1 → v0.6.2}/lib/watcher/package.json +0 -0
  555. /package/framework/{v0.6.1 → v0.6.2}/lib/watcher/src/main.js +0 -0
  556. /package/framework/{v0.6.1 → v0.6.2}/lib/ws-framing/package.json +0 -0
  557. /package/framework/{v0.6.1 → v0.6.2}/lib/ws-framing/src/main.js +0 -0
  558. /package/framework/{v0.6.1 → v0.6.2}/lib/ws-query/package.json +0 -0
  559. /package/framework/{v0.6.1 → v0.6.2}/lib/ws-query/src/main.js +0 -0
  560. /package/framework/{v0.6.1 → v0.6.2}/lib/ws-session/package.json +0 -0
  561. /package/framework/{v0.6.1 → v0.6.2}/lib/ws-session/src/main.js +0 -0
@@ -94,7 +94,18 @@ function SwigFilters(conf) {
94
94
 
95
95
  var getInstance = function() {
96
96
  if (conf) {
97
- self.options = SwigFilters.instance._options = JSON.clone(conf);
97
+ // #P39 — stash by REFERENCE. The former per-call deep copy of the
98
+ // whole wrapper (whose `.options` is the render's `local.options`,
99
+ // itself already private per request — #M1) doubled the single
100
+ // heaviest clone in the render profile for zero isolation gain:
101
+ // `_options` is never written outside this assignment (the merge in
102
+ // getUrl/getWebroot fills a fresh `{}` target and only READS this),
103
+ // and `req`/`res` always passed by reference anyway (the cloner
104
+ // bails on non-plain constructors). `self.options` is kept in the
105
+ // chain for the boot-branch shape parity, but note `self` here is a
106
+ // throwaway per-call object — `SwigFilters.instance` is what every
107
+ // consumer reads.
108
+ self.options = SwigFilters.instance._options = conf;
98
109
  }
99
110
 
100
111
  return SwigFilters.instance
@@ -25,7 +25,7 @@
25
25
 
26
26
  var _alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
27
27
  var _mask = 63; // smallest (2^n - 1) >= 62 — rejects 62,63 (~3% waste, no bias)
28
- var _step = 7; // ceil(1.6 * 63 * 4 / 62) — enough random bytes per iteration
28
+ var _step = 7; // ceil(1.6 * 63 * 4 / 62) — random bytes per iteration for the DEFAULT size 4 (#P39: larger sizes compute their own)
29
29
 
30
30
  /**
31
31
  * Generate a cryptographically secure random ID.
@@ -35,10 +35,19 @@ var _step = 7; // ceil(1.6 * 63 * 4 / 62) — enough random bytes per iteratio
35
35
  */
36
36
  function uuid(size) {
37
37
  size = size || 4;
38
+ // #P39 — size the random-byte batch to the REQUESTED length, the same
39
+ // formula customAlphabet() below already uses for its default size. The
40
+ // fixed 7-byte batch was sized for the 4-char default, so uuid(16) — the
41
+ // form lib/collection mints per item — needed ~3 webcrypto calls per id;
42
+ // one right-sized call replaces them. Each getRandomValues call pays a
43
+ // full randomFillSync regardless of byte count, so the cost is the call
44
+ // count, not the bytes. Output distribution is untouched: the bitmask
45
+ // rejection below is applied per byte exactly as before.
46
+ var step = (size <= 4) ? _step : Math.ceil(1.6 * (_mask + 1) * size / _alphabet.length);
38
47
  var id = '';
39
48
  while (true) {
40
- var bytes = crypto.getRandomValues(new Uint8Array(_step));
41
- for (var j = 0; j < _step; j++) {
49
+ var bytes = crypto.getRandomValues(new Uint8Array(step));
50
+ for (var j = 0; j < step; j++) {
42
51
  var idx = bytes[j] & _mask;
43
52
  if (idx < 62) {
44
53
  id += _alphabet[idx];
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gina-framework",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "dependencies": {
5
5
  "@rhinostone/busboy": "^1.6.1",
6
6
  "@rhinostone/swig": "^2.7.2",
package/gna.js CHANGED
@@ -15,14 +15,14 @@
15
15
  'use strict';
16
16
 
17
17
  // Framework core — the main gna module (lifecycle hooks, lib, etc.)
18
- var _gna = require('./framework/v0.6.1/core/gna');
18
+ var _gna = require('./framework/v0.6.2/core/gna');
19
19
 
20
20
  // SuperController and EntitySuper — loaded from their source modules
21
- var SuperController = require('./framework/v0.6.1/core/controller');
22
- var EntitySuper = require('./framework/v0.6.1/core/model/entity');
21
+ var SuperController = require('./framework/v0.6.2/core/controller');
22
+ var EntitySuper = require('./framework/v0.6.2/core/model/entity');
23
23
 
24
24
  // uuid — from the lib registry
25
- var uuid = require('./framework/v0.6.1/lib/uuid');
25
+ var uuid = require('./framework/v0.6.2/lib/uuid');
26
26
 
27
27
  module.exports = {
28
28
 
package/llms.txt CHANGED
@@ -816,7 +816,7 @@ Dev-mode query instrumentation captures every database query tied to the current
816
816
  - **Two-guard `@<project>` requirement asymmetry in `lib/cmd/helper.js`** — a `project:*` command that should run without `@<project>` must be exempted in BOTH guards: the early task-shape guard (`!/^project\:(list|help|status)/`) AND the later projectName-resolution guard (`!/\:list$/.test(cmd.task)` → widened to also allow `^project:status$`). Exempting only the first leaves the second falling through to cwd-project-inference and a "No project name found" error before the handler runs. `project:list` is the working precedent that null `projectName` survives `loadAssets()`.
817
817
  - **Single-bundle CLI handlers read `cmd.name` / `self.name`, NOT `self.bundle`** — CmdHelper sets `cmd.name = cmd.bundles[0]` only when exactly one bundle positional is present (`lib/cmd/helper.js`, the `cmd.bundles.length == 1` branch); `cmd.bundles` is the array for bulk operations. There is no `self.bundle` property. Precedent: `bundle:stop` / `bundle:start` / `bundle:status` all read `self.name`. (Worked example: a sub-agent investigation reported the slot as `self.bundle`; a single read of `helper.js` refuted it before the handler shipped — verify agent-relayed property names against source.)
818
818
  - **`gina start` does not need sudo with a user-prefix install** — `npm install -g --prefix ~/.npm-global` (standard Gina setup) runs as the current user and doesn't touch `/var/run/`. The "Needs to be launched as [sudo]" comment in `lib/cmd/framework/start.js` only applies to system-wide installs.
819
- - **`gina start` exits with code 1 even on success** — the startup script detaches the daemon; the shell child exits 1 as part of detachment. Always use `gina status` to confirm rather than the exit code. Sibling: a `gina start` framework server left running can hang the full test suite AND bundle boot via stale `~/.gina/procs.json` forcing the server onto a non-canonical port (see `cli-handlers.md § 11`).
819
+ - **`gina start` exits with code 1 even on success** — the startup script detaches the daemon; the shell child exits 1 as part of detachment. Always use `gina status` to confirm rather than the exit code. Sibling: a `gina start` framework server left running can hang the full test suite AND bundle boot — the hang is the MQ log-listener connect left pending forever against a degraded daemon; a daemon on a non-canonical port traces to a corrupted persisted `port` in `~/.gina/<shortVersion>/settings.json`, not to `~/.gina/procs.json`, which no boot path reads (its only consumers are `gina stop`'s kill targeting and an address-in-use diagnostic). #B180 (fixed): `removeRunningProc()` deleted the registry entry under the constructing bundle's key instead of the key matched by pid, so dead `gina-*` records were rewritten back instead of removed (and a live record could be destroyed when the keys differed) — a `procs.json` written by an older framework may still carry stale dead entries; with the daemon stopped, clearing the file once is safe.
820
820
  - **CLI reserved flags — `--port` and `--version` must be renamed in subcommands** — both consumed by the framework's global CLI parser (`utils/helper.js::filterArgs` + `bin/cli:301`) before the subcommand sees argv. Use domain-prefixed forms: `--connector-port=`, `--driver-version=`. Un-prefixed forms are silently swallowed.
821
821
  - **CLI scope grammar — positional-absence, not flags** — for commands that apply to either a single bundle or the whole project, use `[<bundle>] @<project>` and signal project-wide by omitting `<bundle>`. Never reintroduce `--scope=bundle` (`scope` is reserved for data isolation: local/beta/production/testing) or `--shared`.
822
822
  - **`connector:rm` never runs `npm uninstall`** — a driver removed from one bundle's `connectors.json` may still be needed by another bundle in the same project (npm resolves `node_modules/<driver>/` once per project). Handler prints a driver-retention hint naming siblings (shared + other bundles) that still reference the same driver; sqlite exempt. Project-level `connector:rm` consults a usage guard — pass `--force` to bypass.
@@ -959,7 +959,7 @@ Dev-mode query instrumentation captures every database query tied to the current
959
959
 
960
960
  259. **Server-side error responses strip stack traces outside local scope — the engine-level throwError sanitizes centrally; the full stack goes to the server log (2026-07-20, rides the next cut).** Two throwError implementations exist: the controller-side one (scope-gated since 0.5.x — it strips the `stack` FIELD outside local scope) and the SERVER-side engine-attached one, whose feeders (router action/middleware catches, server internals) flatten `err.stack` INTO the message string — so non-local 500 bodies used to carry absolute framework paths + stack frames in the JSON `error` field, the inline HTML error fallback, and custom-error page data. The server-side throwError now detects a stack-bearing message (`/\n\s+at\s/`, the V8 frame format) outside local scope, logs the FULL text server-side, and ships only the message line; an object msg has `.stack` logged then stripped off a clone (the caller's object is untouched). Local scope is byte-identical — the dev toolbar reads the stack off the wire. The gate reads the same NODE_SCOPE_IS_LOCAL env var as the controller-side gate (set once at bootstrap), deliberately NOT the config-derived per-bundle scope flag: that flag derives from the project's DEFAULT scope and can lag a boot started with an explicit NODE_SCOPE/--scope. Siblings fixed with it: the JSON render delegate's HTTP/1.1 reason-phrase catch ships `err.message` (a multi-line reason phrase is invalid on the HTTP/1.1 status line — Node rejects the write), and the cached-file stream error path ships message-only. Consumers who relied on wire stacks for service-to-service debugging keep them on LOCAL scope only; everywhere else the server log carries the diagnostic.
961
961
 
962
- 260. **A bundle with a missing or unreadable config/routing.json REFUSES to boot (matching the malformed-JSON path), and the route-lookup not-found error names the bundle + its rule count (2026-07-20, rides the next cut).** Bundle config hydration is readdir-driven: a routing.json absent at boot readdir time was never iterated, so the bundle silently booted with only the framework-synthetic routes (bundle-status, custom-error-page, webroot + the upload endpoints) — every app route 404'd and a sibling bundle's cross-bundle route lookup threw hours later with a message indistinguishable from a mistyped rule; there is no prod re-hydration. The config loader now tracks whether the config-file loop resolved a REAL routing config (bundle dir or shared-config complement; env-versioned `routing.<env>.json` variants ride their base file's iteration, so an env-only file still refuses — it never loaded anyway) and otherwise fails the boot with an error naming the bundle + environment; an EXTERNAL supervisor restart (an orchestrator liveness/restart, a container restart policy such as restart=always, an init system) then retries until the release tree settles, so a mid-deploy race self-heals — gina's own daemon does NOT retry a startup crash: it reports `crashed during startup` once and stops, so a bare `gina bundle:start` deployment is fail-stop until a manual restart. BEHAVIOR CHANGE: a deployment that relied on the silent half-boot must fix its release artifact. The `RoutingHelper::getRouting` not-found throw keeps its historical prefix and appends `(bundle <name> holds N rules)`, so a degraded or near-empty table is tellable from a plain mistyped rule — browser bundle included (dist rebuilt).
962
+ 260. **A bundle with a missing or unreadable config/routing.json REFUSES to boot (matching the malformed-JSON path), and the route-lookup not-found error names the bundle + its rule count (2026-07-20, rides the next cut).** Bundle config hydration is readdir-driven: a routing.json absent at boot readdir time was never iterated, so the bundle silently booted with only the framework-synthetic routes (bundle-status, custom-error-page, webroot + the upload endpoints) — every app route 404'd and a sibling bundle's cross-bundle route lookup threw hours later with a message indistinguishable from a mistyped rule; there is no prod re-hydration. The config loader now tracks whether the config-file loop resolved a REAL routing config (bundle dir or shared-config complement; env-versioned `routing.<env>.json` variants ride their base file's iteration, so an env-only file still refuses — it never loaded anyway) and otherwise fails the boot with an error naming the bundle + environment; an EXTERNAL supervisor restart (an orchestrator liveness/restart, a container restart policy such as restart=always, an init system) then retries until the release tree settles, so a mid-deploy race self-heals — gina's own daemon does NOT retry a startup crash: it reports `crashed during startup` once and stops, so a bare `gina bundle:start` deployment is fail-stop until a manual restart. BEHAVIOR CHANGE: a deployment that relied on the silent half-boot must fix its release artifact. The `RoutingHelper::getRouting` not-found throw keeps its historical prefix and appends `(bundle <name> holds N rules)`, so a degraded or near-empty table is tellable from a plain mistyped rule — browser bundle included (dist rebuilt). **SIBLING REFUSAL — the project `env.json` block (#B181(b), 2026-07-31, unreleased).** The same function refuses one step earlier when `envConf[bundle][env]` is absent: the bundle list is built inside the env.json template-merge loop, so an env.json that is ABSENT (`userConf` stays `false`), empty, or that declares only bundles the manifest does not list yields an EMPTY list — `bundles[b]` is then undefined, `bundle` falls back to `startingApp`, and `setServerCoreConf` dereferenced a block that was never populated, dying as an uncaughtException (`Cannot read properties of undefined (reading '<env>')`, exit 143) that named neither env.json nor the bundle. It now refuses through the same `callback(new Error())` path (exit 1), naming the bundle, the env, the resolved env.json path, and whether the file was found at all — so a MISSING file and a present-but-incomplete one give different remedies; `setServerCoreConf` also throws a named error for any direct caller. Measured on fresh isolated scenes: the scaffolded-env.json baseline still boots and serves, and all three degenerate shapes refuse cleanly — the predicate can only fire where the boot ALREADY crashed, so it cannot refuse a working configuration. **SIBLING — the missing `host` default (#B181(a), 2026-07-31, unreleased).** `host` was the ONLY key the per-bundle configuration reads that carried no framework-side default — absent from both the env and settings templates, and written solely by the CLI into the project's own env.json — so a hand-written or PARTIAL block (one setting, say, only `server.cache`) left it undefined. Unknown `${...}` tokens are preserved verbatim and silently by design, so the `server.credentials` paths rendered as `.../certificates/scopes/<scope>/${host}/private.key`, the https/HTTP-2 read ENOENT'd, and the boot exited pointing at the server settings rather than at the missing key. The env template now carries the same `localhost` default the CLI already writes, so the existing deep-fill merge supplies it; an omitted declaration is warned (naming bundle + env) instead of defaulting silently, and a project that declares `host` is untouched because the merges are target-wins. NOTE the merge was EXONERATED as the cause: every env.json merge is override-off, i.e. a deep target-wins FILL — the shallow `override=true` wholesale-replace exists only on the dev-mode `env.local.json` path, a different surface. **SIBLING — the declared-but-not-for-this-env shape (#B183, 2026-08-01, unreleased).** `newContent[app][env].bundlesPath` was assigned one line BEFORE the `typeof(content[app][env])` guard that exists to protect exactly that dereference; since `newContent` is a deep clone of `content`, that property is undefined for precisely the apps the guard rejects. Booting an env a declared bundle carries no block for therefore threw `Cannot set properties of undefined (setting 'bundlesPath')` at exit 143, ~750 lines before (b)'s refusal could fire — (b)'s coverage of this fourth shape was replica-only and never live-verified, which is why it read as covered. The assignment now sits INSIDE the guard: the STARTING bundle reaches (b)'s named refusal (exit 1, naming bundle + env + env.json path), and a NON-starting bundle skipped for the booting env is WARNED (naming bundle + env) rather than vanishing from the boot silently — the guard's else branch was previously empty, so a skipped sibling left no trace. Live A/B in both directions on fresh isolated scenes (control boots; mutated scene died at `config.js:786` before, refuses cleanly after). **And a DELETED env.json does not stay deleted:** the CLI recreates it as `{}` on the next command of any kind, and `{}` is precisely the (b) shape — so the historical "the crash persists across rebuilds" reading was that resurrection, NOT a stale env bake in the release tree; `bundle:build` writes no env config there at all (measured).
963
963
 
964
964
  261. **FormValidator autocomplete interception + live-check stale-error clear (#B134/#B135/#B136).** The Safari-autocomplete keydown interception (fields with autocomplete="off" on a live-check form: preventDefault + programmatic value rebuild behind a transient readonly) now (a) bails on modifier chords — e.metaKey/e.ctrlKey returns BEFORE preventDefault so the native select-all/copy/paste/cut/undo defaults run; pre-fix Cmd+A typed the chord letter into the field and keyboard paste was dead (execCommand("paste") is inert in unprivileged web content; the whole chord-case block is commented out, incl. the undo case that wiped input back to defaultValue) — and (b) gates on REAL Safari only (/safari/i && !/chrom(e|ium)/i): every Chromium UA carries the Safari/537.36 token, so the workaround ran on Chrome/Edge/Brave where it was never intended; WebKit-on-iOS browsers (CriOS/FxiOS) stay matched by design. And (c) the live-check whole-form pass, when it turns VALID, now clears every previously-errored field' rendered error in BOTH copies (the input/checkbox/radio processEvent pass and updateSelect') instead of leaving a stale blocking-error paragraph beside the re-enabled submit trigger — the old clear branch was gated on the stored errors map being ALREADY empty and cleared only the touched field; the pass still never renders NEW errors on untouched fields. All three are browser-bundled (dist rebuilt). Tests: validator-autocomplete-interception.test.js + validator-livecheck-stale-error-clear.test.js — extracted-real-bytes execution (brace-walked handler + branch blocks, a real-UA matrix) with red-first dist pins (Closure De-Morgans the chord bail and folds the clear loop into a brace-less for-in, so minified pins target property-name shapes, never var names).
965
965
 
@@ -996,7 +996,7 @@ Dev-mode query instrumentation captures every database query tied to the current
996
996
 
997
997
  278. **A cache key is opaque DATA — never route it through an expression/condition evaluator.** An output-cache key embeds the request URL, so a querystring's `?`/`=` parse as OPERATOR tokens in any condition-DSL lookup — the render cache's event registry originally lived in a collection whose dedup ran keys through the condition evaluator, and the SECOND cache-miss render of any cached GET route with `invalidateOnEvents` + a querystring THREW (in the swig path that rejection unwound to the function-level try, whose catch answered 500 — discarding an already-rendered page). The registry became a plain array matched with `===`. Generalizes beyond caching: never let a value carrying user-controlled characters reach a query/condition DSL as an expression — match registry rows with `===` on plain structures, and treat every composite key as an opaque string.
998
998
 
999
- 279. **Transient-vs-permanent connector-error classification (#CE1, `26d803bd`+`d9231eff`, 0.5.25).** `lib/connector-error` (`classify(err) → {isTransient, reason}` + in-place `stamp(err)`) stamps `err.isTransient` (boolean; explicit `false` = classified-permanent, not merely absent) + `err.transientReason` (normalized token, `null` when permanent) on every datastore query error reaching the controller, so an app renders an honest retryable response by branching on the CONDITION instead of string-matching vendor text. Wired at 2 error sites per connector (Promise reject + direct-callback) across couchbase/mongodb/mysql/postgresql/scylladb/sqlite; `stamp()` RETURNS err so the call FOLDS into the terminal (`_reject(lib.connectorError.stamp(err))`) — the two-line form pushes `_queryEntry.resultSize` past inspector.test.js's fixed-width QI `substring(idx,idx+1800/900)` windows (thin post-fix margins 12/22 — RE-MEASURE on any connector error-branch edit; same fragility class as the #B152 260-char window). Taxonomy, first-match-wins IN ORDER: socket errno (ECONNREFUSED/ECONNRESET/ETIMEDOUT/EPIPE/EHOSTUNREACH/ENETUNREACH/ENETDOWN/EAI_AGAIN transient; **ENOTFOUND EXCLUDED** = DNS misconfig, not a blip) → mysql/sqlite string codes → **node:sqlite NUMERIC `errcode` primary byte** (MEASURED: a busy error is `code:'ERR_SQLITE_ERROR'`+`errcode:5`, NEVER `code:'SQLITE_BUSY'`; `errcode & 0xff` → 5 busy / 6 locked, so extended 261 SQLITE_BUSY_RECOVERY→5; dup-key 1555→19 stays permanent) → pg SQLSTATE (exact set + whole `08` connection class, 5-char-gated) → driver class NAMES (cassandra `NoHostAvailableError`/`OperationTimedOutError`, couchbase `*TimeoutError`/`RequestCanceledError`/`ServiceNotAvailableError`, mongo `MongoNetworkError`/`*SelectionError`) → mongo error LABELS (`TransientTransactionError`/`RetryableWriteError`) → mongo numeric codes (**7 HostNotFound EXCLUDED** = server-side ENOTFOUND; 6 HostUnreachable kept) → couchbase N1QL `cause.first_error_code` 1080 + 12008 bulk-get-retry-exhaustion + `cause.retry===true` (**12009 generic-DML EXCLUDED** = also covers dup-key; the SDK buckets every un-cased 12xxx — permanent 12003 included — into one IndexFailureError grab-bag, so the cause CODE is the signal and that class name must never join the name table; the #B153 envelope-forward reaches classify as a synthesized name-`Error` wrapper WHENEVER THE ENVELOPE CARRIES TEXT, making the code table the SOLE classifier on that path — the 1080 entry is live there, dead only on the raw-SDK shape where the typed timeout name fires first). **#B153 RESIDUAL (fixed 0.5.26)** — the synthesize branch was gated on `typeof(cause.first_error_message) != 'undefined'`, but the node binding marshals `first_error_code`/`first_error_message` onto EVERY query error (the C++ `query_error_context` value-initializes them), so a CLIENT-side SDK timeout — `cause` present, code `0`, message `''` — took the synthesize branch and became `new Error('')`, destroying the typed `Un/AmbiguousTimeoutError` name `classify` matches on, and a retryable timeout was stamped PERMANENT with message `''`. Guard gains `&& cause.first_error_message !== ''` at all three couchbase N1QL `onError` sites, so an empty envelope raw-forwards instead: raw-forwarding is classification-LOSSLESS (the raw error keeps `.cause`, so even a pathological empty-message SERVER envelope still classifies off the code table — the synthesize branch only ever existed to surface envelope text). Named residual: a NON-Error rejection carrying an empty message still loses `.cause` on the `new Error(String(err))` wrap — no known producer (the SDK rejects with typed Errors, and the empty-message case IS the typed timeout). Server-side — NO dist rebuild; restart to pick up. Tests: `couchbase-connector.test.js §08` (14 — source pins on the new clause + client-timeout end-to-end replicas asserting the typed name survives and `classify().isTransient === true`, plus a pre-residual subtract control reproducing the false negative). `classify` is TOTAL — never throws (invoked on the error path; hostile shapes → permanent); `stamp` is frozen-safe. Registered PLAIN `require` (gen-0-captured by the load-once connectors + invoked per-request → a `_require` copy would be a #B32-residual leak candidate). Couchbase is classifiable ONLY because #B153 (`3ac5ea4a`) forwards the RAW driver error its old `.catch` used to discard (and used to HANG on when there was no `cause`). Declared on `GinaLib` in `types/index.d.ts` (the types-runtime-parity two-way gate). Deferred: slice 2 (opt-in 503 + `Retry-After`), slice 3 (opt-in single auto-retry keyed on the entity OPERATION, not the serving request's HTTP verb — a GET can issue mutating queries). Server-side — NO dist rebuild; restart to pick up. Tests: `test/core/couchbase-connector.test.js §08` (#B153) + `test/lib/connector-error.test.js` (71).
999
+ 279. **Transient-vs-permanent connector-error classification (#CE1, `26d803bd`+`d9231eff`, 0.5.25).** `lib/connector-error` (`classify(err) → {isTransient, reason}` + in-place `stamp(err)`) stamps `err.isTransient` (boolean; explicit `false` = classified-permanent, not merely absent) + `err.transientReason` (normalized token, `null` when permanent) on every datastore query error reaching the controller, so an app renders an honest retryable response by branching on the CONDITION instead of string-matching vendor text. Wired at 2 error sites per connector (Promise reject + direct-callback) across couchbase/mongodb/mysql/postgresql/scylladb/sqlite; `stamp()` RETURNS err so the call FOLDS into the terminal (`_reject(lib.connectorError.stamp(err))`) — the two-line form pushes `_queryEntry.resultSize` past inspector.test.js's fixed-width QI `substring(idx,idx+1800/900)` windows (thin post-fix margins 12/22 — RE-MEASURE on any connector error-branch edit; same fragility class as the #B152 260-char window). Taxonomy, first-match-wins IN ORDER: socket errno (ECONNREFUSED/ECONNRESET/ETIMEDOUT/EPIPE/EHOSTUNREACH/ENETUNREACH/ENETDOWN/EAI_AGAIN transient; **ENOTFOUND EXCLUDED** = DNS misconfig, not a blip) → mysql/sqlite string codes → **node:sqlite NUMERIC `errcode` primary byte** (MEASURED: a busy error is `code:'ERR_SQLITE_ERROR'`+`errcode:5`, NEVER `code:'SQLITE_BUSY'`; `errcode & 0xff` → 5 busy / 6 locked, so extended 261 SQLITE_BUSY_RECOVERY→5; dup-key 1555→19 stays permanent) → pg SQLSTATE (exact set + whole `08` connection class, 5-char-gated) → driver class NAMES (cassandra `NoHostAvailableError`/`OperationTimedOutError`, couchbase `*TimeoutError`/`RequestCanceledError`/`ServiceNotAvailableError`, mongo `MongoNetworkError`/`*SelectionError`) → mongo error LABELS (`TransientTransactionError`/`RetryableWriteError`) → mongo numeric codes (**7 HostNotFound EXCLUDED** = server-side ENOTFOUND; 6 HostUnreachable kept) → couchbase N1QL `cause.first_error_code` 1080 + 12008 bulk-get-retry-exhaustion + `cause.retry===true` (**12009 generic-DML EXCLUDED** = also covers dup-key; the SDK buckets every un-cased 12xxx — permanent 12003 included — into one IndexFailureError grab-bag, so the cause CODE is the signal and that class name must never join the name table; the #B153 envelope-forward reaches classify as a synthesized name-`Error` wrapper WHENEVER THE ENVELOPE CARRIES TEXT, making the code table the SOLE classifier on that path — the 1080 entry is live there, dead only on the raw-SDK shape where the typed timeout name fires first). **#B153 RESIDUAL (fixed 0.5.26)** — the synthesize branch was gated on `typeof(cause.first_error_message) != 'undefined'`, but the node binding marshals `first_error_code`/`first_error_message` onto EVERY query error (the C++ `query_error_context` value-initializes them), so a CLIENT-side SDK timeout — `cause` present, code `0`, message `''` — took the synthesize branch and became `new Error('')`, destroying the typed `Un/AmbiguousTimeoutError` name `classify` matches on, and a retryable timeout was stamped PERMANENT with message `''`. Guard gains `&& cause.first_error_message !== ''` at all three couchbase N1QL `onError` sites, so an empty envelope raw-forwards instead: raw-forwarding is classification-LOSSLESS (the raw error keeps `.cause`, so even a pathological empty-message SERVER envelope still classifies off the code table — the synthesize branch only ever existed to surface envelope text). Named residual: a NON-Error rejection carrying an empty message still loses `.cause` on the `new Error(String(err))` wrap — no known producer (the SDK rejects with typed Errors, and the empty-message case IS the typed timeout). Server-side — NO dist rebuild; restart to pick up. Tests: `couchbase-connector.test.js §08` (14 — source pins on the new clause + client-timeout end-to-end replicas asserting the typed name survives and `classify().isTransient === true`, plus a pre-residual subtract control reproducing the false negative). `classify` is TOTAL — never throws (invoked on the error path; hostile shapes → permanent); `stamp` is frozen-safe. Registered PLAIN `require` (gen-0-captured by the load-once connectors + invoked per-request → a `_require` copy would be a #B32-residual leak candidate). Couchbase is classifiable ONLY because #B153 (`3ac5ea4a`) forwards the RAW driver error its old `.catch` used to discard (and used to HANG on when there was no `cause`). Declared on `GinaLib` in `types/index.d.ts` (the types-runtime-parity two-way gate). **Slice 2 SHIPPED (0.6.2+): opt-in 503 + `Retry-After`.** Per-bundle `server.transientErrors` block — `enabled` (strict boolean true, default false), `retryAfter` (integer seconds 1..86400, default 30), `message` (non-empty string, default = the standard 503 status text). With the opt-in ON, a stamped-transient error resolving to 500 through controller `throwError` renders 503 + `Retry-After: <retryAfter>` (one early guarded `setHeader` rides every egress: the JSON writeHead trio, the HTML fallback page, and the renderCustomError → render pipeline, which forwards `res.getHeaders()` into the HTTP/2 frame), with the user-facing `error` field swapped to `message`; `message`/`stack` body fields keep their existing scope semantics and the incident-ref pairing line keeps full pre-strip detail server-side. Explicit non-500 statuses and permanent errors never upgrade; upgrade applies at BOTH throwError status-resolution sites (the Error/1-arg path and the 2-arg errorObj path). Boot-time shape check warns per malformed key and NEVER refuses boot (a rendering nicety must not gate a boot); the controller-side reader independently normalizes to the same defaults, total (hostile getters → defaults). Deliberately NOT mirrored in the server-side throwError twin — stamped connector errors surface through controller actions only. Wire-verified live on BOTH protocols (isaac engine): h1 503+header, h2 `:status` 503 + `retry-after` (the renderJSON h2-inert-status class does not apply — throwError writes via writeHead; express shares the same engine-agnostic controller path, mechanism-verified only). Deferred: slice 3 (opt-in single auto-retry keyed on the entity OPERATION, not the serving request's HTTP verb — a GET can issue mutating queries). Server-side — NO dist rebuild; restart to pick up. Tests: `test/core/couchbase-connector.test.js §08` (#B153) + `test/lib/connector-error.test.js` (71) + `test/core/transient-errors.test.js` (26: source/order pins both files, real-throwError behaviorals via createTestInstance, extracted-bytes config-normalization matrix, server-twin divergence invariant).
1000
1000
  280. **Framework control-plane bind host + command-name namespace (0.5.26).** The two control-plane listeners — the command socket (default `8124`, `bin/cmd`, which executes a CLI command per connection) and the MQ listener (default `8125`, `lib/logger/src/containers/mq/listener.js`) — bind an explicit host that defaults to loopback. The `bind_host` setting governs it (env `GINA_BIND_HOST`, flag `gina framework:set --bind-host=`, seeded into `~/.gina/<shortVersion>/settings.json` and carried across shortVersion bumps by the `checkIfSettings` migration map); it is deliberately SEPARATE from `host_v4`, which is the address clients CONNECT to — reusing one key for both would make a workstation whose `host_v4` points at another machine fail to bind its own daemon (EADDRNOTAVAIL). Node binds every interface when `listen()` gets no host argument, and the MQ listener reads `opt.hostV4` specifically, so a caller passing a `host` key leaves it undefined and binds everything — both now default to `127.0.0.1` at the listener itself as well as at the resolution site. Exposing the control plane beyond the local host is a deliberate opt-in, mirroring a bundle's `--http-host`. Separately, `lib/cmd/framework/init.js` `run()` constrains a caller-supplied `topic:action` pair to `/^[A-Za-z0-9_-]+$/` before it becomes a `require()` path (an out-of-namespace segment resolves to `''`, which never exists, so it takes the same "not a valid command" branch); every shipped command group and action matches, including the synthetic `framework:-V` / `framework:--version` forms. An unresolvable name reaching the daemon over the socket ends that client's connection instead of calling `process.exit(1)`, which would stop the daemon serving every other client — an offline one-shot CLI run still exits non-zero. NOTE most command handlers call `process.exit()` themselves, so only `bundle:start` (the sole command `bin/cli` routes online) is designed to run inside the daemon. ⚠️ 0.5.26 shipped a DIAL-side regression with this: CLI-side clients — the command socket dial (`bin/cli`), the MQ speaker and file log containers, and `gina tail` — dialled `host_v4` while the daemon binds `bind_host`, so a co-located CLI could not reach its own daemon whenever `host_v4` was a non-loopback address of the same machine (the common containerized shape: `bundle:start` aborted before the HTTP server ever bound, and `gina tail` printed `[MQTail] ECONNREFUSED <host_v4>:8125`). Fixed post-0.5.26: all four dial sites resolve through `lib/net-locality` — `resolveDialHost(hostV4, bindHost)` dials the bind address (loopback by default, or `bind_host` when it is a concrete non-wildcard address) whenever `host_v4` names one of the machine's own interfaces per `os.networkInterfaces()`, while hostnames, genuinely remote addresses, and enumeration failures dial unchanged (fail-safe) — and the refused-connection error now names the dial target plus the `bind_host` knob. Also fixed in the same change: a `gina framework:set --bind-host=` write now PERSISTS — `bind_host` was the only connection key without a disk-to-env read-back in the settings regeneration (every CLI invocation rewrote it back to env-or-default), and the container bootstrap (`gina-init`) overwrote it unconditionally; both paths now preserve the persisted value, with `GINA_BIND_HOST` still taking precedence and unresolved `${}` template placeholders skipped.
1001
1001
 
1002
1002
  281. **Production transport posture — `server.requireHttps` / `server.allowInsecure` (#COMPLY9, 0.5.26).** Outside the `local` scope a bundle resolving a cleartext scheme (anything but https — both engines' scheme switches default to the plain server) warns ONCE at boot, naming bundle/scheme/scope and both remediations; `server.requireHttps: true` refuses to boot it instead (the throw lands in init()'s central catch — pre-listen, the cleartext port never binds), and `server.allowInsecure: true` asserts TLS terminates upstream (mesh/ingress/reverse proxy — the documented h2c topology), turning the warn into one info line (same vocabulary as `mcp.json > server > allowInsecure`). Both strict booleans resolved like `scheme` itself (bundle settings win, env.json's `server` block fills via the serverOpt picked-keys merge); a non-boolean-when-present and the both-true contradiction refuse the boot in EVERY scope (the quietly-OFF class). The gate is NOT-local, never is-production — a custom scope (e.g. `beta`) is neither, and a production-keyed gate would silently skip it; `conf.server.scopeIsLocal` derives from def_scope, not the live scope, so it is never consulted. An https:// proxy.json upstream hostname is NAMED in the warn (advisory) but never silences it. Server-side only — no dist rebuild; pickup = restart.
@@ -1030,3 +1030,5 @@ Dev-mode query instrumentation captures every database query tied to the current
1030
1030
  296. **FormValidator submits: one XHR per send + a fail-safe lock release (#B175/#B176, 0.6.1).** `send()` used to reuse ONE module-scope `XMLHttpRequest` (created once at validator init): re-`open()`ing the completed instance synchronously replayed the PREVIOUS submit's still-assigned `onreadystatechange` at readyState 1, re-disabling that form's submit trigger and re-stamping its `data-gina-form-loading` with no release path (the lock was armed at four sites and released only inside readyState 4) — so submitting form B after form A had completed stranded A's trigger natively-disabled until something else happened to re-enable it. Since 0.6.1 every send builds its own LOCAL XHR (per-submit handler/state/lifecycle; the reuse's implicit cross-form abort is gone — each form settles its own request) and registers a `loadend` release — fires on success, error, timeout and abort alike — that removes `disabled`/`aria-disabled` + `data-gina-form-loading` and clears `$form.isSending`/`$form.sent`; `$form.isSending` now genuinely spans send→settled (it used to be cleared at the first readyState transition, i.e. almost immediately — `$form.sent` was the only flag that spanned the request); the timeout path removes `data-gina-form-loading` instead of writing the truthy string `"false"`. Same release, #B176: the live-check opt-out is honored CONSISTENTLY — two validation gates (the select-change handler and the bind-time silent-validation pass) evaluated the rules-count boolean INSIDE `/^(true)$/i.test(…)`, so an explicit `data-gina-form-live-check-enabled="false"` (a truthy string) short-circuited to the count boolean and matched, leaving those two running on a form that had opted out; the gates now test the attribute alone, then check the count. Scope worth knowing before auditing a form's pre-0.6.1 behaviour: the opt-out was NOT ignored outright — the three `registerForLiveChecking` sites (textarea / form-associated custom element / input) already tested the attribute alone, so text as-you-type never ran on an opted-out form, and the submit trigger ended enabled either way because the trigger's show branch is forced whenever live-check is off. The pre-fix behaviour was an inconsistent middle; only bind-time and select-change validation change at pickup. Browser-bundled — consumers re-bake at pickup. Caution that stays by design: `setOptions()` is a MODULE-wide default setter, not per-call — e.g. `setOptions({withRateLimit: false})` turns rate limiting off for every form for the rest of the page lifetime (per-form options are a demand-gated follow-up).
1031
1031
 
1032
1032
  297. **Validator error labels & rendering — observable keys now translatable, announcements separator-joined, identical messages deduped (#B178 family, 0.6.1).** The key an app can OBSERVE in a field's `errors` object was not always the key the label catalog is consulted under: four rule families write the error under a generic key while consulting a SPECIFIC label key — the float coercion's NaN branch renders `errorLabels['toFloatNAN']` into `errors['toFloat']`, and the number/integer/string Length families render the `Min`/`Max` label variants into the generic `is<X>Length` errors key — so translating the observable key (bundle catalog `_validator` node or `setErrorLabels()`) was a silent no-op and a partial catalog rendered one localized message beside one English default. Fixed with an alias fill applied to every app-supplied label layer (server catalog node, client catalog whisper, per-culture registrations, `setErrorLabels()`): a supplied generic fills the specific keys the app did not supply itself; a supplied specific still wins; English defaults are untouched. Same release: numbered `is` aliases (`is1`, `is2`, …) had no per-alias default label, so a failing alias with no rule-supplied text rendered an EMPTY message — they now fall back to the shared `is` label (translate catalog key `is` once to cover every alias); and the user-validator setup loop unconditionally reset every user-defined validator's label to the English default, clobbering catalog translations — it now fills only when the app supplied none. Two render-side fixes ride along: the error container renders one `<p>` per error key and the aria-live announcement passed the container's raw `textContent`, which concatenates with NO separator — a screen reader received multiple messages as one run-on string (visually the messages stack as blocks; only the announcement channel ran them together); announcements now join the per-message texts with a sentence separator. And two rules resolving to byte-identical message text (canonically a coercion paired with its validator, both failing on the same non-numeric input) rendered the same sentence twice — each distinct text now renders once, while the dev inspector still records every error key. Browser-bundled — consumers re-bake at pickup; apps that translated only observable keys will see those messages switch from English to their language.
1033
+
1034
+ 298. **Render/request-path deep-clone & id-mint reduction (#P39 slice 1, 0.6.x) — the filter-factory options travel by REFERENCE, locale lookups are memoized, `conf.locales` is a lazy per-request accessor, and `lib/uuid` right-sizes its entropy batch.** The CPU-profiling baseline convicted per-request copy/id overhead as ~60% of render-arm CPU, 98.7% of the clone time in three caller-attributed paths; all three are gone. (1) `controller.render-swig.js` / `controller.render-nunjucks.js` hand `local.options` to the filter factory UN-cloned, and `lib/swig-filters` / `lib/nunjucks-filters` `getInstance()` stashes that wrapper by reference — the singleton's `_options` has no writer beyond the stash itself (every filter only reads it; the `getUrl`/`getWebroot` merge fills a fresh `{}` target), the request path already shares `conf.routing`/`conf.reverseRouting`/`conf.forms` by reference, and `req`/`res` always passed by reference anyway (the cloner bails on non-plain constructors) — so reference-passing adds no new mutation-visibility class and the stash-then-await interleave window is byte-identical to the cloned era. Anything that MUTATES what it reads from the filter context must clone its own copy first (the pre-existing contract; `getRoute()` already does). (2) `setOptions` no longer builds two Collections per request over the boot-static region sets (each was a deep copy of ~500 nested records plus one 16-char id minted per record ≈ 750 webcrypto calls, paid by EVERY request in a views-bearing bundle, render or not): a module-level per-culture memo answers the language → region-set and country → row lookups; `conf.locale` is a per-request deep copy of the ONE resolved row (isolating the `.date` write and template mutations); `conf.locales` is a LAZY self-replacing accessor — the request's own deep copy materializes on first read (sole framework reader: `self.getLocales()`), so the common request pays nothing while whole-conf clones and serializers materialize it transparently, and assignment writes through. (3) `lib/uuid` sizes its `getRandomValues` batch to the REQUESTED id length (the fixed 7-byte batch was sized for the 4-char default, so `uuid(16)` — the form `lib/collection` mints per item — needed ~3 webcrypto calls; now 1; each call pays a full randomFillSync regardless of byte count, so call count is the cost). (4) The cloner's dead per-recursion `Object.keys` allocation is removed. Measured A/B on the profiling harness (fresh runs both sides, same knobs): render wall 32,186 → 7,268 ms for 3000 requests = 4.4× throughput (10.7 → 2.4 ms/render), deep-clone share 50.31% → 1.81%, GC 2,522 → 137 ms, randomFillSync out of the top-15 frames on both arms, upload-arm clone floor 253 → 11 ms — the pre-stated ≈2× ceiling was beaten because allocation-pressure knock-on (GC, locality) fell with the clones. `lib/uuid` is AMD-bundled, so the browser bundle changed: consumer pickup = restart AND per-bundle re-bake. `Collection`'s own eager per-item `_uuid` minting is UNCHANGED (its only consumers are collection-internal; `toRaw()` strips). Remaining clone sites (hot route-matching-loop clones, `getRoute`-per-`getUrl` filter call, `getParams`/`getConfig` per-call clones, cssColl/jsColl construction, async-delegate store clones) stay measure-gated for a future profile.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gina",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "description": "MVC framework for Node.js and Bun with built-in HTTP/2, multi-bundle architecture, and scope-based data isolation — no Express dependency",
5
5
  "keywords": [
6
6
  "nodejs",
@@ -76,12 +76,12 @@
76
76
  "gina-container": "bin/gina-container",
77
77
  "gina-init": "bin/gina-init"
78
78
  },
79
- "main": "./framework/v0.6.1/core/gna",
79
+ "main": "./framework/v0.6.2/core/gna",
80
80
  "exports": {
81
81
  ".": {
82
82
  "types": "./types/index.d.ts",
83
83
  "import": "./index.mjs",
84
- "require": "./framework/v0.6.1/core/gna.js"
84
+ "require": "./framework/v0.6.2/core/gna.js"
85
85
  },
86
86
  "./gna": {
87
87
  "types": "./types/gna.d.ts",
@@ -215,6 +215,28 @@
215
215
  "type": "boolean",
216
216
  "description": "When true, the HTTP/2 server also accepts HTTP/1.1 connections (ALPN negotiation). Defaults to true."
217
217
  },
218
+ "transientErrors": {
219
+ "type": "object",
220
+ "description": "Opt-in rendering of transient datastore failures as 503 + Retry-After. When enabled, a connector error stamped isTransient that would render as HTTP 500 through throwError renders as 503 with a Retry-After header and a clean user-facing error message instead. Explicit non-500 statuses and permanent errors are never upgraded. A malformed block warns at boot and leaves the feature off — it never refuses a boot.",
221
+ "properties": {
222
+ "enabled": {
223
+ "type": "boolean",
224
+ "description": "Master switch. Must be strictly boolean true to turn the upgrade on — any other type or value leaves it off. Defaults to false."
225
+ },
226
+ "retryAfter": {
227
+ "type": "integer",
228
+ "description": "Delta-seconds value emitted as the Retry-After header on upgraded 503 responses. Integer between 1 and 86400; out-of-range or non-integer values are ignored with a boot warning. Defaults to 30.",
229
+ "minimum": 1,
230
+ "maximum": 86400
231
+ },
232
+ "message": {
233
+ "type": "string",
234
+ "description": "User-facing text placed in the error field of upgraded 503 responses. Non-empty string; empty or non-string values are ignored with a boot warning. Defaults to the standard 503 status text (Service Unavailable).",
235
+ "minLength": 1
236
+ }
237
+ },
238
+ "additionalProperties": false
239
+ },
218
240
  "warmup": {
219
241
  "type": "array",
220
242
  "description": "List of upstream URLs to pre-establish HTTP/2 sessions at bundle startup. Reduces latency on the first real request.",
@@ -0,0 +1,187 @@
1
+ 'use strict';
2
+ /**
3
+ * analyze-cpuprofile.js — self-time aggregation of a V8 `.cpuprofile` by
4
+ * acceleration-candidate bucket (#P34, the native-acceleration arc's gate).
5
+ *
6
+ * Reads one or more `.cpuprofile` files (as written by `node --cpu-prof`) and
7
+ * reports, per file: total sampled time, self-time per candidate bucket
8
+ * (multipart scan, ws-framing codec, getAssets, render delegates, swig engine,
9
+ * logger, router/server/controller layers, GC, node internals, idle), and the
10
+ * top individual frames by self-time. This is the conviction surface for
11
+ * #P35-#P38: a candidate whose bucket stays flat under its own arm's load is
12
+ * acquitted.
13
+ *
14
+ * Attribution model: `selfTime[node] = sum(timeDeltas[i] where samples[i] is
15
+ * that node)` — the standard sampling approximation (each inter-sample delta
16
+ * is attributed to the sample that ends it; negative deltas are clamped to 0).
17
+ * A whole-process profile includes boot: module compile/require frames land in
18
+ * their own visible buckets, so request-path buckets stay attributable.
19
+ *
20
+ * Usage:
21
+ * node script/perf/analyze-cpuprofile.js <file.cpuprofile> [...more]
22
+ * node script/perf/analyze-cpuprofile.js --json <file.cpuprofile>
23
+ *
24
+ * Standalone by design — no framework globals, require()-able by the
25
+ * profile-baseline orchestrator (module.exports.analyze).
26
+ */
27
+
28
+ var fs = require('fs');
29
+ var path = require('path');
30
+
31
+ /**
32
+ * Candidate buckets, first-match ordering. Frame-name tests (GC/program/idle)
33
+ * come before URL tests because those frames carry empty urls; specific
34
+ * framework surfaces come before the generic framework catch-all.
35
+ *
36
+ * @constant {Array<{key: string, test: function}>}
37
+ */
38
+ var BUCKETS = [
39
+ { key: 'GC', test: function (fn, url) { return fn === '(garbage collector)'; } },
40
+ { key: 'idle', test: function (fn, url) { return fn === '(idle)'; } },
41
+ { key: 'program (V8/native)', test: function (fn, url) { return fn === '(program)'; } },
42
+ { key: 'multipart scan (streamsearch/busboy)', test: function (fn, url) { return /streamsearch|@rhinostone\/busboy/.test(url); } },
43
+ { key: 'ws codec (lib/ws-framing)', test: function (fn, url) { return /lib\/ws-framing/.test(url); } },
44
+ { key: 'ws session (lib/ws-session)', test: function (fn, url) { return /lib\/ws-session/.test(url); } },
45
+ { key: 'getAssets (core/server.js)', test: function (fn, url) { return fn === 'getAssets'; } },
46
+ { key: 'render delegates (controller.render-*)', test: function (fn, url) { return /controller\/controller\.render-/.test(url); } },
47
+ { key: 'swig engine (@rhinostone/swig)', test: function (fn, url) { return /@rhinostone\/swig/.test(url); } },
48
+ { key: 'logger (lib/logger)', test: function (fn, url) { return /lib\/logger/.test(url); } },
49
+ { key: 'deep clone (utils/prototypes JSONClone)', test: function (fn, url) { return /utils\/prototypes\.json_clone/.test(url); } },
50
+ { key: 'framework utils (utils/)', test: function (fn, url) { return /gina[^/]*\/utils\//.test(url); } },
51
+ { key: 'merge/collection (lib)', test: function (fn, url) { return /\/(merge|collection)\/src\//.test(url); } },
52
+ { key: 'router (core/router.js)', test: function (fn, url) { return /core\/router\.js/.test(url); } },
53
+ { key: 'server core (core/server*.js)', test: function (fn, url) { return /core\/server/.test(url); } },
54
+ { key: 'controller core (core/controller)', test: function (fn, url) { return /core\/controller/.test(url); } },
55
+ { key: 'framework other', test: function (fn, url) { return /framework\/v[0-9]|node_modules\/gina\//.test(url); } },
56
+ { key: 'bundle app code', test: function (fn, url) { return /\/releases\/|\/src\/[^/]+\/(controllers|templates|index\.js)/.test(url); } },
57
+ { key: 'node internals', test: function (fn, url) { return url.indexOf('node:') === 0; } },
58
+ { key: 'other JS', test: function () { return true; } }
59
+ ];
60
+
61
+ /**
62
+ * Aggregate one parsed profile into bucket self-times.
63
+ *
64
+ * @param {object} profile - parsed `.cpuprofile` JSON ({nodes, samples, timeDeltas})
65
+ * @returns {{totalUs: number, buckets: object, frames: Array}} totals in microseconds
66
+ */
67
+ function analyze(profile) {
68
+ var byId = {};
69
+ var i;
70
+ for (i = 0; i < profile.nodes.length; i++) {
71
+ byId[profile.nodes[i].id] = profile.nodes[i];
72
+ }
73
+
74
+ var selfUs = {};
75
+ var samples = profile.samples || [];
76
+ var deltas = profile.timeDeltas || [];
77
+ for (i = 0; i < samples.length; i++) {
78
+ var d = deltas[i] > 0 ? deltas[i] : 0;
79
+ selfUs[samples[i]] = (selfUs[samples[i]] || 0) + d;
80
+ }
81
+
82
+ var buckets = {};
83
+ var frames = [];
84
+ var totalUs = 0;
85
+ for (i = 0; i < BUCKETS.length; i++) {
86
+ buckets[BUCKETS[i].key] = 0;
87
+ }
88
+
89
+ Object.keys(selfUs).forEach(function (id) {
90
+ var node = byId[id];
91
+ if (!node) { return; }
92
+ var cf = node.callFrame || {};
93
+ var fn = cf.functionName || '';
94
+ var url = cf.url || '';
95
+ var us = selfUs[id];
96
+ totalUs += us;
97
+
98
+ for (var b = 0; b < BUCKETS.length; b++) {
99
+ if (BUCKETS[b].test(fn, url)) {
100
+ buckets[BUCKETS[b].key] += us;
101
+ break;
102
+ }
103
+ }
104
+ frames.push({
105
+ us : us,
106
+ fn : fn || '(anonymous)',
107
+ url : url,
108
+ line : (typeof cf.lineNumber === 'number') ? cf.lineNumber + 1 : null
109
+ });
110
+ });
111
+
112
+ frames.sort(function (a, b) { return b.us - a.us; });
113
+ return { totalUs: totalUs, buckets: buckets, frames: frames };
114
+ }
115
+
116
+ /**
117
+ * Render one analysis as a human-readable table.
118
+ *
119
+ * @param {string} label
120
+ * @param {{totalUs: number, buckets: object, frames: Array}} result
121
+ * @param {number} [topN=15]
122
+ * @returns {string}
123
+ */
124
+ function format(label, result, topN) {
125
+ topN = topN || 15;
126
+ var out = [];
127
+ out.push('══ ' + label + ' — total sampled self-time: ' + (result.totalUs / 1000).toFixed(1) + ' ms');
128
+ Object.keys(result.buckets)
129
+ .map(function (k) { return { k: k, us: result.buckets[k] }; })
130
+ .sort(function (a, b) { return b.us - a.us; })
131
+ .forEach(function (row) {
132
+ if (row.us === 0) { return; }
133
+ var pct = (100 * row.us / result.totalUs).toFixed(2);
134
+ out.push(' ' + pad(pct + '%', 8) + pad((row.us / 1000).toFixed(1) + ' ms', 12) + row.k);
135
+ });
136
+ out.push(' ── top ' + topN + ' frames by self-time:');
137
+ result.frames.slice(0, topN).forEach(function (f) {
138
+ var loc = f.url ? (shorten(f.url) + (f.line ? ':' + f.line : '')) : '';
139
+ out.push(' ' + pad((f.us / 1000).toFixed(1) + ' ms', 12) + f.fn + (loc ? ' @ ' + loc : ''));
140
+ });
141
+ return out.join('\n');
142
+ }
143
+
144
+ /**
145
+ * @param {string} s
146
+ * @param {number} n
147
+ * @returns {string} left-padded to n + two trailing spaces
148
+ * @inner
149
+ */
150
+ function pad(s, n) {
151
+ while (s.length < n) { s = ' ' + s; }
152
+ return s + ' ';
153
+ }
154
+
155
+ /**
156
+ * @param {string} url
157
+ * @returns {string} the last 3 path segments — enough to identify a frame
158
+ * @inner
159
+ */
160
+ function shorten(url) {
161
+ var parts = url.split('/');
162
+ return parts.slice(Math.max(0, parts.length - 3)).join('/');
163
+ }
164
+
165
+ module.exports = { analyze: analyze, format: format, BUCKETS: BUCKETS };
166
+
167
+ if (require.main === module) {
168
+ var args = process.argv.slice(2);
169
+ var asJson = args.indexOf('--json') > -1;
170
+ var files = args.filter(function (a) { return a.indexOf('--') !== 0; });
171
+ if (!files.length) {
172
+ process.stderr.write('usage: node script/perf/analyze-cpuprofile.js [--json] <file.cpuprofile> [...]\n');
173
+ process.exit(2);
174
+ }
175
+ var all = {};
176
+ files.forEach(function (f) {
177
+ var result = analyze(JSON.parse(fs.readFileSync(f, 'utf8')));
178
+ if (asJson) {
179
+ all[path.basename(f)] = { totalUs: result.totalUs, buckets: result.buckets, top: result.frames.slice(0, 20) };
180
+ } else {
181
+ process.stdout.write(format(path.basename(f), result) + '\n\n');
182
+ }
183
+ });
184
+ if (asJson) {
185
+ process.stdout.write(JSON.stringify(all, null, 2) + '\n');
186
+ }
187
+ }