gina 0.6.25 → 0.6.26

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 (604) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +16 -19
  3. package/ROADMAP.md +1 -0
  4. package/framework/v0.6.26/VERSION +1 -0
  5. package/framework/{v0.6.25 → v0.6.26}/core/controller/controller.js +51 -6
  6. package/framework/{v0.6.25 → v0.6.26}/core/gna.js +1 -0
  7. package/framework/{v0.6.25 → v0.6.26}/core/server.js +136 -0
  8. package/framework/{v0.6.25 → v0.6.26}/lib/job/src/main.js +159 -6
  9. package/framework/{v0.6.25 → v0.6.26}/package.json +1 -1
  10. package/gna.js +4 -4
  11. package/llms.txt +3 -3
  12. package/package.json +3 -3
  13. package/schema/app.json +51 -0
  14. package/schema/settings.json +1 -1
  15. package/framework/v0.6.25/VERSION +0 -1
  16. /package/framework/{v0.6.25 → v0.6.26}/AUTHORS +0 -0
  17. /package/framework/{v0.6.25 → v0.6.26}/LICENSE +0 -0
  18. /package/framework/{v0.6.25 → v0.6.26}/core/asset/html/nolayout.html +0 -0
  19. /package/framework/{v0.6.25 → v0.6.26}/core/asset/html/static.html +0 -0
  20. /package/framework/{v0.6.25 → v0.6.26}/core/asset/img/android-chrome-192x192.png +0 -0
  21. /package/framework/{v0.6.25 → v0.6.26}/core/asset/img/android-chrome-512x512.png +0 -0
  22. /package/framework/{v0.6.25 → v0.6.26}/core/asset/img/apple-touch-icon.png +0 -0
  23. /package/framework/{v0.6.25 → v0.6.26}/core/asset/img/favicon-16x16.png +0 -0
  24. /package/framework/{v0.6.25 → v0.6.26}/core/asset/img/favicon-32x32.png +0 -0
  25. /package/framework/{v0.6.25 → v0.6.26}/core/asset/img/favicon.ico +0 -0
  26. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/README.md +0 -0
  27. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  28. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  29. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  30. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  31. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  32. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  33. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  34. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  35. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  36. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  37. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  38. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  39. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  40. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  41. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/js/gina.js +0 -0
  42. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -0
  43. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  44. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  45. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  46. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  47. /package/framework/{v0.6.25 → v0.6.26}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  48. /package/framework/{v0.6.25 → v0.6.26}/core/config.js +0 -0
  49. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/ai/index.js +0 -0
  50. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/ai/lib/connector.js +0 -0
  51. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/couchbase/index.js +0 -0
  52. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/couchbase/lib/connector.js +0 -0
  53. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  54. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  55. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/couchbase/lib/n1ql.js +0 -0
  56. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/couchbase/lib/session-store.js +0 -0
  57. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  58. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  59. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/couchbase/lib/storage-store.js +0 -0
  60. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/duckdb/index.js +0 -0
  61. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/duckdb/lib/connector.js +0 -0
  62. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/mongodb/index.js +0 -0
  63. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/mongodb/lib/connector.js +0 -0
  64. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/mongodb/lib/job-store.js +0 -0
  65. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
  66. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/mongodb/lib/session-store.js +0 -0
  67. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/mysql/index.js +0 -0
  68. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/mysql/lib/connector.js +0 -0
  69. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/param-redact.js +0 -0
  70. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/postgresql/index.js +0 -0
  71. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/postgresql/lib/connector.js +0 -0
  72. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/redis/index.js +0 -0
  73. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/redis/lib/connector.js +0 -0
  74. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/redis/lib/job-store.js +0 -0
  75. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/redis/lib/kv-store.js +0 -0
  76. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/redis/lib/render-cache-store.js +0 -0
  77. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/redis/lib/session-store.js +0 -0
  78. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/scylladb/index.js +0 -0
  79. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/scylladb/lib/connector.js +0 -0
  80. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/scylladb/lib/session-store.js +0 -0
  81. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/settle-once.js +0 -0
  82. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/sql-parser.js +0 -0
  83. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/sqlite/index.js +0 -0
  84. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/sqlite/lib/connector.js +0 -0
  85. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/sqlite/lib/job-store.js +0 -0
  86. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/sqlite/lib/kv-store.js +0 -0
  87. /package/framework/{v0.6.25 → v0.6.26}/core/connectors/sqlite/lib/session-store.js +0 -0
  88. /package/framework/{v0.6.25 → v0.6.26}/core/content.encoding +0 -0
  89. /package/framework/{v0.6.25 → v0.6.26}/core/controller/controller.framework.js +0 -0
  90. /package/framework/{v0.6.25 → v0.6.26}/core/controller/controller.render-json.js +0 -0
  91. /package/framework/{v0.6.25 → v0.6.26}/core/controller/controller.render-nunjucks-async.js +0 -0
  92. /package/framework/{v0.6.25 → v0.6.26}/core/controller/controller.render-nunjucks.js +0 -0
  93. /package/framework/{v0.6.25 → v0.6.26}/core/controller/controller.render-stream.js +0 -0
  94. /package/framework/{v0.6.25 → v0.6.26}/core/controller/controller.render-swig-async.js +0 -0
  95. /package/framework/{v0.6.25 → v0.6.26}/core/controller/controller.render-swig.js +0 -0
  96. /package/framework/{v0.6.25 → v0.6.26}/core/controller/controller.render-v1.js +0 -0
  97. /package/framework/{v0.6.25 → v0.6.26}/core/controller/controller.render-xml.js +0 -0
  98. /package/framework/{v0.6.25 → v0.6.26}/core/controller/index.js +0 -0
  99. /package/framework/{v0.6.25 → v0.6.26}/core/controller/inline-script.js +0 -0
  100. /package/framework/{v0.6.25 → v0.6.26}/core/controller/inspector-window-emit.js +0 -0
  101. /package/framework/{v0.6.25 → v0.6.26}/core/controller/release-banner.js +0 -0
  102. /package/framework/{v0.6.25 → v0.6.26}/core/dev/index.js +0 -0
  103. /package/framework/{v0.6.25 → v0.6.26}/core/dev/lib/class.js +0 -0
  104. /package/framework/{v0.6.25 → v0.6.26}/core/dev/lib/factory.js +0 -0
  105. /package/framework/{v0.6.25 → v0.6.26}/core/dev/lib/tools.js +0 -0
  106. /package/framework/{v0.6.25 → v0.6.26}/core/locales/README.md +0 -0
  107. /package/framework/{v0.6.25 → v0.6.26}/core/locales/currency.json +0 -0
  108. /package/framework/{v0.6.25 → v0.6.26}/core/locales/dist/language/en.json +0 -0
  109. /package/framework/{v0.6.25 → v0.6.26}/core/locales/dist/language/fr.json +0 -0
  110. /package/framework/{v0.6.25 → v0.6.26}/core/locales/dist/region/en.json +0 -0
  111. /package/framework/{v0.6.25 → v0.6.26}/core/locales/dist/region/fr.json +0 -0
  112. /package/framework/{v0.6.25 → v0.6.26}/core/locales/index.js +0 -0
  113. /package/framework/{v0.6.25 → v0.6.26}/core/mime.types +0 -0
  114. /package/framework/{v0.6.25 → v0.6.26}/core/model/entity.js +0 -0
  115. /package/framework/{v0.6.25 → v0.6.26}/core/model/index.js +0 -0
  116. /package/framework/{v0.6.25 → v0.6.26}/core/model/template/entityFactory.js +0 -0
  117. /package/framework/{v0.6.25 → v0.6.26}/core/model/template/index.js +0 -0
  118. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/README.md +0 -0
  119. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/index.js +0 -0
  120. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/csrf/README.md +0 -0
  121. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/csrf/package.json +0 -0
  122. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/csrf/src/main.js +0 -0
  123. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/README.md +0 -0
  124. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/coep/README.md +0 -0
  125. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/coep/package.json +0 -0
  126. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
  127. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/coop/README.md +0 -0
  128. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/coop/package.json +0 -0
  129. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
  130. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/corp/README.md +0 -0
  131. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/corp/package.json +0 -0
  132. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
  133. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/csp/README.md +0 -0
  134. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/csp/package.json +0 -0
  135. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
  136. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
  137. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
  138. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
  139. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/hsts/README.md +0 -0
  140. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/hsts/package.json +0 -0
  141. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
  142. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
  143. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
  144. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
  145. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/package.json +0 -0
  146. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
  147. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
  148. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
  149. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/src/main.js +0 -0
  150. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
  151. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
  152. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
  153. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
  154. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
  155. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
  156. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
  157. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
  158. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
  159. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
  160. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
  161. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
  162. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
  163. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
  164. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
  165. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
  166. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
  167. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
  168. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/session/README.md +0 -0
  169. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/session/package.json +0 -0
  170. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/session/src/main.js +0 -0
  171. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/storage/README.md +0 -0
  172. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/storage/build.json +0 -0
  173. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/storage/package.json +0 -0
  174. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/storage/src/main.js +0 -0
  175. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/validator/README.md +0 -0
  176. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/validator/build.json +0 -0
  177. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/validator/package.json +0 -0
  178. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/validator/src/form-validator.js +0 -0
  179. /package/framework/{v0.6.25 → v0.6.26}/core/plugins/lib/validator/src/main.js +0 -0
  180. /package/framework/{v0.6.25 → v0.6.26}/core/router.js +0 -0
  181. /package/framework/{v0.6.25 → v0.6.26}/core/server.express.js +0 -0
  182. /package/framework/{v0.6.25 → v0.6.26}/core/server.isaac.js +0 -0
  183. /package/framework/{v0.6.25 → v0.6.26}/core/status.codes +0 -0
  184. /package/framework/{v0.6.25 → v0.6.26}/core/template/_gitignore +0 -0
  185. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle/config/app.json +0 -0
  186. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  187. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle/config/routing.json +0 -0
  188. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle/config/settings.json +0 -0
  189. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  190. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle/config/templates.json +0 -0
  191. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  192. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  193. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  194. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  195. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle/index.js +0 -0
  196. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle/locales/en.json +0 -0
  197. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  198. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  199. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  200. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  201. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  202. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_public/js/components/x-checklist.js +0 -0
  203. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  204. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
  205. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_public/readme.md +0 -0
  206. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_public/sw.js +0 -0
  207. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  208. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  209. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  210. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  211. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_templates/html/includes/x-checklist.html +0 -0
  212. /package/framework/{v0.6.25 → v0.6.26}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  213. /package/framework/{v0.6.25 → v0.6.26}/core/template/command/gina.bat.tpl +0 -0
  214. /package/framework/{v0.6.25 → v0.6.26}/core/template/command/gina.tpl +0 -0
  215. /package/framework/{v0.6.25 → v0.6.26}/core/template/conf/env.json +0 -0
  216. /package/framework/{v0.6.25 → v0.6.26}/core/template/conf/manifest.json +0 -0
  217. /package/framework/{v0.6.25 → v0.6.26}/core/template/conf/package.json +0 -0
  218. /package/framework/{v0.6.25 → v0.6.26}/core/template/conf/settings.json +0 -0
  219. /package/framework/{v0.6.25 → v0.6.26}/core/template/conf/statics.json +0 -0
  220. /package/framework/{v0.6.25 → v0.6.26}/core/template/conf/templates.json +0 -0
  221. /package/framework/{v0.6.25 → v0.6.26}/core/template/error/client/json/401.json +0 -0
  222. /package/framework/{v0.6.25 → v0.6.26}/core/template/error/client/json/403.json +0 -0
  223. /package/framework/{v0.6.25 → v0.6.26}/core/template/error/client/json/404.json +0 -0
  224. /package/framework/{v0.6.25 → v0.6.26}/core/template/error/server/html/50x.html +0 -0
  225. /package/framework/{v0.6.25 → v0.6.26}/core/template/error/server/json/500.json +0 -0
  226. /package/framework/{v0.6.25 → v0.6.26}/core/template/error/server/json/503.json +0 -0
  227. /package/framework/{v0.6.25 → v0.6.26}/core/template/extensions/logger/config.json +0 -0
  228. /package/framework/{v0.6.25 → v0.6.26}/helpers/console.js +0 -0
  229. /package/framework/{v0.6.25 → v0.6.26}/helpers/context.js +0 -0
  230. /package/framework/{v0.6.25 → v0.6.26}/helpers/data/LICENSE +0 -0
  231. /package/framework/{v0.6.25 → v0.6.26}/helpers/data/README.md +0 -0
  232. /package/framework/{v0.6.25 → v0.6.26}/helpers/data/package.json +0 -0
  233. /package/framework/{v0.6.25 → v0.6.26}/helpers/data/src/main.js +0 -0
  234. /package/framework/{v0.6.25 → v0.6.26}/helpers/dateFormat.js +0 -0
  235. /package/framework/{v0.6.25 → v0.6.26}/helpers/index.js +0 -0
  236. /package/framework/{v0.6.25 → v0.6.26}/helpers/json/LICENSE +0 -0
  237. /package/framework/{v0.6.25 → v0.6.26}/helpers/json/README.md +0 -0
  238. /package/framework/{v0.6.25 → v0.6.26}/helpers/json/package.json +0 -0
  239. /package/framework/{v0.6.25 → v0.6.26}/helpers/json/src/main.js +0 -0
  240. /package/framework/{v0.6.25 → v0.6.26}/helpers/path.js +0 -0
  241. /package/framework/{v0.6.25 → v0.6.26}/helpers/plugins/README.md +0 -0
  242. /package/framework/{v0.6.25 → v0.6.26}/helpers/plugins/package.json +0 -0
  243. /package/framework/{v0.6.25 → v0.6.26}/helpers/plugins/src/api-error.js +0 -0
  244. /package/framework/{v0.6.25 → v0.6.26}/helpers/plugins/src/main.js +0 -0
  245. /package/framework/{v0.6.25 → v0.6.26}/helpers/prototypes.js +0 -0
  246. /package/framework/{v0.6.25 → v0.6.26}/helpers/task.js +0 -0
  247. /package/framework/{v0.6.25 → v0.6.26}/helpers/text.js +0 -0
  248. /package/framework/{v0.6.25 → v0.6.26}/lib/admin/package.json +0 -0
  249. /package/framework/{v0.6.25 → v0.6.26}/lib/admin/src/main.js +0 -0
  250. /package/framework/{v0.6.25 → v0.6.26}/lib/archiver/README.md +0 -0
  251. /package/framework/{v0.6.25 → v0.6.26}/lib/archiver/build.json +0 -0
  252. /package/framework/{v0.6.25 → v0.6.26}/lib/archiver/package.json +0 -0
  253. /package/framework/{v0.6.25 → v0.6.26}/lib/archiver/src/dep/jszip.min.js +0 -0
  254. /package/framework/{v0.6.25 → v0.6.26}/lib/archiver/src/main.js +0 -0
  255. /package/framework/{v0.6.25 → v0.6.26}/lib/async/package.json +0 -0
  256. /package/framework/{v0.6.25 → v0.6.26}/lib/async/src/main.js +0 -0
  257. /package/framework/{v0.6.25 → v0.6.26}/lib/audit/package.json +0 -0
  258. /package/framework/{v0.6.25 → v0.6.26}/lib/audit/src/main.js +0 -0
  259. /package/framework/{v0.6.25 → v0.6.26}/lib/audit-store.js +0 -0
  260. /package/framework/{v0.6.25 → v0.6.26}/lib/authn/package.json +0 -0
  261. /package/framework/{v0.6.25 → v0.6.26}/lib/authn/src/lockout.js +0 -0
  262. /package/framework/{v0.6.25 → v0.6.26}/lib/authn/src/main.js +0 -0
  263. /package/framework/{v0.6.25 → v0.6.26}/lib/authn/src/totp.js +0 -0
  264. /package/framework/{v0.6.25 → v0.6.26}/lib/authz-gate/package.json +0 -0
  265. /package/framework/{v0.6.25 → v0.6.26}/lib/authz-gate/src/main.js +0 -0
  266. /package/framework/{v0.6.25 → v0.6.26}/lib/cache/README.md +0 -0
  267. /package/framework/{v0.6.25 → v0.6.26}/lib/cache/build.json +0 -0
  268. /package/framework/{v0.6.25 → v0.6.26}/lib/cache/package.json +0 -0
  269. /package/framework/{v0.6.25 → v0.6.26}/lib/cache/src/main.js +0 -0
  270. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/aliases.json +0 -0
  271. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/audit/arguments.json +0 -0
  272. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/audit/help.txt +0 -0
  273. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/audit/verify.js +0 -0
  274. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/add.js +0 -0
  275. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/arguments.json +0 -0
  276. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/build.js +0 -0
  277. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/copy.js +0 -0
  278. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/cp.js +0 -0
  279. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/help.js +0 -0
  280. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/help.txt +0 -0
  281. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
  282. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/list.js +0 -0
  283. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/man.js +0 -0
  284. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/mcp-start.js +0 -0
  285. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/mcp.js +0 -0
  286. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/oas.js +0 -0
  287. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/openapi.js +0 -0
  288. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/remove.js +0 -0
  289. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/rename.js +0 -0
  290. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/restart.js +0 -0
  291. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/rm.js +0 -0
  292. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/start.js +0 -0
  293. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/status.js +0 -0
  294. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/stop.js +0 -0
  295. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/bundle/types.js +0 -0
  296. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/cache/arguments.json +0 -0
  297. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/cache/clear.js +0 -0
  298. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/cache/help.txt +0 -0
  299. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/cache/stats.js +0 -0
  300. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/connector/add.js +0 -0
  301. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/connector/arguments.json +0 -0
  302. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/connector/help.js +0 -0
  303. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/connector/help.txt +0 -0
  304. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/connector/infer.js +0 -0
  305. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/connector/list.js +0 -0
  306. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/connector/migrate.js +0 -0
  307. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/connector/models.js +0 -0
  308. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/connector/remove.js +0 -0
  309. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/connector/rm.js +0 -0
  310. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/connector/test.js +0 -0
  311. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/container/arguments.json +0 -0
  312. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/container/help.js +0 -0
  313. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/container/help.txt +0 -0
  314. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/container/man.js +0 -0
  315. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/container/ps.js +0 -0
  316. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/container/stop.js +0 -0
  317. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/controller/add.js +0 -0
  318. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/controller/arguments.json +0 -0
  319. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/controller/help.txt +0 -0
  320. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/controller/inc/args.js +0 -0
  321. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/controller/inc/namespace.js +0 -0
  322. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/controller/inc/reference-rewrite.js +0 -0
  323. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/controller/inc/reference-scan.js +0 -0
  324. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/controller/inc/scaffold.js +0 -0
  325. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/controller/remove.js +0 -0
  326. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/controller/rename.js +0 -0
  327. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/controller/rm.js +0 -0
  328. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/env/add.js +0 -0
  329. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/env/get.js +0 -0
  330. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/env/help.js +0 -0
  331. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/env/help.txt +0 -0
  332. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/env/link-dev.js +0 -0
  333. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/env/list.js +0 -0
  334. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/env/remove.js +0 -0
  335. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/env/rm.js +0 -0
  336. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/env/set.js +0 -0
  337. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/env/unset.js +0 -0
  338. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/env/use.js +0 -0
  339. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/add.js +0 -0
  340. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/arguments.json +0 -0
  341. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/build.js +0 -0
  342. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/dot.js +0 -0
  343. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/get.js +0 -0
  344. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/help.js +0 -0
  345. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/help.txt +0 -0
  346. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/init.js +0 -0
  347. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/link-node-modules.js +0 -0
  348. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/link.js +0 -0
  349. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/list.js +0 -0
  350. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/man.js +0 -0
  351. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/msg.json +0 -0
  352. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/open.js +0 -0
  353. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/remove.js +0 -0
  354. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/reset.js +0 -0
  355. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/restart.js +0 -0
  356. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/set.js +0 -0
  357. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/start.js +0 -0
  358. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/status.js +0 -0
  359. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/stop.js +0 -0
  360. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/tail.js +0 -0
  361. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/update.js +0 -0
  362. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/framework/version.js +0 -0
  363. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/gina-dev.1.md +0 -0
  364. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/gina-framework.1.md +0 -0
  365. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/gina.1.md +0 -0
  366. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/helper.js +0 -0
  367. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/i18n/add.js +0 -0
  368. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/i18n/arguments.json +0 -0
  369. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/i18n/export.js +0 -0
  370. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/i18n/help.js +0 -0
  371. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/i18n/help.txt +0 -0
  372. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/i18n/import.js +0 -0
  373. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/i18n/scan.js +0 -0
  374. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/image/_host.js +0 -0
  375. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/image/arguments.json +0 -0
  376. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/image/build.js +0 -0
  377. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/image/help.js +0 -0
  378. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/image/help.txt +0 -0
  379. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/image/list.js +0 -0
  380. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/image/man.js +0 -0
  381. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/image/rm.js +0 -0
  382. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/image/run.js +0 -0
  383. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/index.js +0 -0
  384. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/inspector/help.js +0 -0
  385. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/inspector/help.txt +0 -0
  386. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/inspector/open.js +0 -0
  387. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/man-render.js +0 -0
  388. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/minion/arguments.json +0 -0
  389. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/minion/help.js +0 -0
  390. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/minion/help.txt +0 -0
  391. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/minion/kill.js +0 -0
  392. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/minion/list.js +0 -0
  393. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/msg.json +0 -0
  394. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/port/help.js +0 -0
  395. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/port/help.txt +0 -0
  396. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/port/inc/scan.js +0 -0
  397. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/port/list.js +0 -0
  398. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/port/reset.js +0 -0
  399. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/port/set.js +0 -0
  400. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/add.js +0 -0
  401. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/arguments.json +0 -0
  402. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/backup.js +0 -0
  403. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/build.js +0 -0
  404. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/help.js +0 -0
  405. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/help.txt +0 -0
  406. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/import.js +0 -0
  407. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/list.js +0 -0
  408. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/man.js +0 -0
  409. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/move.js +0 -0
  410. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/remove.js +0 -0
  411. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/rename.js +0 -0
  412. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/restart.js +0 -0
  413. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/restore.js +0 -0
  414. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/rm.js +0 -0
  415. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/start.js +0 -0
  416. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/status.js +0 -0
  417. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/project/stop.js +0 -0
  418. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/protocol/arguments.json +0 -0
  419. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/protocol/help.js +0 -0
  420. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/protocol/help.txt +0 -0
  421. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/protocol/list.js +0 -0
  422. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/protocol/remove.js +0 -0
  423. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/protocol/set.js +0 -0
  424. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/scope/add.js +0 -0
  425. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/scope/help.js +0 -0
  426. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/scope/help.txt +0 -0
  427. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/scope/link-local.js +0 -0
  428. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/scope/link-production.js +0 -0
  429. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/scope/list.js +0 -0
  430. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/scope/remove.js +0 -0
  431. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/scope/rm.js +0 -0
  432. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/scope/use.js +0 -0
  433. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/secrets/arguments.json +0 -0
  434. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/secrets/check.js +0 -0
  435. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/secrets/help.js +0 -0
  436. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/secrets/help.txt +0 -0
  437. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/secrets/scan.js +0 -0
  438. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/service/help.js +0 -0
  439. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/service/help.txt +0 -0
  440. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/service/list.js +0 -0
  441. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/service/man.js +0 -0
  442. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/service/start.js +0 -0
  443. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/storage/arguments.json +0 -0
  444. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/storage/gc.js +0 -0
  445. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/storage/help.txt +0 -0
  446. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/storage/stats.js +0 -0
  447. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/storage/verify.js +0 -0
  448. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd/view/add.js +0 -0
  449. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd-status-format/package.json +0 -0
  450. /package/framework/{v0.6.25 → v0.6.26}/lib/cmd-status-format/src/main.js +0 -0
  451. /package/framework/{v0.6.25 → v0.6.26}/lib/collection/README.md +0 -0
  452. /package/framework/{v0.6.25 → v0.6.26}/lib/collection/build.json +0 -0
  453. /package/framework/{v0.6.25 → v0.6.26}/lib/collection/package.json +0 -0
  454. /package/framework/{v0.6.25 → v0.6.26}/lib/collection/src/main.js +0 -0
  455. /package/framework/{v0.6.25 → v0.6.26}/lib/config.js +0 -0
  456. /package/framework/{v0.6.25 → v0.6.26}/lib/connector-config/package.json +0 -0
  457. /package/framework/{v0.6.25 → v0.6.26}/lib/connector-config/src/main.js +0 -0
  458. /package/framework/{v0.6.25 → v0.6.26}/lib/connector-error/package.json +0 -0
  459. /package/framework/{v0.6.25 → v0.6.26}/lib/connector-error/src/main.js +0 -0
  460. /package/framework/{v0.6.25 → v0.6.26}/lib/connector-registry/package.json +0 -0
  461. /package/framework/{v0.6.25 → v0.6.26}/lib/connector-registry/src/main.js +0 -0
  462. /package/framework/{v0.6.25 → v0.6.26}/lib/cron/README.md +0 -0
  463. /package/framework/{v0.6.25 → v0.6.26}/lib/cron/package.json +0 -0
  464. /package/framework/{v0.6.25 → v0.6.26}/lib/cron/src/main.js +0 -0
  465. /package/framework/{v0.6.25 → v0.6.26}/lib/domain/LICENSE +0 -0
  466. /package/framework/{v0.6.25 → v0.6.26}/lib/domain/README.md +0 -0
  467. /package/framework/{v0.6.25 → v0.6.26}/lib/domain/package.json +0 -0
  468. /package/framework/{v0.6.25 → v0.6.26}/lib/domain/src/main.js +0 -0
  469. /package/framework/{v0.6.25 → v0.6.26}/lib/dto/package.json +0 -0
  470. /package/framework/{v0.6.25 → v0.6.26}/lib/dto/src/main.js +0 -0
  471. /package/framework/{v0.6.25 → v0.6.26}/lib/dto-pipe/package.json +0 -0
  472. /package/framework/{v0.6.25 → v0.6.26}/lib/dto-pipe/src/main.js +0 -0
  473. /package/framework/{v0.6.25 → v0.6.26}/lib/dto-types/package.json +0 -0
  474. /package/framework/{v0.6.25 → v0.6.26}/lib/dto-types/src/main.js +0 -0
  475. /package/framework/{v0.6.25 → v0.6.26}/lib/generator/index.js +0 -0
  476. /package/framework/{v0.6.25 → v0.6.26}/lib/i18n/package.json +0 -0
  477. /package/framework/{v0.6.25 → v0.6.26}/lib/i18n/src/main.js +0 -0
  478. /package/framework/{v0.6.25 → v0.6.26}/lib/idempotency/package.json +0 -0
  479. /package/framework/{v0.6.25 → v0.6.26}/lib/idempotency/src/main.js +0 -0
  480. /package/framework/{v0.6.25 → v0.6.26}/lib/image-build/package.json +0 -0
  481. /package/framework/{v0.6.25 → v0.6.26}/lib/image-build/src/main.js +0 -0
  482. /package/framework/{v0.6.25 → v0.6.26}/lib/index.js +0 -0
  483. /package/framework/{v0.6.25 → v0.6.26}/lib/inherits/LICENSE +0 -0
  484. /package/framework/{v0.6.25 → v0.6.26}/lib/inherits/README.md +0 -0
  485. /package/framework/{v0.6.25 → v0.6.26}/lib/inherits/package.json +0 -0
  486. /package/framework/{v0.6.25 → v0.6.26}/lib/inherits/src/main.js +0 -0
  487. /package/framework/{v0.6.25 → v0.6.26}/lib/inspector-events/package.json +0 -0
  488. /package/framework/{v0.6.25 → v0.6.26}/lib/inspector-events/src/main.js +0 -0
  489. /package/framework/{v0.6.25 → v0.6.26}/lib/inspector-redact/package.json +0 -0
  490. /package/framework/{v0.6.25 → v0.6.26}/lib/inspector-redact/src/main.js +0 -0
  491. /package/framework/{v0.6.25 → v0.6.26}/lib/instrument/package.json +0 -0
  492. /package/framework/{v0.6.25 → v0.6.26}/lib/instrument/src/main.js +0 -0
  493. /package/framework/{v0.6.25 → v0.6.26}/lib/job/package.json +0 -0
  494. /package/framework/{v0.6.25 → v0.6.26}/lib/job-store.js +0 -0
  495. /package/framework/{v0.6.25 → v0.6.26}/lib/json-config-header/package.json +0 -0
  496. /package/framework/{v0.6.25 → v0.6.26}/lib/json-config-header/src/main.js +0 -0
  497. /package/framework/{v0.6.25 → v0.6.26}/lib/kv/package.json +0 -0
  498. /package/framework/{v0.6.25 → v0.6.26}/lib/kv/src/main.js +0 -0
  499. /package/framework/{v0.6.25 → v0.6.26}/lib/kv-store.js +0 -0
  500. /package/framework/{v0.6.25 → v0.6.26}/lib/loading-state/package.json +0 -0
  501. /package/framework/{v0.6.25 → v0.6.26}/lib/loading-state/src/main.js +0 -0
  502. /package/framework/{v0.6.25 → v0.6.26}/lib/logger/README.md +0 -0
  503. /package/framework/{v0.6.25 → v0.6.26}/lib/logger/package.json +0 -0
  504. /package/framework/{v0.6.25 → v0.6.26}/lib/logger/src/containers/default/index.js +0 -0
  505. /package/framework/{v0.6.25 → v0.6.26}/lib/logger/src/containers/file/index.js +0 -0
  506. /package/framework/{v0.6.25 → v0.6.26}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  507. /package/framework/{v0.6.25 → v0.6.26}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  508. /package/framework/{v0.6.25 → v0.6.26}/lib/logger/src/containers/mq/index.js +0 -0
  509. /package/framework/{v0.6.25 → v0.6.26}/lib/logger/src/containers/mq/listener.js +0 -0
  510. /package/framework/{v0.6.25 → v0.6.26}/lib/logger/src/containers/mq/speaker.js +0 -0
  511. /package/framework/{v0.6.25 → v0.6.26}/lib/logger/src/helper.js +0 -0
  512. /package/framework/{v0.6.25 → v0.6.26}/lib/logger/src/main.js +0 -0
  513. /package/framework/{v0.6.25 → v0.6.26}/lib/logger/src/redact.js +0 -0
  514. /package/framework/{v0.6.25 → v0.6.26}/lib/maintenance/package.json +0 -0
  515. /package/framework/{v0.6.25 → v0.6.26}/lib/maintenance/src/main.js +0 -0
  516. /package/framework/{v0.6.25 → v0.6.26}/lib/math/index.js +0 -0
  517. /package/framework/{v0.6.25 → v0.6.26}/lib/mcp-dispatch/package.json +0 -0
  518. /package/framework/{v0.6.25 → v0.6.26}/lib/mcp-dispatch/src/main.js +0 -0
  519. /package/framework/{v0.6.25 → v0.6.26}/lib/mcp-http/package.json +0 -0
  520. /package/framework/{v0.6.25 → v0.6.26}/lib/mcp-http/src/main.js +0 -0
  521. /package/framework/{v0.6.25 → v0.6.26}/lib/mcp-server/package.json +0 -0
  522. /package/framework/{v0.6.25 → v0.6.26}/lib/mcp-server/src/main.js +0 -0
  523. /package/framework/{v0.6.25 → v0.6.26}/lib/merge/README.md +0 -0
  524. /package/framework/{v0.6.25 → v0.6.26}/lib/merge/package.json +0 -0
  525. /package/framework/{v0.6.25 → v0.6.26}/lib/merge/src/main.js +0 -0
  526. /package/framework/{v0.6.25 → v0.6.26}/lib/message-validator/package.json +0 -0
  527. /package/framework/{v0.6.25 → v0.6.26}/lib/message-validator/src/main.js +0 -0
  528. /package/framework/{v0.6.25 → v0.6.26}/lib/metrics/package.json +0 -0
  529. /package/framework/{v0.6.25 → v0.6.26}/lib/metrics/src/main.js +0 -0
  530. /package/framework/{v0.6.25 → v0.6.26}/lib/model.js +0 -0
  531. /package/framework/{v0.6.25 → v0.6.26}/lib/money/package.json +0 -0
  532. /package/framework/{v0.6.25 → v0.6.26}/lib/money/src/main.js +0 -0
  533. /package/framework/{v0.6.25 → v0.6.26}/lib/net-locality/package.json +0 -0
  534. /package/framework/{v0.6.25 → v0.6.26}/lib/net-locality/src/main.js +0 -0
  535. /package/framework/{v0.6.25 → v0.6.26}/lib/nunjucks-filters/README.md +0 -0
  536. /package/framework/{v0.6.25 → v0.6.26}/lib/nunjucks-filters/package.json +0 -0
  537. /package/framework/{v0.6.25 → v0.6.26}/lib/nunjucks-filters/src/main.js +0 -0
  538. /package/framework/{v0.6.25 → v0.6.26}/lib/nunjucks-resolver/package.json +0 -0
  539. /package/framework/{v0.6.25 → v0.6.26}/lib/nunjucks-resolver/src/main.js +0 -0
  540. /package/framework/{v0.6.25 → v0.6.26}/lib/proc.js +0 -0
  541. /package/framework/{v0.6.25 → v0.6.26}/lib/push/package.json +0 -0
  542. /package/framework/{v0.6.25 → v0.6.26}/lib/push/src/main.js +0 -0
  543. /package/framework/{v0.6.25 → v0.6.26}/lib/rate-limit/package.json +0 -0
  544. /package/framework/{v0.6.25 → v0.6.26}/lib/rate-limit/src/main.js +0 -0
  545. /package/framework/{v0.6.25 → v0.6.26}/lib/release-watch/package.json +0 -0
  546. /package/framework/{v0.6.25 → v0.6.26}/lib/release-watch/src/main.js +0 -0
  547. /package/framework/{v0.6.25 → v0.6.26}/lib/render-cache/package.json +0 -0
  548. /package/framework/{v0.6.25 → v0.6.26}/lib/render-cache/src/main.js +0 -0
  549. /package/framework/{v0.6.25 → v0.6.26}/lib/render-cache-store.js +0 -0
  550. /package/framework/{v0.6.25 → v0.6.26}/lib/routing/README.md +0 -0
  551. /package/framework/{v0.6.25 → v0.6.26}/lib/routing/build.json +0 -0
  552. /package/framework/{v0.6.25 → v0.6.26}/lib/routing/package.json +0 -0
  553. /package/framework/{v0.6.25 → v0.6.26}/lib/routing/src/main.js +0 -0
  554. /package/framework/{v0.6.25 → v0.6.26}/lib/routing/src/radix.js +0 -0
  555. /package/framework/{v0.6.25 → v0.6.26}/lib/routing-introspect/package.json +0 -0
  556. /package/framework/{v0.6.25 → v0.6.26}/lib/routing-introspect/src/main.js +0 -0
  557. /package/framework/{v0.6.25 → v0.6.26}/lib/secrets/package.json +0 -0
  558. /package/framework/{v0.6.25 → v0.6.26}/lib/secrets/src/backends/env.js +0 -0
  559. /package/framework/{v0.6.25 → v0.6.26}/lib/secrets/src/backends/exec.js +0 -0
  560. /package/framework/{v0.6.25 → v0.6.26}/lib/secrets/src/backends/file.js +0 -0
  561. /package/framework/{v0.6.25 → v0.6.26}/lib/secrets/src/declaration.js +0 -0
  562. /package/framework/{v0.6.25 → v0.6.26}/lib/secrets/src/env-file.js +0 -0
  563. /package/framework/{v0.6.25 → v0.6.26}/lib/secrets/src/main.js +0 -0
  564. /package/framework/{v0.6.25 → v0.6.26}/lib/secrets/src/sources.js +0 -0
  565. /package/framework/{v0.6.25 → v0.6.26}/lib/security-headers-emitter/package.json +0 -0
  566. /package/framework/{v0.6.25 → v0.6.26}/lib/security-headers-emitter/src/main.js +0 -0
  567. /package/framework/{v0.6.25 → v0.6.26}/lib/session-store.js +0 -0
  568. /package/framework/{v0.6.25 → v0.6.26}/lib/shell.js +0 -0
  569. /package/framework/{v0.6.25 → v0.6.26}/lib/sqlite-driver.js +0 -0
  570. /package/framework/{v0.6.25 → v0.6.26}/lib/sri/package.json +0 -0
  571. /package/framework/{v0.6.25 → v0.6.26}/lib/sri/src/main.js +0 -0
  572. /package/framework/{v0.6.25 → v0.6.26}/lib/state.js +0 -0
  573. /package/framework/{v0.6.25 → v0.6.26}/lib/storage/package.json +0 -0
  574. /package/framework/{v0.6.25 → v0.6.26}/lib/storage/src/local-cas.js +0 -0
  575. /package/framework/{v0.6.25 → v0.6.26}/lib/storage/src/local-stream.js +0 -0
  576. /package/framework/{v0.6.25 → v0.6.26}/lib/storage/src/local.js +0 -0
  577. /package/framework/{v0.6.25 → v0.6.26}/lib/storage/src/main.js +0 -0
  578. /package/framework/{v0.6.25 → v0.6.26}/lib/storage/src/meta-store.js +0 -0
  579. /package/framework/{v0.6.25 → v0.6.26}/lib/storage/src/s3.js +0 -0
  580. /package/framework/{v0.6.25 → v0.6.26}/lib/storage/src/util.js +0 -0
  581. /package/framework/{v0.6.25 → v0.6.26}/lib/storage-store.js +0 -0
  582. /package/framework/{v0.6.25 → v0.6.26}/lib/swig-filters/README.md +0 -0
  583. /package/framework/{v0.6.25 → v0.6.26}/lib/swig-filters/package.json +0 -0
  584. /package/framework/{v0.6.25 → v0.6.26}/lib/swig-filters/src/main.js +0 -0
  585. /package/framework/{v0.6.25 → v0.6.26}/lib/swig-resolver/package.json +0 -0
  586. /package/framework/{v0.6.25 → v0.6.26}/lib/swig-resolver/src/main.js +0 -0
  587. /package/framework/{v0.6.25 → v0.6.26}/lib/template-loaders/package.json +0 -0
  588. /package/framework/{v0.6.25 → v0.6.26}/lib/template-loaders/src/loaders/http.js +0 -0
  589. /package/framework/{v0.6.25 → v0.6.26}/lib/template-loaders/src/loaders/memory.js +0 -0
  590. /package/framework/{v0.6.25 → v0.6.26}/lib/template-loaders/src/main.js +0 -0
  591. /package/framework/{v0.6.25 → v0.6.26}/lib/url/README.md +0 -0
  592. /package/framework/{v0.6.25 → v0.6.26}/lib/url/index.js +0 -0
  593. /package/framework/{v0.6.25 → v0.6.26}/lib/url/routing.json +0 -0
  594. /package/framework/{v0.6.25 → v0.6.26}/lib/uuid/package.json +0 -0
  595. /package/framework/{v0.6.25 → v0.6.26}/lib/uuid/src/main.js +0 -0
  596. /package/framework/{v0.6.25 → v0.6.26}/lib/validator.js +0 -0
  597. /package/framework/{v0.6.25 → v0.6.26}/lib/watcher/package.json +0 -0
  598. /package/framework/{v0.6.25 → v0.6.26}/lib/watcher/src/main.js +0 -0
  599. /package/framework/{v0.6.25 → v0.6.26}/lib/ws-framing/package.json +0 -0
  600. /package/framework/{v0.6.25 → v0.6.26}/lib/ws-framing/src/main.js +0 -0
  601. /package/framework/{v0.6.25 → v0.6.26}/lib/ws-query/package.json +0 -0
  602. /package/framework/{v0.6.25 → v0.6.26}/lib/ws-query/src/main.js +0 -0
  603. /package/framework/{v0.6.25 → v0.6.26}/lib/ws-session/package.json +0 -0
  604. /package/framework/{v0.6.25 → v0.6.26}/lib/ws-session/src/main.js +0 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,13 @@ 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.26 - 2026-09-04
