gina 0.6.9 → 0.6.10

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 (581) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +17 -23
  3. package/ROADMAP.md +1 -0
  4. package/framework/v0.6.10/VERSION +1 -0
  5. package/framework/{v0.6.9 → v0.6.10}/core/config.js +15 -7
  6. package/framework/{v0.6.9 → v0.6.10}/core/gna.js +85 -45
  7. package/framework/{v0.6.9 → v0.6.10}/core/server.isaac.js +215 -0
  8. package/framework/{v0.6.9 → v0.6.10}/core/server.js +295 -0
  9. package/framework/{v0.6.9 → v0.6.10}/core/template/conf/settings.json +25 -0
  10. package/framework/{v0.6.9 → v0.6.10}/helpers/path.js +114 -0
  11. package/framework/v0.6.10/lib/admin/src/main.js +217 -0
  12. package/framework/{v0.6.9 → v0.6.10}/lib/generator/index.js +13 -13
  13. package/framework/{v0.6.9 → v0.6.10}/lib/index.js +8 -0
  14. package/framework/v0.6.10/lib/maintenance/package.json +17 -0
  15. package/framework/v0.6.10/lib/maintenance/src/main.js +981 -0
  16. package/framework/{v0.6.9 → v0.6.10}/package.json +1 -1
  17. package/gna.js +4 -4
  18. package/llms.txt +6 -4
  19. package/package.json +3 -3
  20. package/schema/settings.json +37 -0
  21. package/types/index.d.ts +10 -1
  22. package/framework/v0.6.9/VERSION +0 -1
  23. package/framework/v0.6.9/lib/admin/src/main.js +0 -93
  24. /package/framework/{v0.6.9 → v0.6.10}/AUTHORS +0 -0
  25. /package/framework/{v0.6.9 → v0.6.10}/LICENSE +0 -0
  26. /package/framework/{v0.6.9 → v0.6.10}/core/asset/html/nolayout.html +0 -0
  27. /package/framework/{v0.6.9 → v0.6.10}/core/asset/html/static.html +0 -0
  28. /package/framework/{v0.6.9 → v0.6.10}/core/asset/img/android-chrome-192x192.png +0 -0
  29. /package/framework/{v0.6.9 → v0.6.10}/core/asset/img/android-chrome-512x512.png +0 -0
  30. /package/framework/{v0.6.9 → v0.6.10}/core/asset/img/apple-touch-icon.png +0 -0
  31. /package/framework/{v0.6.9 → v0.6.10}/core/asset/img/favicon-16x16.png +0 -0
  32. /package/framework/{v0.6.9 → v0.6.10}/core/asset/img/favicon-32x32.png +0 -0
  33. /package/framework/{v0.6.9 → v0.6.10}/core/asset/img/favicon.ico +0 -0
  34. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/README.md +0 -0
  35. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  36. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  37. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  38. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  39. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  40. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  41. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  42. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  43. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  44. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  45. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  46. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  47. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  48. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  49. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/js/gina.js +0 -0
  50. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -0
  51. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  52. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  53. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  54. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  55. /package/framework/{v0.6.9 → v0.6.10}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  56. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/ai/index.js +0 -0
  57. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/ai/lib/connector.js +0 -0
  58. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/couchbase/index.js +0 -0
  59. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/couchbase/lib/connector.js +0 -0
  60. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  61. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  62. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/couchbase/lib/n1ql.js +0 -0
  63. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/couchbase/lib/session-store.js +0 -0
  64. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  65. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  66. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/couchbase/lib/storage-store.js +0 -0
  67. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/duckdb/index.js +0 -0
  68. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/duckdb/lib/connector.js +0 -0
  69. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/mongodb/index.js +0 -0
  70. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/mongodb/lib/connector.js +0 -0
  71. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/mongodb/lib/job-store.js +0 -0
  72. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
  73. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/mongodb/lib/session-store.js +0 -0
  74. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/mysql/index.js +0 -0
  75. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/mysql/lib/connector.js +0 -0
  76. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/param-redact.js +0 -0
  77. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/postgresql/index.js +0 -0
  78. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/postgresql/lib/connector.js +0 -0
  79. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/redis/index.js +0 -0
  80. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/redis/lib/connector.js +0 -0
  81. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/redis/lib/job-store.js +0 -0
  82. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/redis/lib/render-cache-store.js +0 -0
  83. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/redis/lib/session-store.js +0 -0
  84. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/scylladb/index.js +0 -0
  85. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/scylladb/lib/connector.js +0 -0
  86. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/scylladb/lib/session-store.js +0 -0
  87. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/sql-parser.js +0 -0
  88. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/sqlite/index.js +0 -0
  89. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/sqlite/lib/connector.js +0 -0
  90. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/sqlite/lib/job-store.js +0 -0
  91. /package/framework/{v0.6.9 → v0.6.10}/core/connectors/sqlite/lib/session-store.js +0 -0
  92. /package/framework/{v0.6.9 → v0.6.10}/core/content.encoding +0 -0
  93. /package/framework/{v0.6.9 → v0.6.10}/core/controller/controller.framework.js +0 -0
  94. /package/framework/{v0.6.9 → v0.6.10}/core/controller/controller.js +0 -0
  95. /package/framework/{v0.6.9 → v0.6.10}/core/controller/controller.render-json.js +0 -0
  96. /package/framework/{v0.6.9 → v0.6.10}/core/controller/controller.render-nunjucks-async.js +0 -0
  97. /package/framework/{v0.6.9 → v0.6.10}/core/controller/controller.render-nunjucks.js +0 -0
  98. /package/framework/{v0.6.9 → v0.6.10}/core/controller/controller.render-stream.js +0 -0
  99. /package/framework/{v0.6.9 → v0.6.10}/core/controller/controller.render-swig-async.js +0 -0
  100. /package/framework/{v0.6.9 → v0.6.10}/core/controller/controller.render-swig.js +0 -0
  101. /package/framework/{v0.6.9 → v0.6.10}/core/controller/controller.render-v1.js +0 -0
  102. /package/framework/{v0.6.9 → v0.6.10}/core/controller/index.js +0 -0
  103. /package/framework/{v0.6.9 → v0.6.10}/core/controller/inspector-window-emit.js +0 -0
  104. /package/framework/{v0.6.9 → v0.6.10}/core/controller/release-banner.js +0 -0
  105. /package/framework/{v0.6.9 → v0.6.10}/core/dev/index.js +0 -0
  106. /package/framework/{v0.6.9 → v0.6.10}/core/dev/lib/class.js +0 -0
  107. /package/framework/{v0.6.9 → v0.6.10}/core/dev/lib/factory.js +0 -0
  108. /package/framework/{v0.6.9 → v0.6.10}/core/dev/lib/tools.js +0 -0
  109. /package/framework/{v0.6.9 → v0.6.10}/core/locales/README.md +0 -0
  110. /package/framework/{v0.6.9 → v0.6.10}/core/locales/currency.json +0 -0
  111. /package/framework/{v0.6.9 → v0.6.10}/core/locales/dist/language/en.json +0 -0
  112. /package/framework/{v0.6.9 → v0.6.10}/core/locales/dist/language/fr.json +0 -0
  113. /package/framework/{v0.6.9 → v0.6.10}/core/locales/dist/region/en.json +0 -0
  114. /package/framework/{v0.6.9 → v0.6.10}/core/locales/dist/region/fr.json +0 -0
  115. /package/framework/{v0.6.9 → v0.6.10}/core/locales/index.js +0 -0
  116. /package/framework/{v0.6.9 → v0.6.10}/core/mime.types +0 -0
  117. /package/framework/{v0.6.9 → v0.6.10}/core/model/entity.js +0 -0
  118. /package/framework/{v0.6.9 → v0.6.10}/core/model/index.js +0 -0
  119. /package/framework/{v0.6.9 → v0.6.10}/core/model/template/entityFactory.js +0 -0
  120. /package/framework/{v0.6.9 → v0.6.10}/core/model/template/index.js +0 -0
  121. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/README.md +0 -0
  122. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/index.js +0 -0
  123. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/csrf/README.md +0 -0
  124. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/csrf/package.json +0 -0
  125. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/csrf/src/main.js +0 -0
  126. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/README.md +0 -0
  127. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/coep/README.md +0 -0
  128. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/coep/package.json +0 -0
  129. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
  130. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/coop/README.md +0 -0
  131. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/coop/package.json +0 -0
  132. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
  133. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/corp/README.md +0 -0
  134. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/corp/package.json +0 -0
  135. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
  136. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/csp/README.md +0 -0
  137. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/csp/package.json +0 -0
  138. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
  139. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
  140. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
  141. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
  142. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/hsts/README.md +0 -0
  143. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/hsts/package.json +0 -0
  144. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
  145. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
  146. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
  147. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
  148. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/package.json +0 -0
  149. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
  150. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
  151. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
  152. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/src/main.js +0 -0
  153. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
  154. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
  155. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
  156. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
  157. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
  158. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
  159. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
  160. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
  161. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
  162. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
  163. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
  164. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
  165. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
  166. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
  167. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
  168. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
  169. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
  170. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
  171. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/session/README.md +0 -0
  172. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/session/package.json +0 -0
  173. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/session/src/main.js +0 -0
  174. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/storage/README.md +0 -0
  175. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/storage/build.json +0 -0
  176. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/storage/package.json +0 -0
  177. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/storage/src/main.js +0 -0
  178. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/validator/README.md +0 -0
  179. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/validator/build.json +0 -0
  180. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/validator/package.json +0 -0
  181. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/validator/src/form-validator.js +0 -0
  182. /package/framework/{v0.6.9 → v0.6.10}/core/plugins/lib/validator/src/main.js +0 -0
  183. /package/framework/{v0.6.9 → v0.6.10}/core/router.js +0 -0
  184. /package/framework/{v0.6.9 → v0.6.10}/core/server.express.js +0 -0
  185. /package/framework/{v0.6.9 → v0.6.10}/core/status.codes +0 -0
  186. /package/framework/{v0.6.9 → v0.6.10}/core/template/_gitignore +0 -0
  187. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle/config/app.json +0 -0
  188. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  189. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle/config/routing.json +0 -0
  190. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle/config/settings.json +0 -0
  191. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  192. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle/config/templates.json +0 -0
  193. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  194. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  195. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  196. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  197. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle/index.js +0 -0
  198. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle/locales/en.json +0 -0
  199. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  200. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  201. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  202. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  203. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  204. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
  205. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  206. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
  207. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_public/readme.md +0 -0
  208. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_public/sw.js +0 -0
  209. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  210. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  211. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  212. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  213. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
  214. /package/framework/{v0.6.9 → v0.6.10}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  215. /package/framework/{v0.6.9 → v0.6.10}/core/template/command/gina.bat.tpl +0 -0
  216. /package/framework/{v0.6.9 → v0.6.10}/core/template/command/gina.tpl +0 -0
  217. /package/framework/{v0.6.9 → v0.6.10}/core/template/conf/env.json +0 -0
  218. /package/framework/{v0.6.9 → v0.6.10}/core/template/conf/manifest.json +0 -0
  219. /package/framework/{v0.6.9 → v0.6.10}/core/template/conf/package.json +0 -0
  220. /package/framework/{v0.6.9 → v0.6.10}/core/template/conf/statics.json +0 -0
  221. /package/framework/{v0.6.9 → v0.6.10}/core/template/conf/templates.json +0 -0
  222. /package/framework/{v0.6.9 → v0.6.10}/core/template/error/client/json/401.json +0 -0
  223. /package/framework/{v0.6.9 → v0.6.10}/core/template/error/client/json/403.json +0 -0
  224. /package/framework/{v0.6.9 → v0.6.10}/core/template/error/client/json/404.json +0 -0
  225. /package/framework/{v0.6.9 → v0.6.10}/core/template/error/server/html/50x.html +0 -0
  226. /package/framework/{v0.6.9 → v0.6.10}/core/template/error/server/json/500.json +0 -0
  227. /package/framework/{v0.6.9 → v0.6.10}/core/template/error/server/json/503.json +0 -0
  228. /package/framework/{v0.6.9 → v0.6.10}/core/template/extensions/logger/config.json +0 -0
  229. /package/framework/{v0.6.9 → v0.6.10}/helpers/console.js +0 -0
  230. /package/framework/{v0.6.9 → v0.6.10}/helpers/context.js +0 -0
  231. /package/framework/{v0.6.9 → v0.6.10}/helpers/data/LICENSE +0 -0
  232. /package/framework/{v0.6.9 → v0.6.10}/helpers/data/README.md +0 -0
  233. /package/framework/{v0.6.9 → v0.6.10}/helpers/data/package.json +0 -0
  234. /package/framework/{v0.6.9 → v0.6.10}/helpers/data/src/main.js +0 -0
  235. /package/framework/{v0.6.9 → v0.6.10}/helpers/dateFormat.js +0 -0
  236. /package/framework/{v0.6.9 → v0.6.10}/helpers/index.js +0 -0
  237. /package/framework/{v0.6.9 → v0.6.10}/helpers/json/LICENSE +0 -0
  238. /package/framework/{v0.6.9 → v0.6.10}/helpers/json/README.md +0 -0
  239. /package/framework/{v0.6.9 → v0.6.10}/helpers/json/package.json +0 -0
  240. /package/framework/{v0.6.9 → v0.6.10}/helpers/json/src/main.js +0 -0
  241. /package/framework/{v0.6.9 → v0.6.10}/helpers/plugins/README.md +0 -0
  242. /package/framework/{v0.6.9 → v0.6.10}/helpers/plugins/package.json +0 -0
  243. /package/framework/{v0.6.9 → v0.6.10}/helpers/plugins/src/api-error.js +0 -0
  244. /package/framework/{v0.6.9 → v0.6.10}/helpers/plugins/src/main.js +0 -0
  245. /package/framework/{v0.6.9 → v0.6.10}/helpers/prototypes.js +0 -0
  246. /package/framework/{v0.6.9 → v0.6.10}/helpers/task.js +0 -0
  247. /package/framework/{v0.6.9 → v0.6.10}/helpers/text.js +0 -0
  248. /package/framework/{v0.6.9 → v0.6.10}/lib/admin/package.json +0 -0
  249. /package/framework/{v0.6.9 → v0.6.10}/lib/archiver/README.md +0 -0
  250. /package/framework/{v0.6.9 → v0.6.10}/lib/archiver/build.json +0 -0
  251. /package/framework/{v0.6.9 → v0.6.10}/lib/archiver/package.json +0 -0
  252. /package/framework/{v0.6.9 → v0.6.10}/lib/archiver/src/dep/jszip.min.js +0 -0
  253. /package/framework/{v0.6.9 → v0.6.10}/lib/archiver/src/main.js +0 -0
  254. /package/framework/{v0.6.9 → v0.6.10}/lib/async/package.json +0 -0
  255. /package/framework/{v0.6.9 → v0.6.10}/lib/async/src/main.js +0 -0
  256. /package/framework/{v0.6.9 → v0.6.10}/lib/audit/package.json +0 -0
  257. /package/framework/{v0.6.9 → v0.6.10}/lib/audit/src/main.js +0 -0
  258. /package/framework/{v0.6.9 → v0.6.10}/lib/audit-store.js +0 -0
  259. /package/framework/{v0.6.9 → v0.6.10}/lib/authn/package.json +0 -0
  260. /package/framework/{v0.6.9 → v0.6.10}/lib/authn/src/lockout.js +0 -0
  261. /package/framework/{v0.6.9 → v0.6.10}/lib/authn/src/main.js +0 -0
  262. /package/framework/{v0.6.9 → v0.6.10}/lib/authn/src/totp.js +0 -0
  263. /package/framework/{v0.6.9 → v0.6.10}/lib/authz-gate/package.json +0 -0
  264. /package/framework/{v0.6.9 → v0.6.10}/lib/authz-gate/src/main.js +0 -0
  265. /package/framework/{v0.6.9 → v0.6.10}/lib/cache/README.md +0 -0
  266. /package/framework/{v0.6.9 → v0.6.10}/lib/cache/build.json +0 -0
  267. /package/framework/{v0.6.9 → v0.6.10}/lib/cache/package.json +0 -0
  268. /package/framework/{v0.6.9 → v0.6.10}/lib/cache/src/main.js +0 -0
  269. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/aliases.json +0 -0
  270. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/audit/arguments.json +0 -0
  271. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/audit/help.txt +0 -0
  272. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/audit/verify.js +0 -0
  273. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/add.js +0 -0
  274. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/arguments.json +0 -0
  275. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/build.js +0 -0
  276. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/copy.js +0 -0
  277. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/cp.js +0 -0
  278. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/help.js +0 -0
  279. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/help.txt +0 -0
  280. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
  281. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/list.js +0 -0
  282. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/man.js +0 -0
  283. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/mcp-start.js +0 -0
  284. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/mcp.js +0 -0
  285. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/oas.js +0 -0
  286. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/openapi.js +0 -0
  287. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/remove.js +0 -0
  288. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/rename.js +0 -0
  289. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/restart.js +0 -0
  290. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/rm.js +0 -0
  291. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/start.js +0 -0
  292. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/status.js +0 -0
  293. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/stop.js +0 -0
  294. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/bundle/types.js +0 -0
  295. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/cache/arguments.json +0 -0
  296. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/cache/clear.js +0 -0
  297. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/cache/help.txt +0 -0
  298. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/cache/stats.js +0 -0
  299. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/connector/add.js +0 -0
  300. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/connector/arguments.json +0 -0
  301. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/connector/help.js +0 -0
  302. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/connector/help.txt +0 -0
  303. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/connector/infer.js +0 -0
  304. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/connector/list.js +0 -0
  305. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/connector/migrate.js +0 -0
  306. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/connector/models.js +0 -0
  307. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/connector/remove.js +0 -0
  308. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/connector/rm.js +0 -0
  309. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/connector/test.js +0 -0
  310. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/container/arguments.json +0 -0
  311. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/container/help.js +0 -0
  312. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/container/help.txt +0 -0
  313. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/container/man.js +0 -0
  314. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/container/ps.js +0 -0
  315. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/container/stop.js +0 -0
  316. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/controller/add.js +0 -0
  317. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/controller/arguments.json +0 -0
  318. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/controller/help.txt +0 -0
  319. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/controller/inc/args.js +0 -0
  320. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/controller/inc/namespace.js +0 -0
  321. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
  322. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/controller/inc/reference-scan.js +0 -0
  323. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/controller/inc/scaffold.js +0 -0
  324. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/controller/remove.js +0 -0
  325. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/controller/rename.js +0 -0
  326. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/controller/rm.js +0 -0
  327. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/env/add.js +0 -0
  328. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/env/get.js +0 -0
  329. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/env/help.js +0 -0
  330. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/env/help.txt +0 -0
  331. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/env/link-dev.js +0 -0
  332. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/env/list.js +0 -0
  333. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/env/remove.js +0 -0
  334. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/env/rm.js +0 -0
  335. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/env/set.js +0 -0
  336. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/env/unset.js +0 -0
  337. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/env/use.js +0 -0
  338. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/add.js +0 -0
  339. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/arguments.json +0 -0
  340. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/build.js +0 -0
  341. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/dot.js +0 -0
  342. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/get.js +0 -0
  343. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/help.js +0 -0
  344. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/help.txt +0 -0
  345. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/init.js +0 -0
  346. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/link-node-modules.js +0 -0
  347. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/link.js +0 -0
  348. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/list.js +0 -0
  349. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/man.js +0 -0
  350. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/msg.json +0 -0
  351. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/open.js +0 -0
  352. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/remove.js +0 -0
  353. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/reset.js +0 -0
  354. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/restart.js +0 -0
  355. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/set.js +0 -0
  356. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/start.js +0 -0
  357. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/status.js +0 -0
  358. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/stop.js +0 -0
  359. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/tail.js +0 -0
  360. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/update.js +0 -0
  361. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/framework/version.js +0 -0
  362. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/gina-dev.1.md +0 -0
  363. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/gina-framework.1.md +0 -0
  364. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/gina.1.md +0 -0
  365. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/helper.js +0 -0
  366. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/i18n/add.js +0 -0
  367. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/i18n/arguments.json +0 -0
  368. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/i18n/export.js +0 -0
  369. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/i18n/help.js +0 -0
  370. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/i18n/help.txt +0 -0
  371. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/i18n/import.js +0 -0
  372. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/i18n/scan.js +0 -0
  373. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/image/_host.js +0 -0
  374. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/image/arguments.json +0 -0
  375. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/image/build.js +0 -0
  376. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/image/help.js +0 -0
  377. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/image/help.txt +0 -0
  378. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/image/list.js +0 -0
  379. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/image/man.js +0 -0
  380. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/image/rm.js +0 -0
  381. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/image/run.js +0 -0
  382. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/index.js +0 -0
  383. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/inspector/help.js +0 -0
  384. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/inspector/help.txt +0 -0
  385. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/inspector/open.js +0 -0
  386. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/man-render.js +0 -0
  387. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/minion/arguments.json +0 -0
  388. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/minion/help.js +0 -0
  389. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/minion/help.txt +0 -0
  390. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/minion/kill.js +0 -0
  391. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/minion/list.js +0 -0
  392. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/msg.json +0 -0
  393. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/port/help.js +0 -0
  394. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/port/help.txt +0 -0
  395. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/port/inc/scan.js +0 -0
  396. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/port/list.js +0 -0
  397. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/port/reset.js +0 -0
  398. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/port/set.js +0 -0
  399. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/add.js +0 -0
  400. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/arguments.json +0 -0
  401. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/backup.js +0 -0
  402. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/build.js +0 -0
  403. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/help.js +0 -0
  404. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/help.txt +0 -0
  405. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/import.js +0 -0
  406. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/list.js +0 -0
  407. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/man.js +0 -0
  408. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/move.js +0 -0
  409. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/remove.js +0 -0
  410. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/rename.js +0 -0
  411. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/restart.js +0 -0
  412. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/restore.js +0 -0
  413. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/rm.js +0 -0
  414. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/start.js +0 -0
  415. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/status.js +0 -0
  416. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/project/stop.js +0 -0
  417. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/protocol/arguments.json +0 -0
  418. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/protocol/help.js +0 -0
  419. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/protocol/help.txt +0 -0
  420. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/protocol/list.js +0 -0
  421. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/protocol/remove.js +0 -0
  422. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/protocol/set.js +0 -0
  423. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/scope/add.js +0 -0
  424. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/scope/help.js +0 -0
  425. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/scope/help.txt +0 -0
  426. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/scope/link-local.js +0 -0
  427. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/scope/link-production.js +0 -0
  428. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/scope/list.js +0 -0
  429. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/scope/remove.js +0 -0
  430. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/scope/rm.js +0 -0
  431. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/scope/use.js +0 -0
  432. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/secrets/arguments.json +0 -0
  433. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/secrets/check.js +0 -0
  434. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/secrets/help.js +0 -0
  435. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/secrets/help.txt +0 -0
  436. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/secrets/scan.js +0 -0
  437. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/service/help.js +0 -0
  438. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/service/help.txt +0 -0
  439. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/service/list.js +0 -0
  440. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/service/man.js +0 -0
  441. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/service/start.js +0 -0
  442. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/storage/arguments.json +0 -0
  443. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/storage/gc.js +0 -0
  444. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/storage/help.txt +0 -0
  445. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/storage/stats.js +0 -0
  446. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/storage/verify.js +0 -0
  447. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd/view/add.js +0 -0
  448. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd-status-format/package.json +0 -0
  449. /package/framework/{v0.6.9 → v0.6.10}/lib/cmd-status-format/src/main.js +0 -0
  450. /package/framework/{v0.6.9 → v0.6.10}/lib/collection/README.md +0 -0
  451. /package/framework/{v0.6.9 → v0.6.10}/lib/collection/build.json +0 -0
  452. /package/framework/{v0.6.9 → v0.6.10}/lib/collection/package.json +0 -0
  453. /package/framework/{v0.6.9 → v0.6.10}/lib/collection/src/main.js +0 -0
  454. /package/framework/{v0.6.9 → v0.6.10}/lib/config.js +0 -0
  455. /package/framework/{v0.6.9 → v0.6.10}/lib/connector-config/package.json +0 -0
  456. /package/framework/{v0.6.9 → v0.6.10}/lib/connector-config/src/main.js +0 -0
  457. /package/framework/{v0.6.9 → v0.6.10}/lib/connector-error/package.json +0 -0
  458. /package/framework/{v0.6.9 → v0.6.10}/lib/connector-error/src/main.js +0 -0
  459. /package/framework/{v0.6.9 → v0.6.10}/lib/connector-registry/package.json +0 -0
  460. /package/framework/{v0.6.9 → v0.6.10}/lib/connector-registry/src/main.js +0 -0
  461. /package/framework/{v0.6.9 → v0.6.10}/lib/cron/README.md +0 -0
  462. /package/framework/{v0.6.9 → v0.6.10}/lib/cron/package.json +0 -0
  463. /package/framework/{v0.6.9 → v0.6.10}/lib/cron/src/main.js +0 -0
  464. /package/framework/{v0.6.9 → v0.6.10}/lib/domain/LICENSE +0 -0
  465. /package/framework/{v0.6.9 → v0.6.10}/lib/domain/README.md +0 -0
  466. /package/framework/{v0.6.9 → v0.6.10}/lib/domain/package.json +0 -0
  467. /package/framework/{v0.6.9 → v0.6.10}/lib/domain/src/main.js +0 -0
  468. /package/framework/{v0.6.9 → v0.6.10}/lib/dto/package.json +0 -0
  469. /package/framework/{v0.6.9 → v0.6.10}/lib/dto/src/main.js +0 -0
  470. /package/framework/{v0.6.9 → v0.6.10}/lib/dto-pipe/package.json +0 -0
  471. /package/framework/{v0.6.9 → v0.6.10}/lib/dto-pipe/src/main.js +0 -0
  472. /package/framework/{v0.6.9 → v0.6.10}/lib/dto-types/package.json +0 -0
  473. /package/framework/{v0.6.9 → v0.6.10}/lib/dto-types/src/main.js +0 -0
  474. /package/framework/{v0.6.9 → v0.6.10}/lib/i18n/package.json +0 -0
  475. /package/framework/{v0.6.9 → v0.6.10}/lib/i18n/src/main.js +0 -0
  476. /package/framework/{v0.6.9 → v0.6.10}/lib/image-build/package.json +0 -0
  477. /package/framework/{v0.6.9 → v0.6.10}/lib/image-build/src/main.js +0 -0
  478. /package/framework/{v0.6.9 → v0.6.10}/lib/inherits/LICENSE +0 -0
  479. /package/framework/{v0.6.9 → v0.6.10}/lib/inherits/README.md +0 -0
  480. /package/framework/{v0.6.9 → v0.6.10}/lib/inherits/package.json +0 -0
  481. /package/framework/{v0.6.9 → v0.6.10}/lib/inherits/src/main.js +0 -0
  482. /package/framework/{v0.6.9 → v0.6.10}/lib/inspector-events/package.json +0 -0
  483. /package/framework/{v0.6.9 → v0.6.10}/lib/inspector-events/src/main.js +0 -0
  484. /package/framework/{v0.6.9 → v0.6.10}/lib/inspector-redact/package.json +0 -0
  485. /package/framework/{v0.6.9 → v0.6.10}/lib/inspector-redact/src/main.js +0 -0
  486. /package/framework/{v0.6.9 → v0.6.10}/lib/instrument/package.json +0 -0
  487. /package/framework/{v0.6.9 → v0.6.10}/lib/instrument/src/main.js +0 -0
  488. /package/framework/{v0.6.9 → v0.6.10}/lib/job/package.json +0 -0
  489. /package/framework/{v0.6.9 → v0.6.10}/lib/job/src/main.js +0 -0
  490. /package/framework/{v0.6.9 → v0.6.10}/lib/job-store.js +0 -0
  491. /package/framework/{v0.6.9 → v0.6.10}/lib/json-config-header/package.json +0 -0
  492. /package/framework/{v0.6.9 → v0.6.10}/lib/json-config-header/src/main.js +0 -0
  493. /package/framework/{v0.6.9 → v0.6.10}/lib/loading-state/package.json +0 -0
  494. /package/framework/{v0.6.9 → v0.6.10}/lib/loading-state/src/main.js +0 -0
  495. /package/framework/{v0.6.9 → v0.6.10}/lib/logger/README.md +0 -0
  496. /package/framework/{v0.6.9 → v0.6.10}/lib/logger/package.json +0 -0
  497. /package/framework/{v0.6.9 → v0.6.10}/lib/logger/src/containers/default/index.js +0 -0
  498. /package/framework/{v0.6.9 → v0.6.10}/lib/logger/src/containers/file/index.js +0 -0
  499. /package/framework/{v0.6.9 → v0.6.10}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  500. /package/framework/{v0.6.9 → v0.6.10}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  501. /package/framework/{v0.6.9 → v0.6.10}/lib/logger/src/containers/mq/index.js +0 -0
  502. /package/framework/{v0.6.9 → v0.6.10}/lib/logger/src/containers/mq/listener.js +0 -0
  503. /package/framework/{v0.6.9 → v0.6.10}/lib/logger/src/containers/mq/speaker.js +0 -0
  504. /package/framework/{v0.6.9 → v0.6.10}/lib/logger/src/helper.js +0 -0
  505. /package/framework/{v0.6.9 → v0.6.10}/lib/logger/src/main.js +0 -0
  506. /package/framework/{v0.6.9 → v0.6.10}/lib/math/index.js +0 -0
  507. /package/framework/{v0.6.9 → v0.6.10}/lib/mcp-dispatch/package.json +0 -0
  508. /package/framework/{v0.6.9 → v0.6.10}/lib/mcp-dispatch/src/main.js +0 -0
  509. /package/framework/{v0.6.9 → v0.6.10}/lib/mcp-http/package.json +0 -0
  510. /package/framework/{v0.6.9 → v0.6.10}/lib/mcp-http/src/main.js +0 -0
  511. /package/framework/{v0.6.9 → v0.6.10}/lib/mcp-server/package.json +0 -0
  512. /package/framework/{v0.6.9 → v0.6.10}/lib/mcp-server/src/main.js +0 -0
  513. /package/framework/{v0.6.9 → v0.6.10}/lib/merge/README.md +0 -0
  514. /package/framework/{v0.6.9 → v0.6.10}/lib/merge/package.json +0 -0
  515. /package/framework/{v0.6.9 → v0.6.10}/lib/merge/src/main.js +0 -0
  516. /package/framework/{v0.6.9 → v0.6.10}/lib/metrics/package.json +0 -0
  517. /package/framework/{v0.6.9 → v0.6.10}/lib/metrics/src/main.js +0 -0
  518. /package/framework/{v0.6.9 → v0.6.10}/lib/model.js +0 -0
  519. /package/framework/{v0.6.9 → v0.6.10}/lib/net-locality/package.json +0 -0
  520. /package/framework/{v0.6.9 → v0.6.10}/lib/net-locality/src/main.js +0 -0
  521. /package/framework/{v0.6.9 → v0.6.10}/lib/nunjucks-filters/README.md +0 -0
  522. /package/framework/{v0.6.9 → v0.6.10}/lib/nunjucks-filters/package.json +0 -0
  523. /package/framework/{v0.6.9 → v0.6.10}/lib/nunjucks-filters/src/main.js +0 -0
  524. /package/framework/{v0.6.9 → v0.6.10}/lib/nunjucks-resolver/package.json +0 -0
  525. /package/framework/{v0.6.9 → v0.6.10}/lib/nunjucks-resolver/src/main.js +0 -0
  526. /package/framework/{v0.6.9 → v0.6.10}/lib/proc.js +0 -0
  527. /package/framework/{v0.6.9 → v0.6.10}/lib/push/package.json +0 -0
  528. /package/framework/{v0.6.9 → v0.6.10}/lib/push/src/main.js +0 -0
  529. /package/framework/{v0.6.9 → v0.6.10}/lib/release-watch/package.json +0 -0
  530. /package/framework/{v0.6.9 → v0.6.10}/lib/release-watch/src/main.js +0 -0
  531. /package/framework/{v0.6.9 → v0.6.10}/lib/render-cache/package.json +0 -0
  532. /package/framework/{v0.6.9 → v0.6.10}/lib/render-cache/src/main.js +0 -0
  533. /package/framework/{v0.6.9 → v0.6.10}/lib/render-cache-store.js +0 -0
  534. /package/framework/{v0.6.9 → v0.6.10}/lib/routing/README.md +0 -0
  535. /package/framework/{v0.6.9 → v0.6.10}/lib/routing/build.json +0 -0
  536. /package/framework/{v0.6.9 → v0.6.10}/lib/routing/package.json +0 -0
  537. /package/framework/{v0.6.9 → v0.6.10}/lib/routing/src/main.js +0 -0
  538. /package/framework/{v0.6.9 → v0.6.10}/lib/routing/src/radix.js +0 -0
  539. /package/framework/{v0.6.9 → v0.6.10}/lib/routing-introspect/package.json +0 -0
  540. /package/framework/{v0.6.9 → v0.6.10}/lib/routing-introspect/src/main.js +0 -0
  541. /package/framework/{v0.6.9 → v0.6.10}/lib/secrets/package.json +0 -0
  542. /package/framework/{v0.6.9 → v0.6.10}/lib/secrets/src/backends/env.js +0 -0
  543. /package/framework/{v0.6.9 → v0.6.10}/lib/secrets/src/backends/file.js +0 -0
  544. /package/framework/{v0.6.9 → v0.6.10}/lib/secrets/src/env-file.js +0 -0
  545. /package/framework/{v0.6.9 → v0.6.10}/lib/secrets/src/main.js +0 -0
  546. /package/framework/{v0.6.9 → v0.6.10}/lib/session-store.js +0 -0
  547. /package/framework/{v0.6.9 → v0.6.10}/lib/shell.js +0 -0
  548. /package/framework/{v0.6.9 → v0.6.10}/lib/sqlite-driver.js +0 -0
  549. /package/framework/{v0.6.9 → v0.6.10}/lib/state.js +0 -0
  550. /package/framework/{v0.6.9 → v0.6.10}/lib/storage/package.json +0 -0
  551. /package/framework/{v0.6.9 → v0.6.10}/lib/storage/src/local-cas.js +0 -0
  552. /package/framework/{v0.6.9 → v0.6.10}/lib/storage/src/local-stream.js +0 -0
  553. /package/framework/{v0.6.9 → v0.6.10}/lib/storage/src/local.js +0 -0
  554. /package/framework/{v0.6.9 → v0.6.10}/lib/storage/src/main.js +0 -0
  555. /package/framework/{v0.6.9 → v0.6.10}/lib/storage/src/meta-store.js +0 -0
  556. /package/framework/{v0.6.9 → v0.6.10}/lib/storage/src/s3.js +0 -0
  557. /package/framework/{v0.6.9 → v0.6.10}/lib/storage/src/util.js +0 -0
  558. /package/framework/{v0.6.9 → v0.6.10}/lib/storage-store.js +0 -0
  559. /package/framework/{v0.6.9 → v0.6.10}/lib/swig-filters/README.md +0 -0
  560. /package/framework/{v0.6.9 → v0.6.10}/lib/swig-filters/package.json +0 -0
  561. /package/framework/{v0.6.9 → v0.6.10}/lib/swig-filters/src/main.js +0 -0
  562. /package/framework/{v0.6.9 → v0.6.10}/lib/swig-resolver/package.json +0 -0
  563. /package/framework/{v0.6.9 → v0.6.10}/lib/swig-resolver/src/main.js +0 -0
  564. /package/framework/{v0.6.9 → v0.6.10}/lib/template-loaders/package.json +0 -0
  565. /package/framework/{v0.6.9 → v0.6.10}/lib/template-loaders/src/loaders/http.js +0 -0
  566. /package/framework/{v0.6.9 → v0.6.10}/lib/template-loaders/src/loaders/memory.js +0 -0
  567. /package/framework/{v0.6.9 → v0.6.10}/lib/template-loaders/src/main.js +0 -0
  568. /package/framework/{v0.6.9 → v0.6.10}/lib/url/README.md +0 -0
  569. /package/framework/{v0.6.9 → v0.6.10}/lib/url/index.js +0 -0
  570. /package/framework/{v0.6.9 → v0.6.10}/lib/url/routing.json +0 -0
  571. /package/framework/{v0.6.9 → v0.6.10}/lib/uuid/package.json +0 -0
  572. /package/framework/{v0.6.9 → v0.6.10}/lib/uuid/src/main.js +0 -0
  573. /package/framework/{v0.6.9 → v0.6.10}/lib/validator.js +0 -0
  574. /package/framework/{v0.6.9 → v0.6.10}/lib/watcher/package.json +0 -0
  575. /package/framework/{v0.6.9 → v0.6.10}/lib/watcher/src/main.js +0 -0
  576. /package/framework/{v0.6.9 → v0.6.10}/lib/ws-framing/package.json +0 -0
  577. /package/framework/{v0.6.9 → v0.6.10}/lib/ws-framing/src/main.js +0 -0
  578. /package/framework/{v0.6.9 → v0.6.10}/lib/ws-query/package.json +0 -0
  579. /package/framework/{v0.6.9 → v0.6.10}/lib/ws-query/src/main.js +0 -0
  580. /package/framework/{v0.6.9 → v0.6.10}/lib/ws-session/package.json +0 -0
  581. /package/framework/{v0.6.9 → v0.6.10}/lib/ws-session/src/main.js +0 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,17 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
6
6
  and is generated by [Changie](https://github.com/miniscruff/changie).
7
7
 
8
8
 
9
+ ## 0.6.10 - 2026-08-16
10
+
11
+ ### Added
12
+ * Maintenance mode — a bundle can now be closed to the public without being stopped, via `settings.json > server.maintenance` (#MAINT1). When active, every request EXCEPT the `/_gina/*` family is answered `503` with `Retry-After` and `Cache-Control: no-store`, carrying a self-contained maintenance page for a browser navigation and the framework's standard `503` JSON body for XHR / SPA-fragment / json-only callers. The gate runs on BOTH engines, placed after every `/_gina/*` handler and before the webroot filter, static-asset serving, both render/output-cache serve points and routing — so unlike a route middleware (which only runs once a route has matched) it also covers static assets and unmatched URLs. `/_gina/health/check` deliberately keeps answering 200 so an orchestrator does not restart pods over a declared window. Config is `{enabled, retryAfter, message, bypassKey, allowFrom}`; `enabled` must be a strict boolean, every other key falls back per key with a boot warning, and a malformed block never refuses a boot. Two bypasses let chosen visitors through an open window: `bypassKey` (constant-time compare, presented as the `x-gina-maintenance-key` header or once as `?gina-maintenance-key=`, which sets a stateless 12h HttpOnly cookie and redirects to the same URL without the secret) works under ANY topology, while `allowFrom` is honoured only for requests that do not classify as proxied — behind a reverse proxy every socket address is the proxy's, so an unconditioned IP allowlist would admit either everyone or no one. Flip it at runtime with the admin-gated `GET/POST /_gina/maintenance` (optional `ttlSeconds` dead-man switch); a runtime override is not persisted, and an expired TTL reverts to the configured state rather than to off, so a forgotten timer can never re-open a site that configuration says is closed. Scope is per bundle, so merged-process projects isolate correctly. Server-side only — no browser-bundle change, so pickup is a bundle restart with no re-bake.
13
+
14
+ ### Fixed
15
+ * Boot-time bundle mounts are now idempotent, atomic and concurrency-safe (#B381). A mount symlink that already resolves to the intended source is kept untouched, so the steady-state boot writes nothing; a wrong or missing link is published atomically (temp sibling + rename), so the mount name never disappears mid-rewrite; and a concurrent process publishing the identical link is treated as success instead of killing the boot. Previously every boot re-created every declared bundle link in two non-atomic steps (unlink, then create) with no mutual exclusion — with several processes booting one shared project tree (e.g. replicas over a POSIX network filesystem), the contended rewrites could fail a boot outright or abort the shared config load for every bundle. The project bundles/tmp/cache directories and the generator path creation are race-free now as well (recursive create instead of check-then-create). Behaviour note: a real directory occupying a mount path is no longer silently deleted and re-linked — the boot refuses loudly instead.
16
+
17
+ ### Security
18
+ * Closed a cross-site request forgery hole in the admin `/_gina/*` control endpoints (#B384), present in every release up to and including 0.6.9. These endpoints authorise callers by IP allowlist alone (`app.json` `admin.allowFrom`, loopback by default) and a browser attaches that ambient credential automatically, so an operator browsing from an allowlisted machine could be lured to a page that silently issued writes to `/_gina/storage/gc`, `/_gina/cache/clear`, `/_gina/release/rebuild` or `/_gina/maintenance`. The first three read their whole input from the query string and never read a body, so the attack needed no JavaScript and no CORS involvement at all: a plain auto-submitting form was enough. A cross-origin write to any `/_gina/*` endpoint is now refused with 403 on both engines, consulting `Sec-Fetch-Site` where the browser sends it and comparing `Origin` against the connected authority otherwise, never against a forwarded header. Two things are deliberately unaffected: requests carrying no browser origin signal (curl, the gina CLI, deploy scripts) still work, so operator tooling is unchanged; and safe methods (GET, HEAD, OPTIONS, TRACE) are untouched, so the Inspector cross-origin SSE and GET channels keep working. No configuration change is required.
19
+
9
20
  ## 0.6.9 - 2026-08-16
10
21
  ### Added
11
22
  * `gina.pushToSession(sessionID, payload[, option][, callback])` — a sanctioned way to push to a session from OUTSIDE a request (#B366). `self.push()` needs a live request-bound controller, so code that has none (a `lib/job` handler, a cron tick, a boot hook) had no route to a user's socket at all; the pattern consumers reached for instead — a background worker making an HTTP hop carrying the user's session id in the request body — was the #B364 vulnerability, and closing it left that shape with nowhere to go. This is the replacement, and it is deliberately narrow. The recipient is a REQUIRED argument: an absent or empty `sessionID` is an error, never a fan-out, and no broadcast is reachable from this API at all — the deliberate all-clients send stays in-request as `self.push(payload, { broadcast: true })`. Source the recipient from server-held state (capture it when the work is queued, keep it server-side); round-tripping a recipient id, or a token naming one, through the browser hands the choice back to the caller and re-opens #B364 one layer up. Delivery is reported rather than assumed: `callback(err, { delivered })` fires exactly once with the number of sockets written, and `delivered: 0` is a normal outcome (the user closed the tab), not an error — the shape this replaces was fire-and-forget and blind. Errors carry a machine-readable `err.code` (`PUSH_INVALID_RECIPIENT`, `PUSH_INVALID_PAYLOAD`, `PUSH_CHANNEL_NOT_CONFIGURED`, `PUSH_CHANNEL_NOT_READY`, `PUSH_PAYLOAD_SERIALIZE_FAILED`). Requires the isaac engine with `settings.json > server.ioServer` attached; the express engine has no engine.io channel and now says so by name instead of failing as a 500. Available as `lib.push.toSession()` for code holding its own server instance.
package/README.md CHANGED
@@ -61,34 +61,28 @@ open https://localhost:3100
61
61
 
62
62
  > **npm 12+** blocks install scripts by default, and gina's post-install bootstraps `~/.gina` and the framework dependencies. Install with `npm install -g gina@latest --allow-scripts=gina`, or allow it once for all global installs with `npm config set allow-scripts=gina --location=user`. (Not needed on npm ≤ 11.)
63
63
 
64
- ## What's in 0.6.9
64
+ ## What's in 0.6.10
65
65
 
66
66
  > **Restart your bundles — no re-bake.** The browser bundle is byte-identical to
67
- > `0.6.8`, so `gina bundle:restart` is enough; everything below is server-side
68
- > or CLI.
67
+ > `0.6.9` (verified), so `gina bundle:restart` is enough; this release is
68
+ > server-side only.
69
69
 
70
- > **No settings reset.** `0.6.9` is a patch — the `shortVersion` stays `0.6`, so
70
+ > **No settings reset.** `0.6.10` is a patch — the `shortVersion` stays `0.6`, so
71
71
  > your `~/.gina/0.6/settings.json` is untouched. (`0.6.0` was the reset.)
72
72
 
73
- **This release fixes one security flaw, live in every published version that
74
- attaches `server.ioServer`.** It closes the receiver half of the axis `0.6.8`
75
- opened, and it fails closedso if you use targeted pushes, confirm they still
76
- arrive after upgrading. Separately, two malformed `settings.secrets.file` shapes
77
- now refuse to boot; check that config if you use the file tier. Both are covered
78
- in the [migration guide](https://gina.io/docs/migration).
79
-
80
- - **Security — an engine.io socket's session is now proven, not claimed.** A socket's `sessionId` — the value every targeted `self.push()` matches against — was set from `payload.session.id`, a field the browser sends, on every message, and was never checked against the connection's own session. Any client could therefore claim another user's session and receive the pushes addressed to it; and because a rendered page carries the *bare* session id in its bootstrap script while the cookie carries the signed form, doing so took strictly less than stealing the cookie the signature exists to protect. The binding now happens once, at connection, from the upgrade request's own cookie: gina replays the bundle's own session middleware over that request, so the same secret, store and cookie name apply with no new configuration and no framework access to your secret — and it works whether or not the bundle adopted `gina.plugins.Session()`. The response handed to that middleware is inert, so a socket upgrade can never emit `Set-Cookie` or persist a session. It fails closed: no session middleware, no cookie, or a cookie that does not verify leaves the socket with no id, and an id-less socket matches no targeted push. A client that still asserts an id is logged and ignored, which doubles as an impersonation detector. No code change is needed — but because the failure direction is silence rather than an error, verify your targeted pushes still land.
81
- - **Added — `gina.pushToSession()`, a sanctioned push from outside a request.** `self.push()` needs a live request-bound controller, so a `lib/job` handler, a cron tick or a boot hook had no route to a user's socket at all — and the pattern reached for instead, a worker making an HTTP hop carrying the session id in the request body, *was* the flaw `0.6.8` closed. This is the replacement `0.6.8` promised, and it is deliberately narrow: the recipient is a required argument, an absent or empty `sessionID` is an error rather than a fan-out, and no broadcast is reachable from this API at all (a deliberate all-clients send stays in-request as `self.push(payload, { broadcast: true })`). Source the recipient from server-held state — round-tripping a recipient id, or a token naming one, through the browser hands the choice back to the caller and re-opens the same flaw one layer up. Delivery is reported rather than assumed: `callback(err, { delivered })` fires exactly once with the number of sockets written, and `delivered: 0` is a normal outcome, not an error. Errors carry a machine-readable `err.code`. Requires the `isaac` engine with `server.ioServer` attached; also available as `lib.push.toSession()`.
82
- - **Added — a bundle can declare which scopes it is deployed in.** An optional `scopes` allow-list on a bundle's `manifest.json` entry replaces the all-or-nothing choice between "registered everywhere" and "not in the manifest at all". The motivating case is a bundle you are still building: `"scopes": ["local"]` keeps it running locally while every other scope behaves as though it does not exist. An absent or null key means every scope, so existing manifests are completely unaffected; an empty array parks the bundle everywhere; a non-array value is reported as a manifest error by name. How an exclusion is reported depends on whether you asked for it — the boot and `gina project:build` skip an excluded bundle with a notice, so one parked bundle never blocks a project build, while starting it or naming it in `gina bundle:build --scope=` is refused by name, because silently producing no artifact would read as success in a deploy script.
83
- - **Fixed`engine: "express"` bundles boot and serve on Express 5.** Express 5 broke the engine twice over: its router rejected the bare-string `'*'` catch-all at mount time, so the bundle aborted before ever listening, and it turned `req.query` into a prototype getter, so even past the mount every request died on the framework's strict-mode query assignment. Both are fixed, and the supported range is declared for the first time `>= 4 < 6`, with both majors verified live. An out-of-range major logs a loud warning but still boots, since a wrong refusal is a total outage while a wrong warning is a log line. Express remains yours to provide: it is deliberately neither a dependency nor a peer dependency.
84
- - **Fixed — `project:add` / `project:import` no longer rebuild the `bundles` block destructively.** Any mismatch between the declared bundle count and what was on disk made those commands empty the whole block and rebuild it from the directory listing dropping every key the rebuild template does not carry (the new `scopes` allow-list, `gina_version`, any custom key) and resetting each bundle's version, tag and release targets. The reset hit *every* registered project on the machine, not just the one being named: a bystander project got no rebuild at all and was left with a permanently empty `bundles` block that fails its next boot. The manifest is now the authority declared bundles are preserved untouched, bundles found on disk but missing from the manifest are still registered additively on import, and a declared bundle whose directory is absent is reported with a warning rather than auto-pruned. A related path bug is fixed with it: the rescan built a wrong `settings.json` path for every bundle after the first, so only the first bundle's settings could ever be found.
85
- - **Fixedregistration no longer adopts invalid protocol/scheme declarations, nor reads other projects' bundles.** `project:add`/`project:import` adopted whatever `server.protocol` or `server.scheme` a bundle declared straight into the project's registry lists, unchecked an arbitrary string became a registered "valid" value, persisted, and `gina image:build` then baked the polluted list into the synthesized image's environment. The same pass also resolved *every* registered project's bundles against the path of the project being added, so when two projects each had a bundle of the same name, one project's declarations leaked into the other's registry entry from a command that never named it. The framework's supported sets are now the authority, a project's lists stay a subset of them, an unsupported value is reported by name and adopted nowhere, and each project's bundles are resolved against that project's own path.
86
- - **Fixed — `project:add` writes the project's `.gitignore`.** The framework has always shipped a `core/template/_gitignore` whose underscore prefix implies a rename at scaffold time, but nothing performed that rename — so the template had zero consumers and every scaffolded project came out with no `.gitignore` at all, leaving the secret-file globs it carries protecting nothing. The copy is skip-if-exists, so your own file is never replaced or appended to, and re-running the command changes nothing.
87
- - **Fixed — a failed file copy can no longer destroy the destination it was replacing.** The path helper's copier — the byte-writer behind `_().cp()` and `PathObject.mv()`, which CLI copy, build and rename paths all ride — wrote directly to the final name and unlinked an existing destination *before* the copy started. Bytes now stage to a temp sibling and publish with an atomic rename, so a reader never observes a partial file and the destination is replaced only on success. A source-side read error is handled instead of killing the process, a failed copy settles its callback exactly once, and failures propagate a real `Error` rather than a plain string. **Contract note:** code matching the exact former failure string now receives an `Error` instead.
88
- - **Fixed — the environment beats the secrets file again, and three malformed `secrets.file` shapes are caught.** The two environment tiers were joined with `||`, and the CLI stores swept `GINA_*`/`VENDOR_*`/`USER_*` values as real booleans — so a key whose swept value was boolean `true` satisfied the short-circuit, `process.env` was never consulted, and the file tier won over a perfectly good environment variable, letting a stale plaintext file shadow a platform-injected credential. The tiers are now read independently. **Action required if you use the file tier:** a whitespace-only entry and a path containing an empty segment (`//`) now refuse to boot rather than failing as a suppressed debug line. The empty segment is worth a look — it is what a `${...}` token that resolved to nothing leaves behind, but a token carrying a *trailing slash* produces the same shape and resolves to exactly the intended file, so a config that worked before will now refuse; removing the doubled separator resolves it.
89
- - **Fixed — a bundle whose release tree cannot be linked says which bundle, and why.** The config loader built a useful error carrying the offending path, but the receiving callback never inspected it and dereferenced the absent configuration object instead — so the reason was discarded and the process died on an opaque `TypeError`. Because the configuration load is shared across the project, one bundle's missing release tree took down every bundle in it. The error is now reported through the same sink the bundle-configuration loader already used, naming the bundle, env and scope.
90
- - **Fixed — `self.push()` refuses by name when there is no engine.io channel.** The push channel is an isaac-engine facility, so on the Express engine the client lookup dereferenced an absent `eio` and surfaced as an opaque 500 that named neither push nor the missing channel. It now warns, hands a supplied callback a `PUSH_CHANNEL_NOT_CONFIGURED` error, and sends nothing — without failing the request, so a notification side-channel no longer takes down the response it rode in on. This is also the first time `push()` honours the `callback(err, result)` contract its documentation always described.
91
- - **Fixed — the port-setup merge read the wrong list.** The pass that folds newly seen protocols and schemes into a project's registry lists indexed the project's own list by the contextual list's position, so once the contextual list outgrew it the overshoot read `undefined`. No user-visible consequence was demonstrated, so this ships as a correctness fix.
73
+ **This release adds maintenance mode and closes a cross-site request forgery hole
74
+ in the admin endpoints.** It also makes boot-time bundle mounts safe when several
75
+ processes share one project treereplicas over a POSIX network filesystem, or
76
+ containers bind-mounting a single checkout. **Two behaviour changes to check
77
+ before you upgrade** a real directory sitting at a bundle's mount path is now
78
+ refused loudly instead of being silently deleted, and cross-origin writes to the
79
+ `/_gina/*` control endpoints are now refused. Both are covered in the
80
+ [migration guide](https://gina.io/docs/migration).
81
+
82
+ - **Added — maintenance mode.** A bundle can now be closed to the public without being stopped, via `settings.json > server.maintenance`. While a window is open every request except the framework's own `/_gina/*` endpoints is answered `503` with a `Retry-After` header and `Cache-Control: no-store`, carrying a self-contained page for a browser navigation and the standard JSON body for XHR, SPA-fragment and JSON callers. The gate runs on **both engines**, placed ahead of static assets, both output-cache serve points and routing — so unlike a route middleware, which only runs once a route has matched, it also covers static files and URLs that match no route at all. The liveness endpoint deliberately keeps answering `200`, so an orchestrator does not restart healthy instances over a declared window, and the toggle itself stays reachable so you are never stranded outside your own off switch. Chosen visitors can still browse: a shared bypass key works as a header, or once in the address bar which then sets a short-lived cookie and redirects without the secret under any deployment; the supplementary IP allowlist applies only to requests that did not arrive through a reverse proxy, since behind one every address is the proxy's. Maintenance can also be flipped at runtime through an admin-gated endpoint with an optional expiry; a runtime flip is not persisted, and a lapsed expiry reverts to your *configuration* rather than to "off", so a forgotten timer cannot re-open a site that configuration says is closed.
83
+ - **Securitycross-origin writes to admin `/_gina/*` endpoints are refused (#B384).** Present in every release up to and including `0.6.9`. These endpoints authorise callers by IP allowlist alone (`app.json` `admin.allowFrom`, loopback by default), and a browser attaches that ambient credential automatically — so an operator browsing from an allowlisted machine could be lured to a page that silently issued writes to `/_gina/storage/gc`, `/_gina/cache/clear`, `/_gina/release/rebuild` or `/_gina/maintenance`. The first three read their entire input from the query string and never read a body, so the attack needed no JavaScript and no CORS involvement at all: a plain auto-submitting form was enough. Such a write is now refused with `403` on both engines, using `Sec-Fetch-Site` where the browser sends it and comparing `Origin` against the connected authority otherwise — never against a forwarded header. **Two things are deliberately unaffected:** requests carrying no browser origin signal (`curl`, the gina CLI, deploy scripts) still work, so operator tooling is unchanged; and safe methods are untouched, so cross-origin `GET`/SSE channels keep working. No configuration change is required.
84
+ - **Fixed — boot-time bundle mounts are idempotent, atomic and concurrency-safe.** Every boot re-created every declared bundle's mount symlink in two non-atomic steps — unlink, then create — with no mutual exclusion anywhere in the framework, and the config loader did it for *every* declared bundle on *every* load. With a single process that is invisible. With several processes booting one shared project tree it is a race on the same directory entries: the mount name genuinely disappears between the two steps, so a boot could fail outright on a contended create, and because the configuration load is shared, one contended link could abort it for every bundle in the project. Mounting is now idempotent and atomic. A link that already resolves to its intended source is left completely alone — the steady-state boot writes nothing at all, which is what removes the contention rather than merely surviving it. A wrong or missing link is published atomically through a temporary sibling and a rename, so the name is never absent and two processes cannot collide. And a process that loses the race to another one publishing the *identical* link now treats that as success instead of refusing to boot. Genuine failures are still loud: a release whose source has vanished, or a real directory occupying the mount path, refuse by name. The same class of race is closed on the directory creation that accompanies a mount. **Contract note:** a real directory at a bundle's mount path used to be deleted and replaced with the link during config load, and now refuses the boot instead if you hit that, remove or relocate the directory.
85
+ - **Docsthe guidance on addressing an out-of-request push is corrected.** `0.6.9` introduced `gina.pushToSession()` and warned against sourcing its recipient from the browser. That warning was written broadly enough to read as forbidding a **server-minted, integrity-protected token** that names the recipient which is in fact the sanctioned shape, and the one the authenticated-hop pattern already relied on. The prohibition is now scoped to what it always meant: a *bare* recipient id in a client-writable field. The sanctioned shape is documented with the conditions that make it safe verify the token and derive the recipient only from its verified claims, fail closed when it is absent or unverifiable, and keep it short-lived, since targeting integrity is not replay immunity.
92
86
 
93
87
  ## Documentation
94
88
 
package/ROADMAP.md CHANGED
@@ -60,6 +60,7 @@ This roadmap covers planned features, architectural improvements, new connectors
60
60
  | **Q4 2026** | `0.6.6` ✅ | **Fixed**: the logging-transport release. A slow boot no longer silences a bundle's logging for the life of the process — a two-second connect deadline added in `0.6.5` read a socket flag Node clears one event-loop phase later, so any boot that blocked the loop past it destroyed a connection the kernel had already established (every container start and network-filesystem mount was exposed, and the transport never redialled). The MQ and file log transports also stopped dialling `host_v4`, which on a `~/.gina` shared across hosts silently shipped every log line off-host while all connection lines read healthy. Plus: the popin `success` event fires again instead of raising a 422 carrying the successful response body; a link request belongs to the anchor you clicked rather than the first anchor sharing its url; and constructing the link handler twice no longer corrupts the first instance · **Added**: the log transport reconnects — exponential backoff to a 30-second ceiling, one report per outage, frames dropped rather than queued while down so an outage cannot grow memory |
61
61
  | **Q4 2026** | `0.6.7` ✅ | **Added**: the object-storage release — a `storage` block declares named drivers (an adapter crossed with a strategy) reachable as `gina.storage()`, publishing objects atomically under opaque keys with their metadata written through a pluggable store seam; a content-addressed `cas` strategy deduplicates identical bytes behind a reference count, reclaiming them only after a grace-gated sweep; size tiering keeps sub-`64KB` objects inline in the metadata store, measurably faster than per-file writes; `storage:stats` / `storage:gc` / `storage:verify` operate a bundle's drivers whether it is running or stopped, through always-on admin-gated endpoints; and an upload group can route its `self.store()` step straight into a driver · **Security**: bound query parameter values no longer reach dev consoles or the Inspector query log — count and type markers replace them, with `inspector.queries.captureValues` to opt back in · **Fixed**: the `is` rule compiles regex literals as authored instead of stripping their parentheses (stricter — review patterns containing parens), forms with an async `query` rule complete correctly across a cluster of interacting defects (a submit leaving before the verdict landed, a completion carrying only the query field's slice, a re-click clearing later fields' errors, a clean form whose query field was not declared last never submitting at all, replayed submits from stale listeners, and an id-less trigger bound twice), `getConfig().settings` resolves path placeholders, `req.files[].group` reports the resolved group instead of `undefined`, and the Inspector's Data and Forms tabs stop putting framework-internal keys and the bundle catalog above your own data · **Changed**: framework default looks ship inside a `@layer gina` cascade layer, so any un-layered project rule overrides them without `!important` |
62
62
  | **Q4 2026** | `0.6.8` ✅ | **Security**: `self.push()` decides its recipient server-side instead of reading it from the request, where a supplied session id aimed the push at any session and an absent one broadcast to every connected client (ACTION REQUIRED — a bare worker push over an HTTP hop that carried the recipient IN THE REQUEST stops delivering; where the hop is authenticated the controller can pass `{ sessionID }` explicitly and keep working, and a worker with no request context at all polls `GET /_gina/jobs/:id`) · forwarded headers (`X-Forwarded-Host`, `-Proto`, `-Prefix` and the request's own `Host`) are validated where they are read, closing a reflected-XSS path that spliced them unescaped into the client bootstrap script emitted on every rendered page · **Added**: storage metadata can live on Couchbase, which is what makes a driver root shareable across bundles and replicas; a `stream` strategy for large sequential media brings resumable, out-of-order, restart-surviving uploads whose finalise verifies coverage as an interval union and refuses to publish a gap; HTTP Range serving through `self.serveFromStorage()` on both engines, with conditional GET and a fail-closed content-type downgrade; the `s3` adapter completes the pluggable object-storage layer, storeless by design and able to offload GET/HEAD to a presigned URL; `getRange()` on every local strategy; machine-readable `err.code` on storage read verbs; and the Couchbase soak probes ship in the package · **Changed**: `renderStream()` is byte-serving-capable — `Buffer` chunks pass through verbatim on non-SSE content types (binary payloads previously arrived corrupted), HEAD answers headers-only without consuming the iterable, and caller-set headers are no longer clobbered · **Fixed**: `renderStream()` honours a caller-set status on both engines and stops throwing a swallowed error at the end of every streamed response, a redirect treats `HEAD` as the safe method it is and keeps the caller's query string under `keep-params: true`, and a local storage driver reclaims the temp files left behind by a crashed or refused `put()` |
63
+ | **Q4 2026** | `0.6.10` ✅ | **Added**: maintenance mode — a bundle can be closed to the public without being stopped. When it is active every request except the framework's own built-in endpoints is answered `503` with a `Retry-After` header and a self-contained maintenance page, and the response is marked never to be stored so a cached copy cannot outlive the window. The gate runs on both engines ahead of static assets, the output cache and routing, so it also covers files and URLs that a route middleware never sees. The liveness endpoint deliberately keeps answering normally, so an orchestrator does not restart healthy instances over a declared window. Chosen visitors can still browse: a shared bypass key presented as a header or once in the address bar (which then sets a short-lived cookie and redirects without the secret) works under any deployment, while the supplementary IP allowlist applies only to requests that did not arrive through a reverse proxy — behind one, every address is the proxy's, so an unconditioned list would let either everybody or nobody through. Maintenance can be flipped at runtime through an administrator-gated endpoint with an optional expiry; a runtime flip is not persisted, and an expiry reverts to the configured state rather than to off, so a forgotten timer cannot re-open a site that configuration says is closed. **Fixed**: boot-time bundle mounts are idempotent, atomic and concurrency-safe — a mount symlink that already resolves to its source is left untouched (so the steady-state boot writes nothing), a wrong or missing one is published atomically through a temp sibling and a rename, and a process that loses the race to another publishing the identical link treats that as success instead of refusing to boot. Previously every boot re-created every declared bundle's link in two non-atomic steps with no mutual exclusion, so several processes sharing one project tree raced the same directory entries and a contended link could fail a boot or abort the shared configuration load for every bundle in the project. The same race is closed on the directory creation that accompanies a mount. Behaviour change: a real directory occupying a mount path is now refused by name instead of silently deleted. **Security**: cross-origin writes to the administrator-gated built-in endpoints are refused. Those endpoints authorise callers by network address alone — a credential a browser attaches automatically — so an operator browsing from an allowed machine could be lured to a page that silently issued writes to them; and because several of them read their whole input from the address rather than from a request body, the attack needed no scripting and no cross-origin negotiation at all. Such a write is now refused on both engines, using the browser's own request-context signal where it is sent, and otherwise comparing the stated origin against the address the client actually connected to — never against a forwarded header, which an attacker controls. Clients that send no browser origin signal, such as command-line tooling and deployment scripts, are deliberately unaffected, as are safe methods, so existing cross-origin read channels keep working. | `0.6.10` | 2026-08-16 |
63
64
  | **Q4 2026** | `0.6.9` ✅ | **Security**: an engine.io socket's session identity is derived server-side from the upgrade request's own cookie instead of a field the browser asserts on every message — any client could previously claim another user's session and receive the pushes addressed to it, which took strictly less than stealing the cookie, since a rendered page carries the bare session id while the cookie carries the signed form; the binding replays the bundle's own session middleware (same secret, store and cookie name, no new configuration) and fails closed, so an id-less socket receives only deliberate broadcasts · **Added**: `gina.pushToSession()` gives code with no request context — a job handler, a cron tick, a boot hook — a sanctioned route to a user's socket, with a required recipient, no reachable broadcast, and delivery reported rather than assumed; and a bundle can declare which scopes it is deployed in through a `scopes` allow-list on its manifest entry, so one still under development stays out of every other scope · **Fixed**: `engine: "express"` bundles boot and serve on Express 5, with the supported range declared for the first time (`>= 4 < 6`, both majors verified live) · `project:add`/`project:import` no longer empty a project's `bundles` block on a declared-count mismatch, no longer adopt a bundle's invalid `server.protocol`/`server.scheme` into the project's registry lists, and no longer resolve one project's bundles against another project's path · `project:add` writes the `.gitignore` the shipped template's underscore prefix has always implied · the path helper's copier stages to a temp sibling and publishes with an atomic rename, so a failed copy can no longer destroy the destination it was replacing · the secrets resolver reads its two environment tiers independently, so a swept boolean no longer lets a plaintext file shadow `process.env`, and three malformed `settings.secrets.file` shapes that used to pass in silence are caught (ACTION REQUIRED — two of them now refuse to boot) · a bundle whose release tree cannot be linked refuses by name instead of dying as an opaque TypeError · `self.push()` refuses by name when the server instance has no engine.io channel |
64
65
  | **Q1 2027** | `0.6.x` | HTTP/2 priorities (blocked on Node scheduler hooks) · Beemaster admin + visual translation editor |
65
66
  | **2027** | `0.7.0` | Performance — remaining measure-gated candidates: multipart & WebSocket fast paths, render/log cleanups, SIMD scanner (the render-path deep-clone & id-mint reduction shipped early in `0.6.2` with a measured 4.4× render-throughput gain; the profiling baseline itself also shipped in `0.6.2`) |
@@ -0,0 +1 @@
1
+ 0.6.10
@@ -844,20 +844,28 @@ function Config(opt, contextResetNeeded) {
844
844
 
845
845
  appPath = _(root +'/'+ pkg[app].link, true);
846
846
  console.debug('[CONFIG] Checking appPath [ '+ appPath +' ] ');
847
- // cleanup symlinks
848
- let targetAppPathObj = new _(appPath, true);
849
- if ( targetAppPathObj.existsSync() ) {
850
- targetAppPathObj.rmSync()
851
- }
847
+ // #B381 — this loop runs for EVERY declared bundle on EVERY config
848
+ // load, and it used to unlink-then-recreate each bundle's link in
849
+ // two non-atomic steps: with N processes sharing one project tree
850
+ // that is N×M unserialised rewrites of the same names, and a lost
851
+ // race aborted the whole shared config load. ensureSymlinkSync()
852
+ // keeps a correct link untouched — the steady-state load now
853
+ // writes nothing — and publishes a wrong/missing one atomically.
854
+ // was:
855
+ // let targetAppPathObj = new _(appPath, true);
856
+ // if ( targetAppPathObj.existsSync() ) {
857
+ // targetAppPathObj.rmSync()
858
+ // }
859
+ let targetAppPathObj = null;
852
860
  try {
853
861
  if (envIsDev) {
854
862
  targetAppPathObj = new _(root +'/'+ pkg[app].src, true);
855
863
  console.debug('[CONFIG][env:'+env+'][envIsDev:'+ envIsDev +'] Linking ['+ targetAppPathObj.toString() +'] to [ '+ appPath +' ] ');
856
- targetAppPathObj.symlinkSync(appPath);
864
+ targetAppPathObj.ensureSymlinkSync(appPath);
857
865
  } else {
858
866
  targetAppPathObj = new _(root +'/'+ pkg[app].releases[scope][env].target, true);
859
867
  console.debug('[CONFIG][env'+env+'][envIsDev:'+ envIsDev +'] Linking ['+ targetAppPathObj.toString() +'] to [ '+ appPath +' ] ');
860
- targetAppPathObj.symlinkSync(appPath);
868
+ targetAppPathObj.ensureSymlinkSync(appPath);
861
869
  }
862
870
  } catch (releaseError) {
863
871
  console.error('[ releaseError ] ', releaseError);
@@ -598,7 +598,12 @@ var isBundleMounted = function(projects, bundlesPath, bundle, cb) {
598
598
 
599
599
  console.debug('Is `'+ bundle +'` mounted ?', isMounted);
600
600
  if (!gna.started && isMounted) {
601
- new _( project.path +'/'+ manifest.bundles[bundle].link ).rmSync();
601
+ // #B381 no pre-unlink here: removing the mount before re-creating it
602
+ // left a window where a sibling process booting the same project tree
603
+ // observed a missing link. gna.mount() is idempotent now (it keeps a
604
+ // correct link as-is and atomically replaces a wrong one), so forcing
605
+ // the mount call is enough.
606
+ // was: new _( project.path +'/'+ manifest.bundles[bundle].link ).rmSync();
602
607
  isMounted = false;
603
608
  }
604
609
  if (!isMounted) {
@@ -711,6 +716,11 @@ gna.getProjectConfiguration = function (callback){
711
716
  /**
712
717
  * Mounts a bundle release directory into the project's bundles/ directory
713
718
  * by creating required folders (bundles, tmp, cache) and symlinking the source.
719
+ * Idempotent and concurrency-safe (#B381): a link that already resolves to the
720
+ * source is kept untouched, a wrong or missing one is published atomically,
721
+ * and a concurrent identical creator is treated as success — so several
722
+ * processes may boot one shared project tree without racing each other's
723
+ * mounts.
714
724
  * When `type` is omitted it defaults to `'dir'`.
715
725
  *
716
726
  * Also exposed as `process.mount`.
@@ -731,28 +741,21 @@ gna.mount = process.mount = function(bundlesPath, source, target, type, callback
731
741
 
732
742
  //creating folders.
733
743
  //use junction when using Win XP os.release == '5.1.2600'
744
+ // #B381 — create-if-missing WITHOUT the exists/mkdir two-step: two
745
+ // processes booting the same project tree raced the check-then-create,
746
+ // and the loser threw EEXIST out of the mount, uncaught. `recursive: true`
747
+ // never throws on an existing directory, so the race disappears.
734
748
  var mountingPath = getPath('project') + '/bundles';
735
749
  console.debug('mounting path: ', mountingPath);
736
- if ( !fs.existsSync(mountingPath) ) {
737
- new _(mountingPath).mkdirSync();
738
- }
750
+ fs.mkdirSync(mountingPath, { recursive: true });
739
751
  // /tmp
740
752
  var tmpPath = getPath('project') + '/tmp';
741
753
  console.debug('tmp path: ', tmpPath);
742
- var tmpPathObj = new _(tmpPath);
743
- if ( !tmpPathObj.existsSync() ) {
744
- tmpPathObj.mkdirSync();
745
- }
746
- tmpPathObj = null;
747
-
754
+ fs.mkdirSync(tmpPath, { recursive: true });
748
755
  // cache
749
756
  var cachePath = getPath('project') + '/cache';
750
757
  console.debug('cache path: ', cachePath);
751
- var cachePathObj = new _(cachePath);
752
- if ( !cachePathObj.existsSync() ) {
753
- cachePathObj.mkdirSync();
754
- }
755
- cachePathObj = null;
758
+ fs.mkdirSync(cachePath, { recursive: true });
756
759
 
757
760
  var sourceObj = new _(source);
758
761
  var targetObj = new _(target);
@@ -762,14 +765,20 @@ gna.mount = process.mount = function(bundlesPath, source, target, type, callback
762
765
  ;
763
766
  console.debug('[ FRAMEWORK ][ MOUNT ] Source: ', source);
764
767
  console.debug('[ FRAMEWORK ][ MOUNT ] Checking before mounting ', target, isTargetFound, bundlesPath);
765
- if ( isTargetFound ) {
766
- try {
767
- console.debug('[ FRAMEWORK ][ MOUNT ] removing old build ', target);
768
- fs.unlinkSync(target)
769
- } catch (err) {
770
- callback(err)
771
- }
772
- }
768
+ // #B381 the early unlink is gone: it opened the absent-name window at
769
+ // the TOP of the mount (spanning the whole createPathSync walk below), and
770
+ // its catch called callback(err) WITHOUT returning, so a lost race (a
771
+ // sibling removing the link first) aborted the boot AND fell through into
772
+ // a second callback. ensureSymlinkSync() below replaces atomically instead.
773
+ // was:
774
+ // if ( isTargetFound ) {
775
+ // try {
776
+ // console.debug('[ FRAMEWORK ][ MOUNT ] removing old build ', target);
777
+ // fs.unlinkSync(target)
778
+ // } catch (err) {
779
+ // callback(err)
780
+ // }
781
+ // }
773
782
 
774
783
  // hack to test none-dev env without building: in case you did not build your bundle, but you have the src available
775
784
  if (!isSourceFound && !isDev) {
@@ -792,21 +801,24 @@ gna.mount = process.mount = function(bundlesPath, source, target, type, callback
792
801
  }
793
802
 
794
803
  if ( isSourceFound ) {
795
- //will override existing each time you restart.
804
+ // #B381 was: unlink-then-recreate on every restart ("will override
805
+ // existing each time you restart"), two non-atomic steps during which
806
+ // the mount name did not exist. Under two processes booting one shared
807
+ // project tree that window produced collisions on the contended names
808
+ // and killed the boot below. ensureSymlinkSync() keeps a correct link
809
+ // untouched, publishes a new one atomically (temp sibling + rename),
810
+ // and treats a concurrent identical creator as success.
796
811
  gna.lib.generator.createPathSync(bundlesPath, function onPathCreated(err){
797
812
  if (!err) {
798
813
  try {
799
- // var targetObj = new _(target);
800
- if ( targetObj.existsSync() ) {
801
- targetObj.rmSync();
802
- }
814
+ // was:
815
+ // if ( targetObj.existsSync() ) {
816
+ // targetObj.rmSync();
817
+ // }
803
818
  console.debug('[ FRAMEWORK ][ MOUNT ] Linking ['+ source +'] to [ '+ target +' ] ');
804
- if ( type != undefined) {
805
- fs.symlinkSync(source, target, type)
806
- } else {
807
- fs.symlinkSync(source, target);
808
- }
809
- // symlink created
819
+ new _(source).ensureSymlinkSync(target, type);
820
+ // symlink created (or kept / atomically replaced / adopted
821
+ // from a concurrent boot of the same tree)
810
822
  callback(false);
811
823
 
812
824
  } catch (err) {
@@ -817,17 +829,22 @@ gna.mount = process.mount = function(bundlesPath, source, target, type, callback
817
829
  try { fs.writeSync(2, _mountMsg + '\n'); } catch (_e) { /* best-effort */ }
818
830
  process.exit(1)
819
831
  }
820
- if ( fs.existsSync(target) ) {
821
- var stats = fs.lstatSync(target);
822
- if ( stats.isDirectory() ) {
823
- var d = new _(target).rm( function(err){
824
- callback(err);
825
- })
826
- } else {
827
- fs.unlinkSync(target);
828
- callback(err)
829
- }
830
- }
832
+ // #B381 the recovery below was structurally unreachable
833
+ // (the `if (err)` above always fires inside a catch, so the
834
+ // exit is unconditional); the tolerance it intended now
835
+ // lives in ensureSymlinkSync()'s verify-then-accept path.
836
+ // was:
837
+ // if ( fs.existsSync(target) ) {
838
+ // var stats = fs.lstatSync(target);
839
+ // if ( stats.isDirectory() ) {
840
+ // var d = new _(target).rm( function(err){
841
+ // callback(err);
842
+ // })
843
+ // } else {
844
+ // fs.unlinkSync(target);
845
+ // callback(err)
846
+ // }
847
+ // }
831
848
  }
832
849
  } else {
833
850
  console.error(err);
@@ -1762,6 +1779,29 @@ isBundleMounted(projects, bundlesPath, getContext('bundle'), function onBundleMo
1762
1779
  console.warn('[transient-errors] config validation skipped: ' + (teErr.message || teErr));
1763
1780
  }
1764
1781
 
1782
+ // #MAINT1 — `server.maintenance` boot-time shape check
1783
+ // (warn-only, NEVER fatal, exactly as #CE1 above: the
1784
+ // opt-in governs how a request RENDERS, so a bad value
1785
+ // must not refuse a boot). The engine-side reader
1786
+ // (lib.maintenance.resolveConf, boot-resolved in
1787
+ // core/server.js) independently falls back to the same
1788
+ // defaults per key — this lint exists so that fallback
1789
+ // is never SILENT. Per-key, not all-or-nothing: a bad
1790
+ // retryAfter must not disable the whole feature and
1791
+ // leave an operator believing the site is closed.
1792
+ try {
1793
+ var _mtBlock = null;
1794
+ try {
1795
+ _mtBlock = config.getInstance()[gna.core.startingApp][env].server.maintenance;
1796
+ } catch (mtConfErr) { _mtBlock = null; }
1797
+ var _mtWarnings = lib.maintenance.lintConf(_mtBlock);
1798
+ for (var _mtW = 0; _mtW < _mtWarnings.length; ++_mtW) {
1799
+ console.warn('[maintenance] ' + _mtWarnings[_mtW]);
1800
+ }
1801
+ } catch (mtErr) {
1802
+ console.warn('[maintenance] config validation skipped: ' + (mtErr.message || mtErr));
1803
+ }
1804
+
1765
1805
  // setting default global middlewares
1766
1806
  if ( typeof(instance.use) == 'function' ) {
1767
1807