10
+ ### Fixed
11
+ * Error responses no longer crash when the rendered payload carries a non-numeric top-level status (#B466). A page whose own vocabulary includes a field named status - say {status: "draft"} rendered alongside an error - had that value stamped straight into the HTTP response, which threw ERR_HTTP_INVALID_STATUS_CODE and replaced the intended error page with an unhandled 500. The failure was invisible on every successful render and fired only on the error path, i.e. exactly when the error page was needed. Every status the error path resolves is now validated against node's own rule (an integer from 100 to 999) and degrades to a 500 error page when it does not qualify; a numeric status still sets the HTTP status exactly as documented. This also closes the same hole for an explicitly passed three-digit-but-invalid code such as "099", which previously threw as well.
12
+ * Error responses now carry the content-type they are meant to declare (#B467). Two branches of the error path - the Internet Explorer override, and the branch taken when a request arrives with no user-agent header at all, which is the common shape for machine callers - passed the header NAME as node's status-message argument instead of passing a headers object. Node therefore read the MIME string character by character: over HTTP/1.1 the response came back with roughly ten to thirty junk headers named 0, 1, 2 and so on, a status line whose reason phrase read content-type, and no content-type header at all; over HTTP/2 the headers were dropped entirely and a status-message warning was emitted. Nothing threw, so the malformed error response was completely silent. Both branches now pass a headers object, matching the two sibling branches beside them, and the plain-text branch declares the bundle encoding as its charset because the error body is JSON written as UTF-8 - a charset-less text/plain invited clients to guess a single-byte encoding and corrupt any non-ASCII text in the error message.
13
+ * Staged multipart upload parts stranded by a previous process are now reclaimed at boot (#B469). The `upload.autoTmpCleanupTimeout` deletion timer is per-upload and in-process, so a restart stranded every staged part it was holding, and a part that never reached `self.store()` - a request failing after the multipart parse, or an application consuming the staged file some other way - then had no reclaim path at all: on deployments that restart often, server-generated `.part` files accumulated indefinitely in the configured landing directories. When the timer is armed, server init now sweeps each configured landing directory (the global default plus every group `path`, deduplicated) for staged-shaped `.part` files older than the configured timeout, floored at one hour so an in-flight upload from a sibling live process on a shared staging directory is never touched. The sweep is deliberately conservative: exact server-generated name shape only (a client-named orphan predating the opaque staging names is indistinguishable from an application file and is left alone), regular files only, symlinks never followed, non-recursive. A disabled timer - the shipped default - still arms no sweep: removing staged files then remains the operator's own job, exactly as documented. Applications may also remove `req.files[].path` themselves; the publish path has always tolerated a vanished source, and that tolerance is now a documented contract.
14
+ * Job records stranded by a process death are now reclaimed (#B471). The deferred function of an async job lives only in its creating process - a closure cannot be serialised - so a record left `running` (or `pending` past its scheduled retry) by a crash or an unclean restart could never settle: on a durable store its `expiresAt` stayed null forever, the TTL sweep's own guard excluded it, listings reported phantom running work, and the documented polling pattern never terminated. The sweep is now preceded by an orphan-reclaim pass on durable stores: a non-terminal record whose last transition - or whose scheduled retry - is older than `jobs.orphanTimeout` (seconds, default 86400, `0` or `false` disables, floored at 60) is marked `failed` with error name `JobOrphanedError`, after which normal `ttl` retention removes it on schedule. The built-in memory store is exempt, since an in-process store cannot hold another process's orphans; a record reclaimed while its origin was merely slow self-corrects on the origin's next write; and no completion webhook fires for a reclaim - concurrent reclaimers and a self-healing job would otherwise produce contradictory notifications, and the record itself carries the truth.
15
+
9
16
  ## 0.6.25 - 2026-09-03
10
17
  ### Added
11
18
  * Exact-money primitive (#FIN5): lib.money server-side and gina.money in the browser bundle — ISO 4217 minor-unit integer arithmetic on BigInt, with an in-lib exponent table (JPY 0, BHD 3, CLF 4, default 2). Strict wire-string parse() rejects float inputs and excess fractional precision (rounding stays the application's decision); add/subtract/compare/multiply throw on currency mismatch and integer-factor violations; format() renders the canonical wire string with exactly the currency's fraction digits; toMinor()/fromMinor() round-trip JSON-safe minor-unit counts. Amounts stay exact beyond Number.MAX_SAFE_INTEGER minor units. Display formatting deliberately stays with the i18n layer (Intl.NumberFormat). The module is dependency-free and dual-published; changes to it ride the browser bundle (pickup: restart and re-bake).
package/README.md CHANGED
@@ -66,29 +66,26 @@ open https://localhost:3100
66
66
 
67
67
  > **npm 12+** blocks install scripts by default, and gina's post-install bootstraps `~/.gina` and the framework dependencies. Install with `npm install -g gina@latest --allow-scripts=gina`, or allow it once for all global installs with `npm config set allow-scripts=gina --location=user`. (Not needed on npm ≤ 11.)
68
68
 
69
- ## What's in 0.6.25
69
+ ## What's in 0.6.26
70
70
 
71
- > **Restart AND rebuild your bundles.** This release changes the browser bundle:
72
- > the exact-money primitive (`gina.money`), the `isIban`/`isBic` validation
73
- > rules and the routing-helper diagnostic all ride `gina.min.js`. Run
74
- > `gina bundle:build` after upgrading, then `gina bundle:restart`.
71
+ > **Restart your bundles — no rebuild needed.** Every fix in this release is
72
+ > server-side; the browser bundle is byte-identical to `0.6.25`
73
+ > (`gina.min.js` and `gina.min.css` both unchanged), so `gina bundle:restart`
74
+ > is the whole pickup.
75
75
 
76
- > **No settings reset.** `0.6.25` is a patch — the `shortVersion` stays `0.6`,
76
+ > **No settings reset.** `0.6.26` is a patch — the `shortVersion` stays `0.6`,
77
77
  > so your `~/.gina/0.6/settings.json` is untouched. (`0.6.0` was the reset.)
78
78
 
79
- **The financial-messaging foundations release** — five additive building blocks
80
- for ISO 20022-class and payments-grade applications, plus one hardening fix and
81
- two bug fixes. Full detail in [CHANGELOG.md](./CHANGELOG.md).
82
-
83
- - **Added — verbatim XML request bodies (#FIN1).** A POST, PUT or PATCH whose `Content-Type` is `application/xml`, `text/xml` or any `application/*+xml` type reaches your action verbatim: `req.body` is the exact document as a string, and you parse it with the library of your choice — gina never parses XML itself. Previously such a body was silently destroyed by the form-encoded decode path.
84
- - **Added — `self.renderXML(xmlContent, contentType)` (#FIN2).** First-class XML responses: send a pre-serialised document and the delegate owns the wire concerns — `application/xml` by default with your bundle's charset (RFC 7303), an optional `+xml`-suffix content type (`application/soap+xml`, `atom+xml`, vendor trees), HEAD suppression with byte-accurate `content-length`, the HTTP/2 pseudo-header status, opt-in trailers.
85
- - **Added — message-schema validation seam (#FIN3).** Declare `"messageValidator": "<name>"` in a route's `param` block and ship a factory at `message-validators/<name>.js` — boot-compiled (a broken module refuses the boot instead of silently skipping validation), sync or async, fed the verbatim body string. Refusals are fail-closed: 422 with your `errors` array, 400 for an unparseable document, 503 + `Retry-After` when your checker is down. Gina ships no schema engine — the validator is yours; the hook, the ordering and the refusal shape are the framework's.
86
- - **Added — `isIban` / `isBic` FormValidator rules (#FIN4).** IBAN per ISO 13616 — shape, official per-country length for 87 registered countries, and the ISO 7064 MOD 97-10 checksum — with a tolerant read (case and separators normalized for validation only; the stored value is never mutated), plus BIC per ISO 9362. Client + server, like every built-in rule.
87
- - **Added — exact-money primitive (#FIN5).** `lib.money` server-side and `gina.money` in the browser bundle: ISO 4217 minor-unit integer arithmetic on BigInt, strict wire-string `parse()` that rejects float inputs, `add`/`subtract`/`multiply`/`compare` with same-currency guards, canonical `format()`. Display formatting stays with `Intl.NumberFormat`.
88
- - **Added — idempotency keys (#FIN6).** Opt-in `Idempotency-Key` request deduplication at the router band, per the IETF draft: the recorded first response replays with `Idempotency-Replayed: true`, a duplicate in flight gets 409 + `Retry-After`, key reuse with a different payload gets 422. Principal-scoped, over a kv namespace you declare; dormant unless enabled.
89
- - **Security — Inspector inline-script data can no longer be read as template source.** The shared inline-script helper now escapes `{` and `}` inside JSON string literals as well as `<`, so a stored value like `{{ 7*7 }}` renders literally instead of executing with the page's locals in scope. Values parse back identical; only pages emitting the Inspector block were reachable.
90
- - **Fixed — the `query()` basic-auth option is honoured on HTTP/2 and can no longer leak (#B465).** `options.auth` is minted into `Authorization: Basic` before dispatch on BOTH transports and the option is deleted pre-dispatch. Previously node consumed it on HTTP/1.x only, while the HTTP/2 path forwarded it as a literal `auth:` header with authentication silently unperformed. A caller-supplied authorization header always wins.
91
- - **Fixed — the client-side routing helper no longer swallows its own diagnostic (#B462).** A route missing from the running table now surfaces as a `console.warn` on the first sighting (the `gina.notFound` registry still dedups repeats), and the alternate-route arm records its registry entry so repeat counts accumulate.
79
+ **The error-path and orphan-reclaim release** — four fixes: two on the error
80
+ response itself, where failures were invisible precisely because they only fire
81
+ when something has already gone wrong, and two reclaiming artifacts that a
82
+ process death used to strand forever. Full detail in
83
+ [CHANGELOG.md](./CHANGELOG.md).
84
+
85
+ - **Fixed — an error response no longer crashes on a non-numeric `status` (#B466).** A page whose own vocabulary includes a field named `status` — say `{status: "draft"}` rendered alongside an error — had that value stamped straight into the HTTP response, which threw `ERR_HTTP_INVALID_STATUS_CODE` and replaced the intended error page with an unhandled 500. Every status the error path resolves is now validated against node's own rule (an integer from 100 to 999) and degrades to a 500 error page when it does not qualify. A numeric status still sets the HTTP status exactly as documented. This also closes the same hole for an explicitly passed three-digit-but-invalid code such as `"099"`.
86
+ - **Fixed — error responses carry the content-type they declare (#B467).** Two branches of the error path — the Internet Explorer override, and the branch taken when a request arrives with no `user-agent` header at all, the common shape for machine callers — passed the header *name* as node's status-message argument instead of a headers object. Node read the MIME string character by character: over HTTP/1.1 the response came back with roughly ten to thirty junk headers named `0`, `1`, `2`…, a reason phrase reading `content-type`, and no content-type at all; over HTTP/2 the headers were dropped entirely. Nothing threw, so the malformed response was completely silent. Both branches now pass a headers object, and the plain-text branch declares the bundle encoding as its charset. That half is user-visible wherever error copy is not plain ASCII: the error body is JSON written as UTF-8, and a charset-less `text/plain` invites the client to guess a single-byte encoding, so accented characters and non-Latin scripts in a message shown to a visitor render as mojibake.
87
+ - **Fixed — staged upload parts stranded by a restart are reclaimed at boot (#B469).** The `upload.autoTmpCleanupTimeout` deletion timer is per-upload and in-process, so a restart stranded every staged part it was holding, and a part that never reached `self.store()` had no reclaim path at all — on deployments that restart often, server-generated `.part` files accumulated indefinitely. When the timer is armed, server init now sweeps each configured landing directory for staged-shaped `.part` files older than the configured timeout, floored at one hour so an in-flight upload from a sibling process on a shared staging directory is never touched. Deliberately conservative: exact server-generated name shape only, regular files only, symlinks never followed, non-recursive. A disabled timer — the shipped default — still arms no sweep.
88
+ - **Fixed — job records stranded by a process death are reclaimed (#B471).** The deferred function of an async job lives only in its creating process, so a record left `running` by a crash or an unclean restart could never settle: on a durable store its `expiresAt` stayed null forever, the TTL sweep's own guard excluded it, listings reported phantom running work, and the documented polling pattern never terminated. The sweep is now preceded by an orphan-reclaim pass on durable stores: a non-terminal record older than `jobs.orphanTimeout` (seconds, default 86400, `0` or `false` disables, floored at 60) is marked `failed` with error name `JobOrphanedError`, after which normal `ttl` retention removes it on schedule. The built-in memory store is exempt, and no completion webhook fires for a reclaim — the record itself carries the truth.
92
89
 
93
90
  ## Documentation
94
91
 
package/ROADMAP.md CHANGED
@@ -77,6 +77,7 @@ This roadmap covers planned features, architectural improvements, new connectors
77
77
  | **Q4 2026** | `0.6.23` ✅ | **Security**: hardened inline-script escaping — the previous guard matched only the literal `</script>` and `<!--`, but the HTML5 script-data end tag also accepts a tab, newline, form feed, space or `/` after the tag name, so `</script >` closed the block and the remainder of a stored value parsed as HTML; serialised values now neutralise `<` itself at every site, with U+2028/U+2029 escaped too, and escaped output parses back to an identical value. **Added**: the framework itself now emits seven security headers by default on both engines (`server.securityHeaders`; four more opt-in — `xFrameOptions` / `coop` / `corp` / `hsts`), first-writer-wins so mounted plugins, `env.json` headers and proxies keep winning, with `/_gina/*` exempt from the cross-origin-isolating pair; `server.hidePoweredBy` now defaults to `true`. **Added**: `server.maxBodySize` (default 64MB, 413 + stream destroyed) bounds non-multipart request bodies, with warn-only `server.maxBodySizeWarn` (2MB) and a configurable `server.timeout` that stays `0` on purpose (SSE/WebSocket). **Added**: opt-in Subresource Integrity — `templates.json > "sriEnabled": true` adds `integrity` + `crossorigin` to same-origin script and stylesheet tags that resolve on disk; fail-open, hashes stat-validated per render. **Fixed**: a JSON body whose nested object shadows `constructor` with a primitive, null, array or plain object no longer crashes the merge on the PUT path. Restart **and** rebuild your bundles (the browser bundle changed — the merge fix ships in `gina.min.js`). |
78
78
  | **Q4 2026** | `0.6.25` ✅ | **Added**: the financial-messaging foundations — verbatim XML request bodies on POST/PUT/PATCH (`req.body` keeps the exact document the client sent; the form-encoded decode path previously destroyed it silently) with `self.renderXML()` as the outbound counterpart (`application/xml` by default per RFC 7303, an optional `+xml`-suffix content type, HEAD suppression with byte-accurate `content-length`, HTTP/2 pseudo-header status, opt-in trailers — gina parses no XML and builds none); a pluggable message-schema validation seam (declare `param.messageValidator: "<name>"` on a route and ship a factory at `message-validators/<name>.js` — boot-compiled, fail-closed refusals: 422 with your `errors` array, 400 unparseable, 503 + `Retry-After` when the checker is down — ordered after auth/rate-limit/idempotency and before DTO field validation); `isIban` / `isBic` FormValidator rules (ISO 13616 shape + official per-country length for 87 countries + ISO 7064 MOD 97-10, and ISO 9362 — tolerant read, the stored value is never mutated; client + server like every built-in rule); an exact-money primitive (`lib.money` server-side and `gina.money` in the browser bundle — ISO 4217 minor-unit integer arithmetic on BigInt with strict wire-string `parse()`, same-currency guards and canonical `format()`; display stays with `Intl.NumberFormat`); and opt-in `Idempotency-Key` request deduplication at the router band per the IETF draft (the recorded first response replays with `Idempotency-Replayed: true`; 409 + `Retry-After` while the original is in flight; 422 on key reuse with a different payload; principal-scoped over a declared kv namespace). **Security**: server data serialised into the Inspector's inline script blocks can no longer be read as template source — the shared inline-script helper now escapes `{` and `}` inside JSON string literals as well as `<`, so a stored `{{ 7*7 }}` renders literally instead of executing with the page's locals in scope (values parse back identical; only pages emitting the Inspector block were reachable). **Fixed**: the query() basic-auth option is honoured on HTTP/2 and can no longer leak — `options.auth` is minted into `Authorization: Basic` before dispatch on BOTH transports and the option is deleted pre-dispatch (previously node consumed it on HTTP/1.x only, while the HTTP/2 path forwarded it as a literal `auth:` header with authentication silently unperformed; a caller-supplied authorization header always wins); and the client-side routing helper no longer swallows its "route not found inside your view" diagnostic — `console.warn` on the first sighting of each missing route, with repeats counted on `gina.notFound`. Restart **and** rebuild your bundles — the browser bundle changed (the money primitive, the IBAN/BIC rules and the routing-helper diagnostic ride `gina.min.js`). |
79
79
  | **Q4 2026** | `0.6.24` ✅ | **Fixed**: Couchbase `bulkInsert` no longer returns `undefined` when its own prologue throws — the outer `try` wraps the method body, so a synchronous failure (an unresolvable connection, or either `rec` validation) was caught, logged and swallowed, and the method fell off the end: the `await` form resolved with `undefined`, so a caller treating "did not throw" as success recorded an insert that never happened, and `.onComplete(cb)` threw a `TypeError` at the call site. The promise, its one-shot resolver and the `.onComplete` shim are now built before the `try`, so the outer catch settles the call. A fire-and-forget call now surfaces an `unhandledRejection` where it previously failed silently, and the fix moves what `bulkInsert` RETURNS, not what its promise RESOLVES WITH — a rows-less success still resolves `null`. **Fixed**: a Couchbase entity that fails to register now names itself, its source file, the method being attached and the underlying cause, instead of emitting a bare stack that left a partially-built entity and a missing method surfacing arbitrarily far from the cause; registration stays non-fatal. **Fixed**: the reconnect classifier no longer throws under every supported SDK — `err instanceof couchbase.Error` raised a `TypeError` because no supported couchnode exports a bare `Error` class, and since that operand is evaluated first the message arm was unreachable too, so the classifier could not classify by any route; each `instanceof` is now guarded on the class existing (deliberately a guard, not an activation — on the default `isaac` engine the listener is never dispatched at all). Restart your bundles — the browser bundle is unchanged, so no rebuild is needed. |
80
+ | **Q4 2026** | `0.6.26` ✅ | **Fixed**: the error-path and orphan-reclaim release. An error response no longer crashes when the rendered payload carries a non-numeric top-level `status` — a page whose own vocabulary includes a field named `status` (say `{status: "draft"}` rendered alongside an error) had that value stamped straight into the HTTP response, which threw `ERR_HTTP_INVALID_STATUS_CODE` and replaced the intended error page with an unhandled 500, i.e. it fired only on the error path, exactly when the error page was needed; every status the error path resolves is now validated against node's own rule (an integer from 100 to 999) and degrades to a 500 error page when it does not qualify, while a numeric status still sets the HTTP status exactly as documented. **Fixed**: error responses now carry the content-type they declare — two branches of the error path, the Internet Explorer override and the branch taken when a request arrives with no `user-agent` header at all (the common shape for machine callers), passed the header NAME as node's status-message argument instead of a headers object, so node read the MIME string character by character: over HTTP/1.1 the response came back with roughly ten to thirty junk headers named `0`, `1`, `2`…, a reason phrase reading `content-type`, and no content-type at all, and over HTTP/2 the headers were dropped entirely — nothing threw, so the malformed response was completely silent. Both branches now pass a headers object, and the plain-text branch declares the bundle encoding as its charset, which is user-visible wherever error copy is not plain ASCII: the body is JSON written as UTF-8, and a charset-less `text/plain` invites the client to guess a single-byte encoding, rendering accented characters and non-Latin scripts as mojibake. **Fixed**: staged multipart upload parts stranded by a previous process are now reclaimed at boot — the `upload.autoTmpCleanupTimeout` deletion timer is per-upload and in-process, so a restart stranded every staged part it was holding and a part that never reached `self.store()` had no reclaim path at all; when the timer is armed, server init now sweeps each configured landing directory for staged-shaped `.part` files older than the configured timeout, floored at one hour so an in-flight upload from a sibling live process on a shared staging directory is never touched, and the sweep is deliberately conservative (exact server-generated name shape only, regular files only, symlinks never followed, non-recursive). A disabled timer — the shipped default — still arms no sweep. **Fixed**: job records stranded by a process death are now reclaimed — the deferred function of an async job lives only in its creating process, so a record left `running` by a crash or an unclean restart could never settle: its `expiresAt` stayed null forever, the TTL sweep's own guard excluded it, listings reported phantom running work and the documented polling pattern never terminated; the sweep is now preceded by an orphan-reclaim pass on durable stores marking a non-terminal record older than `jobs.orphanTimeout` (seconds, default 86400, `0` or `false` disables, floored at 60) as `failed` with error name `JobOrphanedError`, after which normal `ttl` retention removes it on schedule — the built-in memory store is exempt and no completion webhook fires for a reclaim. Restart your bundles — the browser bundle is unchanged, so no rebuild is needed. |
80
81
  | **Q1 2027** | `0.6.x` | HTTP/2 priorities (blocked on Node scheduler hooks) · Beemaster admin + visual translation editor |
81
82
  | **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`) |
82
83
  | **2027** | `0.8.0` | Financial-messaging foundations — XML request/response handling · pluggable message-schema validation · IBAN/BIC validation rules · money & ISO 4217 minor-unit utilities · idempotency keys |
@@ -0,0 +1 @@
1
+ 0.6.26
@@ -123,6 +123,31 @@ const { type } = require('node:os');
123
123
  var SwigFilters = lib.SwigFilters;
124
124
  var statusCodes = requireJSON( _( getPath('gina').core + '/status.codes') );
125
125
 
126
+ /**
127
+ * #B466 — is `v` a status code node's `writeHead()` will accept ?
128
+ *
129
+ * Encodes node's own rule (integer 100-999) rather than membership of
130
+ * `statusCodes`: that table carries a `_comment` key, so a bare
131
+ * `typeof(statusCodes[v]) != 'undefined'` test accepts the status
132
+ * `"_comment"`, and it would also coerce a valid-but-unlisted code.
133
+ * `/^\d{3}$/` is not sufficient either — it accepts `"099"`, which node
134
+ * rejects. The `statusCodes` lookup remains in place as the DIAGNOSTIC
135
+ * (the `[ ApiValidator ]` warn); this predicate is the CORRECTNESS gate.
136
+ *
137
+ * @param {*} v - candidate status
138
+ * @returns {boolean} true when node would accept `v` as an HTTP status
139
+ *
140
+ * @example
141
+ * _isValidHttpStatus(404) // true
142
+ * _isValidHttpStatus('404') // true (node accepts numeric strings)
143
+ * _isValidHttpStatus('draft') // false
144
+ * _isValidHttpStatus('099') // false (node rejects it)
145
+ */
146
+ var _isValidHttpStatus = function (v) {
147
+ var n = Number(v);
148
+ return Number.isInteger(n) && n >= 100 && n <= 999;
149
+ };
150
+
126
151
  // cached at module load — these env vars never change at runtime (#P19)
127
152
  var _isDev = process.env.NODE_ENV_IS_DEV && process.env.NODE_ENV_IS_DEV.toLowerCase() === 'true';
128
153
  var _isLocalScope = process.env.NODE_SCOPE_IS_LOCAL && process.env.NODE_SCOPE_IS_LOCAL.toLowerCase() === 'true';
@@ -7906,8 +7931,13 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
7906
7931
  ) {
7907
7932
 
7908
7933
  msg = ( !/^\d+$/.test(code) && typeof(msg) == 'undefined' ) ? code : msg;
7909
- // Preserve an explicitly passed 3-digit HTTP status code; fall back to res.status or 500
7910
- code = ( /^\d{3}$/.test(String(code)) ) ? code : ( res && typeof(res.status) != 'undefined' ) ? res.status : 500;
7934
+ // Preserve an explicitly passed HTTP status code; fall back to res.status or 500.
7935
+ // #B466 — both candidates are validated: an unvalidated res.status
7936
+ // reached writeHead() verbatim and threw ERR_HTTP_INVALID_STATUS_CODE
7937
+ // on any non-numeric value, i.e. the error page failed exactly when
7938
+ // it was needed. Guarding the explicit arm too closes the same hole
7939
+ // for a 3-digit-but-invalid code such as "099".
7940
+ code = _isValidHttpStatus(code) ? code : ( res && _isValidHttpStatus(res.status) ) ? res.status : 500;
7911
7941
  // #CE1 — a transient datastore failure resolving to 500 upgrades
7912
7942
  // to 503 when the bundle opted in (explicit non-500 preserved above)
7913
7943
  code = _maybeUpgradeTransient503(code);
@@ -7984,7 +8014,14 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
7984
8014
 
7985
8015
  } else if (arguments.length < 3) {
7986
8016
  msg = code || null;
7987
- code = res || 500;
8017
+ // #B466 — `res` holds the code in this shape, and an invalid SCALAR
8018
+ // would reach writeHead() verbatim. An OBJECT is deliberately passed
8019
+ // through untouched: the errorObj shape is unpacked at the site-2
8020
+ // resolution below (which applies the same guard), and collapsing it
8021
+ // here would break the #CE1 transient-503 upgrade that depends on it.
8022
+ code = ( res !== null && typeof(res) == 'object' ) ? res
8023
+ : _isValidHttpStatus(res) ? res
8024
+ : 500;
7988
8025
  res = local.res;
7989
8026
  }
7990
8027
 
@@ -8056,7 +8093,8 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
8056
8093
  // allowing this.throwError(err)
8057
8094
  if ( typeof(code) == 'object' && !msg && typeof(code.status) != 'undefined' && typeof(code.error) != 'undefined' ) {
8058
8095
  msg = code.error || code.message;
8059
- code = code.status || 500;
8096
+ // #B466 — same guard as the resolution arms above.
8097
+ code = _isValidHttpStatus(code.status) ? code.status : 500;
8060
8098
  // #CE1 — second upgrade site: the 2-arg errorObj shape
8061
8099
  // resolves its status only here, after the early header
8062
8100
  // point above — so this site sets its own header too
@@ -8082,7 +8120,12 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
8082
8120
  // TODO - test with internet explorer then remove this if working
8083
8121
  if ( typeof(req.headers['user-agent']) != 'undefined' ) {
8084
8122
  if ( /msie/i.test(req.headers['user-agent']) ) {
8085
- res.writeHead(code, "content-type", "text/plain");
8123
+ // #B467 - Node's signature is writeHead(status[, statusMessage][, headers]):
8124
+ // the 3-arg form used here put the mime STRING in the headers slot, so Node
8125
+ // index-keyed it into junk headers ("0","1",...) and emitted NO content-type.
8126
+ // The charset is declared because the body below is JSON.stringify(...) written
8127
+ // via res.end(), i.e. UTF-8 - same form the text-render path already builds.
8128
+ res.writeHead(code, { 'content-type': 'text/plain; charset='+ bundleConf.encoding } );
8086
8129
  } else {
8087
8130
  var contentType = ( responseHeaders && responseHeaders['content-type'])
8088
8131
  ? responseHeaders['content-type']
@@ -8093,7 +8136,9 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
8093
8136
  } else if ( typeof(responseHeaders['content-type']) != 'undefined' ) {
8094
8137
  res.writeHead(code, { 'content-type': responseHeaders['content-type']} )
8095
8138
  } else {
8096
- res.writeHead(code, "content-type", bundleConf.server.coreConfiguration.mime['json']+ '; charset='+ bundleConf.encoding);
8139
+ // #B467 - same 3-arg misuse as the MSIE branch above; the mime expression is
8140
+ // unchanged, only the argument shape is corrected.
8141
+ res.writeHead(code, { 'content-type': bundleConf.server.coreConfiguration.mime['json']+ '; charset='+ bundleConf.encoding } );
8097
8142
  }
8098
8143
 
8099
8144
 
@@ -1536,6 +1536,7 @@ isBundleMounted(projects, bundlesPath, getContext('bundle'), function onBundleMo
1536
1536
  sweepInterval: _jobsConf.sweepInterval,
1537
1537
  idSize: _jobsConf.idSize,
1538
1538
  retryBackoffMs: _jobsConf.retryBackoffMs,
1539
+ orphanTimeout: _jobsConf.orphanTimeout,
1539
1540
  webhookMaxAttempts: _jobsConf.webhookMaxAttempts,
1540
1541
  webhookBackoffMs: _jobsConf.webhookBackoffMs,
1541
1542
  webhookTimeoutMs: _jobsConf.webhookTimeoutMs,
@@ -162,6 +162,91 @@ var parseByteSize = function(value) {
162
162
  }
163
163
  };
164
164
 
165
+ /**
166
+ * #B469 — reclaim staged multipart parts a PREVIOUS process stranded.
167
+ *
168
+ * A staged upload part has exactly two reclaim paths: the `movefiles()` unlink
169
+ * when `self.store()` publishes it, and the per-upload `autoTmpCleanupTimeout`
170
+ * timer — which is in-process, so every part it was holding outlives a restart.
171
+ * This sweep runs the same policy across process lifetimes: at boot, remove
172
+ * from each configured staging directory the parts old enough that an armed
173
+ * timer would already have taken them, had its process survived.
174
+ *
175
+ * Deliberately conservative:
176
+ * - name-gated on the exact staged shape (32 lowercase hex + `.part`, the
177
+ * server-generated name) — a client-named orphan predating that naming is
178
+ * indistinguishable from an application file and is left alone;
179
+ * - regular files only (`lstat`, never follows a symlink), non-recursive;
180
+ * - age-gated on mtime, so a part a SIBLING live process is still streaming
181
+ * into a shared staging dir (fresh mtime while chunks land) is never touched;
182
+ * - every step tolerates a concurrent removal (`ENOENT` is not an error — a
183
+ * sibling bundle sweeping the same dir, or the app unlinking its own part).
184
+ *
185
+ * @private
186
+ * @function sweepStagedUploadOrphans
187
+ * @param {array} dirs - Absolute staging directories (already resolved, deduped by the caller)
188
+ * @param {number} olderThanMs - Only parts whose mtime is older than this many ms are removed; a non-positive/NaN value makes the sweep a no-op
189
+ * @param {function} done - Completion callback
190
+ * @param {object} done.report - `{ scanned, removed, errors }` counters (`scanned` = name-matching entries considered)
191
+ * @returns {void}
192
+ * @example
193
+ * sweepStagedUploadOrphans([ '/var/data/uploads' ], 3600000, function(report) {
194
+ * console.debug('removed ' + report.removed + ' orphaned staged part(s)');
195
+ * });
196
+ */
197
+ var sweepStagedUploadOrphans = function(dirs, olderThanMs, done) {
198
+ var report = { scanned: 0, removed: 0, errors: 0 };
199
+ if ( !(olderThanMs > 0) ) { // NaN/0/negative — refuse to sweep on a broken threshold
200
+ return done(report);
201
+ }
202
+ var d = 0;
203
+ var nextDir = function() {
204
+ if (d >= dirs.length) {
205
+ return done(report);
206
+ }
207
+ var dir = dirs[d]; d++;
208
+ fs.readdir(dir, function(readdirErr, names) {
209
+ if (readdirErr) {
210
+ // a staging dir that does not exist yet has nothing to reclaim
211
+ if (readdirErr.code != 'ENOENT') report.errors++;
212
+ return nextDir();
213
+ }
214
+ var cutoff = Date.now() - olderThanMs;
215
+ var n = 0;
216
+ var nextName = function() {
217
+ if (n >= names.length) {
218
+ return nextDir();
219
+ }
220
+ var name = names[n]; n++;
221
+ if ( !/^[0-9a-f]{32}\.part$/.test(name) ) {
222
+ return nextName();
223
+ }
224
+ report.scanned++;
225
+ var full = dir + '/' + name;
226
+ fs.lstat(full, function(lstatErr, stats) {
227
+ if (lstatErr) {
228
+ if (lstatErr.code != 'ENOENT') report.errors++;
229
+ return nextName();
230
+ }
231
+ if ( !stats.isFile() || stats.mtimeMs > cutoff ) {
232
+ return nextName();
233
+ }
234
+ fs.unlink(full, function(unlinkErr) {
235
+ if (unlinkErr) {
236
+ if (unlinkErr.code != 'ENOENT') report.errors++;
237
+ } else {
238
+ report.removed++;
239
+ }
240
+ nextName();
241
+ });
242
+ });
243
+ };
244
+ nextName();
245
+ });
246
+ };
247
+ nextDir();
248
+ };
249
+
165
250
  var _isDebugLog = function() {
166
251
  return process.env.LOG_LEVEL === 'debug' || process.env.LOG_LEVEL === 'trace';
167
252
  };
@@ -1838,6 +1923,57 @@ function Server(options) {
1838
1923
  }
1839
1924
  }
1840
1925
 
1926
+ // ── #B469 — staged-upload orphan sweep (boot-time) ──
1927
+ // The `autoTmpCleanupTimeout` deletion timer is per-upload and
1928
+ // in-process: a restart strands every part it was holding, and a
1929
+ // part that never reaches `self.store()` (the request failed after
1930
+ // the multipart parse, or the app consumed the staged file some
1931
+ // other way) has NO other reclaim path. So when the operator HAS
1932
+ // armed the timer, honour that same policy across process
1933
+ // lifetimes: sweep the configured staging dirs at boot for staged
1934
+ // parts old enough that a surviving timer would already have taken
1935
+ // them. The threshold is floored at 1h: an in-flight upload from a
1936
+ // sibling live process on a SHARED staging dir keeps a fresh mtime
1937
+ // while its chunks land, and the floor keeps even a stalled one
1938
+ // safe. A disabled timer (the shipped default) arms NO sweep — the
1939
+ // docs say tmp cleanup is then the operator's own job, and this
1940
+ // keeps that contract intact. Runs in every scope (production is
1941
+ // where restarts strand parts); duplicate sweeps of a dir shared
1942
+ // across merged-process bundles are harmless (idempotent,
1943
+ // ENOENT-tolerant).
1944
+ if ( _uploadSettings && _uploadSettings.groups && typeof(_uploadSettings.groups) == 'object' ) {
1945
+ // mirrors the request path's arming gate for the timer itself
1946
+ var _hasSweepTimeout = (
1947
+ typeof(_uploadSettings.autoTmpCleanupTimeout) != 'undefined'
1948
+ && _uploadSettings.autoTmpCleanupTimeout != ''
1949
+ && _uploadSettings.autoTmpCleanupTimeout != 0
1950
+ && !/false/i.test(_uploadSettings.autoTmpCleanupTimeout)
1951
+ ) ? true : false;
1952
+ var _sweepTimeoutMs = (!_hasSweepTimeout) ? null : parseTimeout(_uploadSettings.autoTmpCleanupTimeout);
1953
+ if (_sweepTimeoutMs) {
1954
+ // staging-dir set = the resolved global landing dir + every
1955
+ // group override — the same resolution the write site uses
1956
+ var _sweepDirs = [ ( _uploadSettings.uploadDir || _uploadSettings.tmpPath || os.tmpdir() ) ];
1957
+ var _sweepGroupNames = Object.keys(_uploadSettings.groups);
1958
+ for (var _sg = 0; _sg < _sweepGroupNames.length; _sg++) {
1959
+ var _sgPath = _uploadSettings.groups[_sweepGroupNames[_sg]] && _uploadSettings.groups[_sweepGroupNames[_sg]].path;
1960
+ if ( _sgPath && _sweepDirs.indexOf(_sgPath) < 0 ) {
1961
+ _sweepDirs.push(_sgPath);
1962
+ }
1963
+ }
1964
+ var _sweepAppName = self.appName;
1965
+ setImmediate(function() {
1966
+ sweepStagedUploadOrphans(_sweepDirs, Math.max(_sweepTimeoutMs, 3600000), function(report) {
1967
+ if (report.removed || report.errors) {
1968
+ console.info('[ BUNDLE ][ '+ _sweepAppName +' ][ server ][ init ] upload orphan sweep: removed '+ report.removed +' staged part(s)'+ ( report.errors ? ' ('+ report.errors +' error(s))' : '' ) +' across '+ _sweepDirs.length +' staging dir(s)');
1969
+ } else {
1970
+ console.debug('[ BUNDLE ][ '+ _sweepAppName +' ][ server ][ init ] upload orphan sweep: no orphaned staged parts ('+ _sweepDirs.length +' staging dir(s))');
1971
+ }
1972
+ });
1973
+ });
1974
+ }
1975
+ }
1976
+
1841
1977
  // ── #B152 — opt-in deterministic proxied-request classification ──
1842
1978
  // server.proxy.requireForwardedHeaders === true -> a request is
1843
1979
  // classified proxied ONLY on an explicit X-Forwarded-Host; the
@@ -46,7 +46,12 @@
46
46
  * session-store cleanup pattern) — NOT `lib/cron`, which is dormant (not
47
47
  * registered in `lib/index.js`, not instantiated at boot). A bundle may
48
48
  * drive an extra sweep from its own cron, but the internal timer
49
- * guarantees baseline retention regardless.
49
+ * guarantees baseline retention regardless. Since #B471 the sweep is
50
+ * preceded by an orphan-reclaim pass on DURABLE stores: a non-terminal
51
+ * record stranded by a dead process (its deferred fn died with it) is
52
+ * terminalized as `failed`/`JobOrphanedError` once older than
53
+ * `orphanTimeout` (default 24h, `0` disables), so retention and the
54
+ * polling surface stay truthful across process lifetimes.
50
55
  *
51
56
  * The primitive is always-on. Optional tuning via `app.json` (an absent block
52
57
  * means sane defaults):
@@ -167,6 +172,16 @@ var DEFAULT_WEBHOOK_TIMEOUT_MS = 5000;
167
172
  */
168
173
  var DEFAULT_RETRY_BACKOFF_MS = 1000;
169
174
 
175
+ /**
176
+ * Default orphan-reclaim ceiling, SECONDS (24h). A non-terminal record whose
177
+ * last transition is older than this is presumed stranded by a dead process
178
+ * and reclaimed as `failed` (`JobOrphanedError`) by {@link sweep}'s reclaim
179
+ * pass — durable stores only; see {@link reclaimOrphans}. `0` disables.
180
+ * @constant
181
+ * @type {number}
182
+ */
183
+ var DEFAULT_ORPHAN_TIMEOUT = 86400;
184
+
170
185
  /**
171
186
  * The active record store (memory store by default). `null` until the first
172
187
  * {@link create} or {@link start}.
@@ -176,6 +191,26 @@ var DEFAULT_RETRY_BACKOFF_MS = 1000;
176
191
  */
177
192
  var _store = null;
178
193
 
194
+ /**
195
+ * `true` when {@link _store} is the BUILT-IN memory store (defaulted, not
196
+ * app-supplied). The orphan-reclaim pass skips it: an in-process store cannot
197
+ * hold another process's orphans (process death wipes it), so reclaim there
198
+ * could only ever produce false positives on long-running live jobs.
199
+ *
200
+ * @inner
201
+ * @type {boolean}
202
+ */
203
+ var _storeIsBuiltinMemory = false;
204
+
205
+ /**
206
+ * Orphan-reclaim ceiling, SECONDS. `0` = disabled. Floored at 60 when armed
207
+ * (a smaller value would reclaim jobs still legitimately mid-flight).
208
+ *
209
+ * @inner
210
+ * @type {number}
211
+ */
212
+ var _orphanTimeout = DEFAULT_ORPHAN_TIMEOUT;
213
+
179
214
  /**
180
215
  * In-flight worker count. Bounded by {@link _maxConcurrency}.
181
216
  *
@@ -248,7 +283,7 @@ function noop() {}
248
283
  * @property {number} updatedAt - Epoch ms of the last transition.
249
284
  * @property {?number} startedAt - Epoch ms the worker began; `null` while pending.
250
285
  * @property {?number} finishedAt - Epoch ms of the terminal transition; `null` until then.
251
- * @property {?number} expiresAt - Epoch ms after which a terminal record is sweepable; `null` until terminal — deliberately including while a retry is pending, so the sweep can never purge a retryable job.
286
+ * @property {?number} expiresAt - Epoch ms after which a terminal record is sweepable; `null` until terminal — deliberately including while a retry is pending, so the TTL sweep can never purge a retryable job. On a durable store that protection is bounded by the orphan-reclaim pass: a record left non-terminal past `orphanTimeout` is marked `failed` first, which stamps `expiresAt` and hands it to ordinary retention (see {@link reclaimOrphans}). The built-in memory store is exempt, so the guarantee is unbounded there.
252
287
  * @property {?number} nextRetryAt - Epoch ms of the next scheduled attempt while a failed attempt awaits its retry; `null` once terminal (absent if the job never settled).
253
288
  * @property {?number} webhookDeliveredAt - Epoch ms a completion webhook succeeded; absent until delivered.
254
289
  * @property {?boolean} webhookFailed - `true` once webhook delivery exhausts its retries; absent otherwise.
@@ -354,6 +389,7 @@ function serializeError(err) {
354
389
  function ensureStarted() {
355
390
  if (!_store) {
356
391
  _store = createMemoryStore();
392
+ _storeIsBuiltinMemory = true;
357
393
  }
358
394
  ensureSweepTimer();
359
395
  }
@@ -757,8 +793,106 @@ function remove(id, cb) {
757
793
  }
758
794
 
759
795
  /**
760
- * Purge terminal records whose TTL has elapsed. Invoked automatically by the
761
- * internal timer; also callable directly (e.g. from a bundle cron, or a test).
796
+ * #B471 — reclaim non-terminal records stranded by a DEAD process. The
797
+ * deferred function lives only in its creating process (a closure cannot be
798
+ * serialised), so a record left `running` — or `pending` past its scheduled
799
+ * retry — by a process death can never settle: `expiresAt` stays `null`, the
800
+ * TTL sweep's own `expires_at IS NOT NULL` guard excludes it forever, and a
801
+ * consumer polling it polls forever. This pass terminalizes such records as
802
+ * `failed` with error name `JobOrphanedError`, after which normal retention
803
+ * applies and the ordinary sweep deletes them on schedule.
804
+ *
805
+ * Age gates (both on ceilings, so a LIVE process's work always survives):
806
+ * - `running`: last transition (`updatedAt`) older than the ceiling.
807
+ * - `pending` with a scheduled retry: `now` past `nextRetryAt` + ceiling —
808
+ * a live origin retries at ~`nextRetryAt`, so the ceiling past it is
809
+ * unambiguous, and a record merely WAITING on backoff is never touched.
810
+ * - plain `pending` (never ran): the `updatedAt` gate, like `running`.
811
+ *
812
+ * A record reclaimed while its origin was merely SLOW self-corrects: every
813
+ * origin write (`update()`, the worker's running transition, a retry
814
+ * re-enqueue) is unguarded last-write-wins, so the real outcome overwrites
815
+ * the synthetic failure. The transient `failed` reading is the disclosed
816
+ * cost. Reclaim fires NO completion webhook — under multi-process stores two
817
+ * processes may reclaim concurrently (no cross-process claim verb exists),
818
+ * and a self-healing job would otherwise emit contradictory notifications;
819
+ * the record itself carries the truth.
820
+ *
821
+ * Skipped entirely when disabled (`orphanTimeout: 0`/`false`), when the
822
+ * store is the BUILT-IN memory store (an in-process store cannot hold
823
+ * another process's orphans), or when the store lacks `list` (a minimal
824
+ * third-party store). Never throws; a list/update error is logged and the
825
+ * pass moves on — a reclaim that broke the sweep would be a worse failure
826
+ * than the strand it repairs.
827
+ *
828
+ * @inner
829
+ * @param {number} now - Epoch ms.
830
+ * @param {function} cb - `cb(reclaimedCount)`; never receives an error.
831
+ * @returns {void}
832
+ */
833
+ function reclaimOrphans(now, cb) {
834
+ if (!_orphanTimeout || _storeIsBuiltinMemory || !_store || typeof _store.list !== 'function') {
835
+ cb(0); return;
836
+ }
837
+ var ceilingMs = _orphanTimeout * 1000;
838
+ var reclaimed = 0;
839
+ var states = [STATES.RUNNING, STATES.PENDING];
840
+ var si = 0;
841
+
842
+ var nextState = function() {
843
+ if (si >= states.length) {
844
+ if (reclaimed > 0) {
845
+ console.info('[lib.job] orphan reclaim: marked ' + reclaimed + ' stranded record(s) `failed` (JobOrphanedError, ceiling ' + _orphanTimeout + 's)');
846
+ }
847
+ cb(reclaimed); return;
848
+ }
849
+ var state = states[si]; si++;
850
+ _store.list({ state: state }, function(listErr, recs) {
851
+ if (listErr || !Array.isArray(recs)) {
852
+ if (listErr) console.warn('[lib.job] orphan reclaim: list(' + state + ') failed — skipping this pass: ' + (listErr.message || listErr));
853
+ return nextState();
854
+ }
855
+ var ri = 0;
856
+ var nextRec = function() {
857
+ if (ri >= recs.length) return nextState();
858
+ var rec = recs[ri]; ri++;
859
+ var stranded = false;
860
+ if (state === STATES.RUNNING) {
861
+ stranded = (now - (rec.updatedAt || rec.startedAt || rec.createdAt || now)) > ceilingMs;
862
+ } else if (rec.nextRetryAt) {
863
+ stranded = now > (rec.nextRetryAt + ceilingMs);
864
+ } else {
865
+ stranded = (now - (rec.updatedAt || rec.createdAt || now)) > ceilingMs;
866
+ }
867
+ if (!stranded) return nextRec();
868
+ update(rec.id, {
869
+ state: STATES.FAILED,
870
+ error: { name: 'JobOrphanedError', message: 'reclaimed: `' + state + '` past jobs.orphanTimeout (' + _orphanTimeout + 's) — the owning process likely exited before settling this job', stack: null },
871
+ nextRetryAt: null,
872
+ finishedAt: now,
873
+ expiresAt: now + _ttl * 1000
874
+ }, function(uErr, updated) {
875
+ if (uErr) {
876
+ console.warn('[lib.job] orphan reclaim: update failed for job `' + rec.id + '`: ' + (uErr.message || uErr));
877
+ } else if (updated) {
878
+ reclaimed++;
879
+ }
880
+ nextRec();
881
+ });
882
+ };
883
+ nextRec();
884
+ });
885
+ };
886
+ nextState();
887
+ }
888
+
889
+ /**
890
+ * Purge terminal records whose TTL has elapsed — preceded by the #B471
891
+ * orphan-reclaim pass (see {@link reclaimOrphans}), so records a dead
892
+ * process stranded become terminal and then age out through this same
893
+ * purge. Invoked automatically by the internal timer; also callable
894
+ * directly (e.g. from a bundle cron, or a test). The callback contract is
895
+ * unchanged: `removedCount` counts DELETIONS only, never reclaims.
762
896
  *
763
897
  * @memberof module:gina/lib/job
764
898
  * @param {function} [cb] - `cb(err, removedCount)`.
@@ -770,7 +904,10 @@ function remove(id, cb) {
770
904
  function sweep(cb) {
771
905
  if (typeof cb !== 'function') cb = noop;
772
906
  if (!_store) { cb(null, 0); return; }
773
- _store.sweep(Date.now(), cb);
907
+ var now = Date.now();
908
+ reclaimOrphans(now, function() {
909
+ _store.sweep(now, cb);
910
+ });
774
911
  }
775
912
 
776
913
  /**
@@ -786,6 +923,7 @@ function sweep(cb) {
786
923
  * @param {number} [opts.sweepInterval=300] - Sweep interval (seconds); `0` disables the internal timer.
787
924
  * @param {number} [opts.idSize=21] - jobId length (characters).
788
925
  * @param {number} [opts.retryBackoffMs=1000] - Base delay (ms) between attempts of a failed job with retries remaining; doubles each attempt.
926
+ * @param {number|boolean} [opts.orphanTimeout=86400] - Orphan-reclaim ceiling (SECONDS): a non-terminal record whose last transition is older than this is reclaimed as `failed` (`JobOrphanedError`) by the sweep pass — durable stores only, the built-in memory store is exempt. `0`/`false` disables; positive values are floored at 60.
789
927
  * @param {number} [opts.webhookMaxAttempts=3] - Completion-webhook retry ceiling.
790
928
  * @param {number} [opts.webhookBackoffMs=500] - Webhook backoff base (ms); doubles each retry.
791
929
  * @param {number} [opts.webhookTimeoutMs=5000] - Per-attempt webhook request timeout (ms).
@@ -814,6 +952,13 @@ function start(opts) {
814
952
  if (typeof opts.retryBackoffMs === 'number' && opts.retryBackoffMs >= 0) {
815
953
  _retryBackoffMs = Math.floor(opts.retryBackoffMs);
816
954
  }
955
+ // 0 / false disables the orphan-reclaim pass; a positive value is floored
956
+ // at 60s so a mistyped tiny ceiling cannot reclaim jobs mid-flight.
957
+ if (opts.orphanTimeout === 0 || opts.orphanTimeout === false) {
958
+ _orphanTimeout = 0;
959
+ } else if (typeof opts.orphanTimeout === 'number' && opts.orphanTimeout > 0) {
960
+ _orphanTimeout = Math.max(60, Math.floor(opts.orphanTimeout));
961
+ }
817
962
  if (typeof opts.webhookMaxAttempts === 'number' && opts.webhookMaxAttempts > 0) {
818
963
  _webhookMaxAttempts = Math.floor(opts.webhookMaxAttempts);
819
964
  }
@@ -827,7 +972,13 @@ function start(opts) {
827
972
  _webhookSecret = opts.webhookSecret;
828
973
  }
829
974
  if (!_store) {
830
- _store = (opts.store && typeof opts.store === 'object') ? opts.store : createMemoryStore();
975
+ if (opts.store && typeof opts.store === 'object') {
976
+ _store = opts.store;
977
+ _storeIsBuiltinMemory = false;
978
+ } else {
979
+ _store = createMemoryStore();
980
+ _storeIsBuiltinMemory = true;
981
+ }
831
982
  } else if (opts.store && typeof opts.store === 'object' && opts.store !== _store) {
832
983
  // Store adoption is once-only: a store arriving after one is installed
833
984
  // (e.g. a create() already ran ensureStarted() and defaulted to the
@@ -900,6 +1051,8 @@ function reset() {
900
1051
  _webhookTimeoutMs = DEFAULT_WEBHOOK_TIMEOUT_MS;
901
1052
  _webhookSecret = null;
902
1053
  _retryBackoffMs = DEFAULT_RETRY_BACKOFF_MS;
1054
+ _orphanTimeout = DEFAULT_ORPHAN_TIMEOUT;
1055
+ _storeIsBuiltinMemory = false;
903
1056
  }
904
1057
 
905
1058
  module.exports = {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gina-framework",
3
- "version": "0.6.25",
3
+ "version": "0.6.26",
4
4
  "dependencies": {
5
5
  "@rhinostone/busboy": "^1.6.1",
6
6
  "@rhinostone/swig": "^2.7.2",