gina 0.3.6 → 0.3.7-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. package/.github/workflows/security.yml +6 -6
  2. package/.github/workflows/test.yml +17 -0
  3. package/AUTHORS +1 -1
  4. package/CHANGELOG.md +6 -6
  5. package/CONTRIBUTING.md +1 -1
  6. package/CONVENTIONS.md +52 -0
  7. package/GOVERNANCE.md +1 -1
  8. package/LICENSE +2 -0
  9. package/README.md +8 -6
  10. package/ROADMAP.md +4 -2
  11. package/bin/cli +13 -0
  12. package/framework/{v0.3.6 → v0.3.7-alpha.2}/AUTHORS +1 -1
  13. package/framework/{v0.3.6/lib/inherits → v0.3.7-alpha.2}/LICENSE +2 -0
  14. package/framework/v0.3.7-alpha.2/VERSION +1 -0
  15. package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +46 -10
  16. package/framework/v0.3.7-alpha.2/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  17. package/framework/v0.3.7-alpha.2/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  18. package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/index.html +4 -1
  19. package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +12 -2
  20. package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +341 -8
  21. package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/config.js +12 -2
  22. package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/controller/controller.js +90 -24
  23. package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/controller/controller.render-json.js +17 -1
  24. package/framework/v0.3.7-alpha.2/core/controller/controller.render-nunjucks.js +580 -0
  25. package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/controller/controller.render-swig.js +31 -0
  26. package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/gna.js +476 -0
  27. package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/file/package.json +1 -1
  28. package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/intl/package.json +1 -1
  29. package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/validator/package.json +1 -1
  30. package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/server.isaac.js +70 -7
  31. package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/server.js +107 -9
  32. package/framework/v0.3.7-alpha.2/lib/cmd/bundle/arguments.json +17 -0
  33. package/framework/v0.3.7-alpha.2/lib/cmd/bundle/help.txt +191 -0
  34. package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/list.js +125 -4
  35. package/framework/v0.3.7-alpha.2/lib/cmd/bundle/mcp-start.js +551 -0
  36. package/framework/v0.3.7-alpha.2/lib/cmd/bundle/mcp.js +460 -0
  37. package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/openapi.js +12 -162
  38. package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/start.js +8 -1
  39. package/framework/v0.3.7-alpha.2/lib/cmd/connector/add.js +646 -0
  40. package/framework/v0.3.7-alpha.2/lib/cmd/connector/arguments.json +20 -0
  41. package/framework/v0.3.7-alpha.2/lib/cmd/connector/help.js +46 -0
  42. package/framework/v0.3.7-alpha.2/lib/cmd/connector/help.txt +216 -0
  43. package/framework/v0.3.7-alpha.2/lib/cmd/connector/list.js +624 -0
  44. package/framework/v0.3.7-alpha.2/lib/cmd/connector/migrate.js +515 -0
  45. package/framework/v0.3.7-alpha.2/lib/cmd/connector/remove.js +522 -0
  46. package/framework/v0.3.7-alpha.2/lib/cmd/connector/rm.js +6 -0
  47. package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/init.js +5 -1
  48. package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/gina.1.md +2 -0
  49. package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/helper.js +6 -1
  50. package/framework/v0.3.7-alpha.2/lib/cmd/inspector/help.txt +62 -0
  51. package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/inspector/open.js +149 -9
  52. package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/add.js +4 -1
  53. package/framework/v0.3.7-alpha.2/lib/cmd/service/help.js +46 -0
  54. package/framework/v0.3.7-alpha.2/lib/cmd/service/help.txt +31 -0
  55. package/framework/v0.3.7-alpha.2/lib/cmd/service/list.js +230 -0
  56. package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/index.js +24 -0
  57. package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/inspector-redact/src/main.js +54 -15
  58. package/framework/v0.3.7-alpha.2/lib/mcp-dispatch/package.json +17 -0
  59. package/framework/v0.3.7-alpha.2/lib/mcp-dispatch/src/main.js +415 -0
  60. package/framework/v0.3.7-alpha.2/lib/mcp-http/package.json +17 -0
  61. package/framework/v0.3.7-alpha.2/lib/mcp-http/src/main.js +586 -0
  62. package/framework/v0.3.7-alpha.2/lib/mcp-server/package.json +17 -0
  63. package/framework/v0.3.7-alpha.2/lib/mcp-server/src/main.js +608 -0
  64. package/framework/v0.3.7-alpha.2/lib/nunjucks-resolver/package.json +17 -0
  65. package/framework/v0.3.7-alpha.2/lib/nunjucks-resolver/src/main.js +425 -0
  66. package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/proc.js +53 -2
  67. package/framework/v0.3.7-alpha.2/lib/routing-introspect/package.json +17 -0
  68. package/framework/v0.3.7-alpha.2/lib/routing-introspect/src/main.js +301 -0
  69. package/framework/v0.3.7-alpha.2/lib/swig-resolver/package.json +17 -0
  70. package/framework/v0.3.7-alpha.2/lib/swig-resolver/src/main.js +545 -0
  71. package/gna.js +34 -13
  72. package/llms.txt +119 -9
  73. package/package.json +6 -4
  74. package/resources/package.json.template +1 -1
  75. package/schema/connectors.json +5 -0
  76. package/schema/settings.json +48 -0
  77. package/script/check_changie_entries.js +247 -0
  78. package/script/{check_no_claude_leak.js → check_no_local_leak.js} +19 -9
  79. package/script/generate_gna_types.js +564 -0
  80. package/types/gna.d.ts +130 -4
  81. package/utils/helper.js +6 -3
  82. package/framework/v0.3.6/VERSION +0 -1
  83. package/framework/v0.3.6/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  84. package/framework/v0.3.6/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  85. package/framework/v0.3.6/core/deps/swig-client/swig-2.0.0.min.js +0 -19
  86. package/framework/v0.3.6/core/deps/swig-client/swig.js +0 -5114
  87. package/framework/v0.3.6/lib/cmd/bundle/arguments.json +0 -10
  88. package/framework/v0.3.6/lib/cmd/bundle/help.txt +0 -107
  89. package/framework/v0.3.6/lib/cmd/inspector/help.txt +0 -28
  90. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/html/nolayout.html +0 -0
  91. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/html/static.html +0 -0
  92. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/img/android-chrome-192x192.png +0 -0
  93. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/img/android-chrome-512x512.png +0 -0
  94. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/img/apple-touch-icon.png +0 -0
  95. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/img/favicon-16x16.png +0 -0
  96. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/img/favicon-32x32.png +0 -0
  97. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/img/favicon.ico +0 -0
  98. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/README.md +0 -0
  99. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  100. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  101. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  102. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  103. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  104. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  105. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/html/toolbar.html +0 -0
  106. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/html/toolbar.html.br +0 -0
  107. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/html/toolbar.html.gz +0 -0
  108. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  109. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  110. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.js +0 -0
  111. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -0
  112. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  113. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  114. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  115. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  116. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  117. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/ai/index.js +0 -0
  118. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/ai/lib/connector.js +0 -0
  119. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/couchbase/index.js +0 -0
  120. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/couchbase/lib/connector.js +0 -0
  121. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/couchbase/lib/connector.v2.js +0 -0
  122. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  123. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  124. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/couchbase/lib/n1ql.js +0 -0
  125. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/couchbase/lib/session-store.js +0 -0
  126. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
  127. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  128. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  129. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/mysql/index.js +0 -0
  130. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/mysql/lib/connector.js +0 -0
  131. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/postgresql/index.js +0 -0
  132. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/postgresql/lib/connector.js +0 -0
  133. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/redis/index.js +0 -0
  134. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/redis/lib/session-store.js +0 -0
  135. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/sql-parser.js +0 -0
  136. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/sqlite/index.js +0 -0
  137. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/sqlite/lib/connector.js +0 -0
  138. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/connectors/sqlite/lib/session-store.js +0 -0
  139. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/content.encoding +0 -0
  140. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/controller/controller.framework.js +0 -0
  141. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/controller/controller.render-stream.js +0 -0
  142. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/controller/controller.render-v1.js +0 -0
  143. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/controller/index.js +0 -0
  144. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/deps/busboy-1.6.0/LICENSE +0 -0
  145. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/deps/busboy-1.6.0/README.md +0 -0
  146. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/deps/busboy-1.6.0/lib/index.js +0 -0
  147. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
  148. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
  149. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
  150. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/deps/busboy-1.6.0/package.json +0 -0
  151. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/deps/optimist-0.6.1/LICENSE +0 -0
  152. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/deps/optimist-0.6.1/index.js +0 -0
  153. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/deps/optimist-0.6.1/package.json +0 -0
  154. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/deps/optimist-0.6.1/readme.markdown +0 -0
  155. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
  156. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
  157. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/deps/streamsearch-1.1.0/package.json +0 -0
  158. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/dev/index.js +0 -0
  159. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/dev/lib/class.js +0 -0
  160. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/dev/lib/factory.js +0 -0
  161. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/dev/lib/tools.js +0 -0
  162. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/locales/README.md +0 -0
  163. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/locales/currency.json +0 -0
  164. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/locales/dist/language/en.json +0 -0
  165. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/locales/dist/language/fr.json +0 -0
  166. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/locales/dist/region/en.json +0 -0
  167. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/locales/dist/region/fr.json +0 -0
  168. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/locales/index.js +0 -0
  169. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/mime.types +0 -0
  170. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/model/entity.js +0 -0
  171. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/model/index.js +0 -0
  172. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/model/template/entityFactory.js +0 -0
  173. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/model/template/index.js +0 -0
  174. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/README.md +0 -0
  175. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/index.js +0 -0
  176. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/file/README.md +0 -0
  177. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/file/build.json +0 -0
  178. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/intl/README.md +0 -0
  179. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/intl/build.json +0 -0
  180. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/intl/src/main.js +0 -0
  181. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/storage/README.md +0 -0
  182. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/storage/build.json +0 -0
  183. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/storage/package.json +0 -0
  184. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/storage/src/main.js +0 -0
  185. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/validator/README.md +0 -0
  186. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/validator/build.json +0 -0
  187. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/validator/src/form-validator.js +0 -0
  188. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/plugins/lib/validator/src/main.js +0 -0
  189. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/router.js +0 -0
  190. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/server.express.js +0 -0
  191. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/status.codes +0 -0
  192. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/_gitignore +0 -0
  193. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle/config/app.json +0 -0
  194. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  195. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle/config/routing.json +0 -0
  196. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle/config/settings.json +0 -0
  197. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  198. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle/config/templates.json +0 -0
  199. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  200. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  201. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  202. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  203. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle/index.js +0 -0
  204. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  205. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  206. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  207. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  208. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  209. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  210. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle_public/readme.md +0 -0
  211. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  212. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  213. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  214. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  215. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  216. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/command/gina.bat.tpl +0 -0
  217. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/command/gina.tpl +0 -0
  218. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/conf/env.json +0 -0
  219. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/conf/manifest.json +0 -0
  220. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/conf/package.json +0 -0
  221. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/conf/settings.json +0 -0
  222. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/conf/statics.json +0 -0
  223. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/conf/templates.json +0 -0
  224. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/error/client/json/401.json +0 -0
  225. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/error/client/json/403.json +0 -0
  226. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/error/client/json/404.json +0 -0
  227. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/error/server/html/50x.html +0 -0
  228. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/error/server/json/500.json +0 -0
  229. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/error/server/json/503.json +0 -0
  230. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/core/template/extensions/logger/config.json +0 -0
  231. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/console.js +0 -0
  232. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/context.js +0 -0
  233. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/data/LICENSE +0 -0
  234. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/data/README.md +0 -0
  235. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/data/package.json +0 -0
  236. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/data/src/main.js +0 -0
  237. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/dateFormat.js +0 -0
  238. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/index.js +0 -0
  239. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/json/LICENSE +0 -0
  240. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/json/README.md +0 -0
  241. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/json/package.json +0 -0
  242. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/json/src/main.js +0 -0
  243. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/path.js +0 -0
  244. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/plugins/README.md +0 -0
  245. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/plugins/package.json +0 -0
  246. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/plugins/src/api-error.js +0 -0
  247. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/plugins/src/main.js +0 -0
  248. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/prototypes.js +0 -0
  249. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/task.js +0 -0
  250. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/helpers/text.js +0 -0
  251. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/archiver/README.md +0 -0
  252. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/archiver/build.json +0 -0
  253. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/archiver/package.json +0 -0
  254. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/archiver/src/dep/jszip.min.js +0 -0
  255. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/archiver/src/main.js +0 -0
  256. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/async/package.json +0 -0
  257. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/async/src/main.js +0 -0
  258. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cache/README.md +0 -0
  259. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cache/build.json +0 -0
  260. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cache/package.json +0 -0
  261. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cache/src/main.js +0 -0
  262. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/aliases.json +0 -0
  263. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/add.js +0 -0
  264. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/build.js +0 -0
  265. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/copy.js +0 -0
  266. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/cp.js +0 -0
  267. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/help.js +0 -0
  268. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/oas.js +0 -0
  269. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/remove.js +0 -0
  270. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/rename.js +0 -0
  271. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/restart.js +0 -0
  272. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/rm.js +0 -0
  273. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/status.js +0 -0
  274. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/bundle/stop.js +0 -0
  275. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/cache/stats.js +0 -0
  276. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/env/add.js +0 -0
  277. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/env/get.js +0 -0
  278. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/env/help.js +0 -0
  279. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/env/help.txt +0 -0
  280. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/env/link-dev.js +0 -0
  281. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/env/list.js +0 -0
  282. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/env/remove.js +0 -0
  283. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/env/rm.js +0 -0
  284. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/env/set.js +0 -0
  285. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/env/unset.js +0 -0
  286. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/env/use.js +0 -0
  287. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/arguments.json +0 -0
  288. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/build.js +0 -0
  289. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/dot.js +0 -0
  290. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/get.js +0 -0
  291. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/help.js +0 -0
  292. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/help.txt +0 -0
  293. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/link-node-modules.js +0 -0
  294. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/link.js +0 -0
  295. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/msg.json +0 -0
  296. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/open.js +0 -0
  297. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/restart.js +0 -0
  298. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/set.js +0 -0
  299. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/start.js +0 -0
  300. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/status.js +0 -0
  301. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/stop.js +0 -0
  302. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/tail.js +0 -0
  303. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/update.js +0 -0
  304. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/framework/version.js +0 -0
  305. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/gina-dev.1.md +0 -0
  306. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/gina-framework.1.md +0 -0
  307. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/index.js +0 -0
  308. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/inspector/help.js +0 -0
  309. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/minion/help.js +0 -0
  310. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/minion/help.txt +0 -0
  311. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/msg.json +0 -0
  312. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/port/help.js +0 -0
  313. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/port/help.txt +0 -0
  314. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/port/inc/scan.js +0 -0
  315. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/port/list.js +0 -0
  316. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/port/reset.js +0 -0
  317. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/port/set.js +0 -0
  318. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/arguments.json +0 -0
  319. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/build.js +0 -0
  320. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/help.js +0 -0
  321. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/help.txt +0 -0
  322. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/import.js +0 -0
  323. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/list.js +0 -0
  324. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/move.js +0 -0
  325. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/remove.js +0 -0
  326. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/rename.js +0 -0
  327. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/restart.js +0 -0
  328. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/rm.js +0 -0
  329. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/start.js +0 -0
  330. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/status.js +0 -0
  331. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/project/stop.js +0 -0
  332. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/protocol/help.js +0 -0
  333. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/protocol/help.txt +0 -0
  334. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/protocol/list.js +0 -0
  335. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/protocol/set.js +0 -0
  336. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/scope/add.js +0 -0
  337. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/scope/help.js +0 -0
  338. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/scope/help.txt +0 -0
  339. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/scope/link-local.js +0 -0
  340. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/scope/link-production.js +0 -0
  341. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/scope/list.js +0 -0
  342. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/scope/remove.js +0 -0
  343. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/scope/rm.js +0 -0
  344. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/scope/use.js +0 -0
  345. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cmd/view/add.js +0 -0
  346. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/collection/README.md +0 -0
  347. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/collection/build.json +0 -0
  348. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/collection/package.json +0 -0
  349. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/collection/src/main.js +0 -0
  350. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/config.js +0 -0
  351. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cron/README.md +0 -0
  352. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cron/package.json +0 -0
  353. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/cron/src/main.js +0 -0
  354. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/domain/LICENSE +0 -0
  355. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/domain/README.md +0 -0
  356. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/domain/dist/2025-03-14_13-41-20_UTC.dat +0 -0
  357. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/domain/dist/public_suffix_list.dat +0 -0
  358. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/domain/dist/public_suffix_list.dat.br +0 -0
  359. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/domain/dist/public_suffix_list.dat.gz +0 -0
  360. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/domain/package.json +0 -0
  361. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/domain/src/main.js +0 -0
  362. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/generator/index.js +0 -0
  363. /package/framework/{v0.3.6 → v0.3.7-alpha.2/lib/inherits}/LICENSE +0 -0
  364. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/inherits/README.md +0 -0
  365. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/inherits/package.json +0 -0
  366. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/inherits/src/main.js +0 -0
  367. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/inspector-redact/package.json +0 -0
  368. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/logger/README.md +0 -0
  369. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/logger/package.json +0 -0
  370. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/logger/src/containers/default/index.js +0 -0
  371. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/logger/src/containers/file/index.js +0 -0
  372. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  373. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  374. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/logger/src/containers/mq/index.js +0 -0
  375. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/logger/src/containers/mq/listener.js +0 -0
  376. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/logger/src/containers/mq/speaker.js +0 -0
  377. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/logger/src/helper.js +0 -0
  378. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/logger/src/main.js +0 -0
  379. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/math/index.js +0 -0
  380. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/merge/README.md +0 -0
  381. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/merge/package.json +0 -0
  382. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/merge/src/main.js +0 -0
  383. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/model.js +0 -0
  384. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/routing/README.md +0 -0
  385. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/routing/build.json +0 -0
  386. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/routing/package.json +0 -0
  387. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/routing/src/main.js +0 -0
  388. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/routing/src/radix.js +0 -0
  389. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/session-store.js +0 -0
  390. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/shell.js +0 -0
  391. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/state.js +0 -0
  392. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/swig-filters/README.md +0 -0
  393. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/swig-filters/package.json +0 -0
  394. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/swig-filters/src/main.js +0 -0
  395. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/url/README.md +0 -0
  396. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/url/index.js +0 -0
  397. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/url/routing.json +0 -0
  398. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/uuid/package.json +0 -0
  399. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/uuid/src/main.js +0 -0
  400. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/validator.js +0 -0
  401. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/watcher/package.json +0 -0
  402. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/lib/watcher/src/main.js +0 -0
  403. /package/framework/{v0.3.6 → v0.3.7-alpha.2}/package.json +0 -0
@@ -100,6 +100,8 @@
100
100
  var CUSTOM_ORDER_KEY = '__gina_inspector_tab_layout_custom';
101
101
  /** @constant {string} localStorage key — hidden tabs in custom layout (JSON array of tab names) */
102
102
  var HIDDEN_TABS_KEY = '__gina_inspector_tab_layout_hidden';
103
+ /** @constant {string} localStorage key — Reveal toggle state for Data tab (#R7 reveal) */
104
+ var REVEAL_STORAGE_KEY = '__gina_inspector_reveal';
103
105
 
104
106
  /**
105
107
  * Tab order definitions for each layout preset.
@@ -150,6 +152,10 @@
150
152
  var logs = [];
151
153
  /** @type {number} Read offset into `source.__ginaLogs` for client-side polling */
152
154
  var logsOff = 0;
155
+ /** @type {?Array} Last-seen `source.__ginaLogs` array reference — used to detect
156
+ * opener navigation, which replaces the array with a fresh empty one. When the
157
+ * reference changes, {@link logsOff} must be reset to 0. */
158
+ var _lastLogsRef = null;
153
159
  /** @type {boolean} When true, new log entries are not appended */
154
160
  var paused = false;
155
161
  /** @type {string} JSON.stringify of last processed ginaData — for change detection */
@@ -164,6 +170,15 @@
164
170
  var autoExpand = false;
165
171
  /** @type {?number} Timeout ID for the coalesced log render timer */
166
172
  var _renderTimer = null;
173
+ /** @type {boolean} When true, the Data tab uses the unredacted snapshot fetched from `/_gina/reveal` (#R7 reveal) */
174
+ var _revealActive = false;
175
+ /** @type {?Object} Cached unredacted Inspector payload from `/_gina/reveal` (local scope only) */
176
+ var _revealedData = null;
177
+ /** @type {?EventSource} Passive `/_gina/agent` subscription used alongside opener
178
+ * polling to receive pushed data/log frames from SPA (pushState/XHR) navigations
179
+ * that do not rewrite `window.__ginaData`. Null when no opener is available
180
+ * or when agent mode (`?target=`) is the primary source. */
181
+ var _passiveAgentEs = null;
167
182
 
168
183
  // ── Log row selection ──────────────────────────────────────────────────
169
184
  /** @type {Set<number>} IDs of currently selected log rows */
@@ -1666,8 +1681,12 @@
1666
1681
 
1667
1682
  captureFoldState(name);
1668
1683
 
1669
- var u = ginaData.user || {};
1670
- var g = ginaData.gina || {};
1684
+ // #R7 reveal when active, swap in the unredacted payload fetched from
1685
+ // /_gina/reveal. Only Data/View/Forms/Query/Flow render from `u`/`g`,
1686
+ // so a single source swap covers every visible field.
1687
+ var src = (_revealActive && _revealedData) ? _revealedData : ginaData;
1688
+ var u = src.user || {};
1689
+ var g = src.gina || {};
1671
1690
  var content = '';
1672
1691
  var hasXhr = typeof u['data-xhr'] !== 'undefined';
1673
1692
 
@@ -1731,7 +1750,8 @@
1731
1750
  */
1732
1751
  function renderRaw(treeEl) {
1733
1752
  if (!ginaData) { treeEl.innerHTML = '<span class="bm-hint">No data to display</span>'; return; }
1734
- var u = ginaData.user || {};
1753
+ var src = (_revealActive && _revealedData) ? _revealedData : ginaData;
1754
+ var u = src.user || {};
1735
1755
  var data = u['data-xhr'] || u.data;
1736
1756
  treeEl.innerHTML = '<pre class="bm-raw-view">' + escHtml(JSON.stringify(data, null, 2)) + '</pre>';
1737
1757
  }
@@ -2866,6 +2886,108 @@
2866
2886
  captureFoldState('data');
2867
2887
  }
2868
2888
 
2889
+ // ── Reveal toggle (Data tab only — local scope only) ──────────────────
2890
+
2891
+ /**
2892
+ * Show or hide the Reveal button based on the current scope. The button is
2893
+ * only available when the source bundle is running in `local` scope — the
2894
+ * server-side endpoint enforces the same gate, this is just the UI mirror.
2895
+ * Called after every data poll since scope can change when switching
2896
+ * sources via the standalone Inspector `?target=` mode.
2897
+ * @inner
2898
+ */
2899
+ function updateRevealVisibility() {
2900
+ var btn = qs('#bm-reveal');
2901
+ if (!btn) return;
2902
+ var scope = (ginaData && ginaData.gina && ginaData.gina.environment)
2903
+ ? ginaData.gina.environment.scope : null;
2904
+ if (scope === 'local') {
2905
+ btn.classList.remove('bm-hidden');
2906
+ } else {
2907
+ btn.classList.add('bm-hidden');
2908
+ // If we previously revealed in local and the source flipped to a
2909
+ // non-local scope, drop the cache and visual state immediately.
2910
+ if (_revealActive) {
2911
+ _revealActive = false;
2912
+ _revealedData = null;
2913
+ btn.classList.remove('active');
2914
+ try { localStorage.removeItem(REVEAL_STORAGE_KEY); } catch (e) {}
2915
+ }
2916
+ }
2917
+ }
2918
+
2919
+ /**
2920
+ * Toggle the Data tab reveal state. When activated, fetches the unredacted
2921
+ * payload from `/_gina/reveal` and re-renders the Data tab. The endpoint
2922
+ * is scope-gated server-side — a 403 means the bundle is no longer in
2923
+ * local scope and the toggle is forced off.
2924
+ * @inner
2925
+ */
2926
+ function toggleReveal() {
2927
+ var btn = qs('#bm-reveal');
2928
+ if (!btn) return;
2929
+ if (_revealActive) {
2930
+ _revealActive = false;
2931
+ _revealedData = null;
2932
+ btn.classList.remove('active');
2933
+ try { localStorage.removeItem(REVEAL_STORAGE_KEY); } catch (e) {}
2934
+ renderTab('data');
2935
+ return;
2936
+ }
2937
+ // Resolve the reveal URL. Three modes:
2938
+ // 1. Standalone (`?target=<bundle_url>`) — route to the explicit target.
2939
+ // 2. Opener (same-origin) — use the opener's pathname as the prefix so
2940
+ // the request routes to the bundle that rendered the current page.
2941
+ // Critical in proxy-routed multi-bundle setups where bare
2942
+ // `/_gina/reveal` hits the proxy's default bundle instead of the
2943
+ // one that produced the snapshot.
2944
+ // 3. Fallback — strip `_gina/inspector` from the Inspector's own
2945
+ // pathname (same approach as tryServerLogs).
2946
+ var base = '';
2947
+ try {
2948
+ var params = new URLSearchParams(window.location.search);
2949
+ var target = (params.get('target') || '').replace(/\/+$/, '');
2950
+ if (target) {
2951
+ base = target;
2952
+ } else if (window.opener && window.opener.location) {
2953
+ base = (window.opener.location.pathname || '').replace(/\/+$/, '');
2954
+ } else {
2955
+ base = window.location.pathname.replace(/\/_gina\/inspector.*$/, '').replace(/\/+$/, '');
2956
+ }
2957
+ } catch (e) {
2958
+ base = window.location.pathname.replace(/\/_gina\/inspector.*$/, '').replace(/\/+$/, '');
2959
+ }
2960
+ var url = base + '/_gina/reveal';
2961
+ var xhr = new XMLHttpRequest();
2962
+ try {
2963
+ xhr.open('GET', url, true);
2964
+ xhr.onreadystatechange = function () {
2965
+ if (xhr.readyState !== 4) return;
2966
+ if (xhr.status === 200) {
2967
+ try {
2968
+ _revealedData = JSON.parse(xhr.responseText);
2969
+ _revealActive = true;
2970
+ btn.classList.add('active');
2971
+ try { localStorage.setItem(REVEAL_STORAGE_KEY, '1'); } catch (e) {}
2972
+ renderTab('data');
2973
+ } catch (e) {
2974
+ _revealedData = null;
2975
+ _revealActive = false;
2976
+ btn.classList.remove('active');
2977
+ }
2978
+ } else if (xhr.status === 403) {
2979
+ // Scope flipped server-side — sync the UI.
2980
+ btn.classList.add('bm-hidden');
2981
+ btn.classList.remove('active');
2982
+ _revealActive = false;
2983
+ _revealedData = null;
2984
+ try { localStorage.removeItem(REVEAL_STORAGE_KEY); } catch (e) {}
2985
+ }
2986
+ };
2987
+ xhr.send();
2988
+ } catch (e) { /* network error — leave state untouched */ }
2989
+ }
2990
+
2869
2991
  // ── Download modal ────────────────────────────────────────────────────
2870
2992
 
2871
2993
  /**
@@ -2875,7 +2997,8 @@
2875
2997
  */
2876
2998
  function openDownloadModal() {
2877
2999
  if (!ginaData || !ginaData.user) return;
2878
- var u = ginaData.user;
3000
+ var src = (_revealActive && _revealedData) ? _revealedData : ginaData;
3001
+ var u = src.user || {};
2879
3002
  var dataObj = u['data-xhr'] || u.data;
2880
3003
  if (!dataObj || typeof dataObj !== 'object') return;
2881
3004
 
@@ -2902,7 +3025,8 @@
2902
3025
  */
2903
3026
  function doDownload() {
2904
3027
  if (!ginaData || !ginaData.user) return;
2905
- var u = ginaData.user;
3028
+ var src = (_revealActive && _revealedData) ? _revealedData : ginaData;
3029
+ var u = src.user || {};
2906
3030
  var dataObj = u['data-xhr'] || u.data;
2907
3031
  var checks = qsa('#bm-dl-checks input:checked');
2908
3032
  var result = {};
@@ -3080,6 +3204,7 @@
3080
3204
  }
3081
3205
  qs('#bm-no-source').classList.add('hidden');
3082
3206
  renderEnvironmentInfo();
3207
+ updateRevealVisibility();
3083
3208
  var tab = activeTab();
3084
3209
  if (tab !== 'logs') renderTab(tab);
3085
3210
  // Always update query tab badge regardless of active tab
@@ -3214,7 +3339,16 @@
3214
3339
  try {
3215
3340
  if (source === 'localStorage' || !source) return;
3216
3341
  var src = source.__ginaLogs;
3217
- if (!src || !Array.isArray(src) || src.length <= logsOff) return;
3342
+ if (!src || !Array.isArray(src)) return;
3343
+ // Detect opener navigation: the new page installs a fresh __ginaLogs
3344
+ // array, so the array identity differs from the one we last polled
3345
+ // (or its length is smaller than our offset). Reset the offset so
3346
+ // new entries on the new page are picked up.
3347
+ if (src !== _lastLogsRef || src.length < logsOff) {
3348
+ _lastLogsRef = src;
3349
+ logsOff = 0;
3350
+ }
3351
+ if (src.length <= logsOff) return;
3218
3352
  } catch (e) { return; }
3219
3353
 
3220
3354
  var fresh = src.slice(logsOff);
@@ -3536,6 +3670,7 @@
3536
3670
  document.title = 'Inspector — ' + (env.bundle || '?') + '@' + (env.env || '?');
3537
3671
  qs('#bm-no-source').classList.add('hidden');
3538
3672
  renderEnvironmentInfo();
3673
+ updateRevealVisibility();
3539
3674
  var tab = activeTab();
3540
3675
  if (tab !== 'logs') renderTab(tab);
3541
3676
  if (tab !== 'query') {
@@ -3587,6 +3722,125 @@
3587
3722
  return true;
3588
3723
  }
3589
3724
 
3725
+ // ── Passive /_gina/agent subscription (opener mode) ──────────────────
3726
+
3727
+ /**
3728
+ * Open a parallel `/_gina/agent` SSE subscription alongside opener polling.
3729
+ *
3730
+ * Opener polling alone misses SPA (pushState) and XHR navigations because
3731
+ * those paths do not rewrite `window.__ginaData` — only full HTML renders
3732
+ * do. `render-json.js` however emits `process.emit('inspector#data', ...)`
3733
+ * on every JSON render when `process.gina._inspectorActive` is true, and
3734
+ * `/_gina/agent` forwards those emits as `event: data` SSE frames.
3735
+ *
3736
+ * This function subscribes to that same stream in the background while
3737
+ * `source` stays set to the opener window. The data handler updates the
3738
+ * Inspector UI but does NOT change `source`, so opener-driven behaviour
3739
+ * (reveal URL derivation, pollData fallback, log polling) is unchanged.
3740
+ *
3741
+ * Server-side logs arrive on this stream too (`event: log`), so when
3742
+ * passive mode succeeds `tryServerLogs()` is skipped to avoid duplicates.
3743
+ *
3744
+ * @inner
3745
+ * @returns {boolean} `true` when a subscription was opened, `false` when
3746
+ * the environment is unsupported or the URL cannot be derived.
3747
+ */
3748
+ function tryAgentPassive() {
3749
+ if (typeof EventSource === 'undefined') return false;
3750
+ // Agent mode already covers data + logs via the primary tryAgent stream.
3751
+ if (source === 'agent') return false;
3752
+
3753
+ // Derive the bundle URL the same way toggleReveal() does: prefer the
3754
+ // opener's pathname so multi-bundle proxy setups route to the bundle
3755
+ // that rendered the current page, falling back to stripping the
3756
+ // inspector path.
3757
+ var base = '';
3758
+ try {
3759
+ if (window.opener && window.opener.location) {
3760
+ base = (window.opener.location.pathname || '').replace(/\/+$/, '');
3761
+ } else {
3762
+ base = window.location.pathname.replace(/\/_gina\/inspector.*$/, '').replace(/\/+$/, '');
3763
+ }
3764
+ } catch (e) {
3765
+ base = window.location.pathname.replace(/\/_gina\/inspector.*$/, '').replace(/\/+$/, '');
3766
+ }
3767
+ var url = base + '/_gina/agent';
3768
+
3769
+ try {
3770
+ var es = new EventSource(url);
3771
+ _passiveAgentEs = es;
3772
+
3773
+ es.addEventListener('data', function (ev) {
3774
+ try {
3775
+ var gd = JSON.parse(ev.data);
3776
+ if (!gd) return;
3777
+ var str = JSON.stringify(gd);
3778
+ if (str === lastGdStr) return;
3779
+ showLoader();
3780
+ lastGdStr = str;
3781
+ ginaData = gd;
3782
+ var env = (gd.user && gd.user.environment) || {};
3783
+ qs('#bm-label').textContent = (env.bundle || '?') + '@' + (env.env || '?');
3784
+ qs('#bm-dot').className = 'bm-dot ok';
3785
+ try {
3786
+ var _pageUrl = (window.opener && window.opener.location)
3787
+ ? window.opener.location.pathname + window.opener.location.search
3788
+ : null;
3789
+ document.title = _pageUrl
3790
+ ? 'Inspector — ' + _pageUrl
3791
+ : 'Inspector — ' + (env.bundle || '?') + '@' + (env.env || '?');
3792
+ } catch (e) {
3793
+ document.title = 'Inspector — ' + (env.bundle || '?') + '@' + (env.env || '?');
3794
+ }
3795
+ qs('#bm-no-source').classList.add('hidden');
3796
+ renderEnvironmentInfo();
3797
+ updateRevealVisibility();
3798
+ var tab = activeTab();
3799
+ if (tab !== 'logs') renderTab(tab);
3800
+ if (tab !== 'query') {
3801
+ var _u = gd.user || {};
3802
+ var _hasXhr = typeof _u['data-xhr'] !== 'undefined';
3803
+ var _qd = _hasXhr && _u['data-xhr'] && _u['data-xhr'].queries
3804
+ ? _u['data-xhr'].queries : _u.queries;
3805
+ updateQueryToolbar(_qd || null);
3806
+ }
3807
+ if (tab !== 'view') {
3808
+ var _u2 = gd.user || {};
3809
+ var _isXhr2 = typeof _u2['view-xhr'] !== 'undefined';
3810
+ var _vm = getPageMetrics(_isXhr2);
3811
+ var _dxhr = typeof _u2['data-xhr'] !== 'undefined';
3812
+ var _vq = _dxhr && _u2['data-xhr'] && _u2['data-xhr'].queries
3813
+ ? _u2['data-xhr'].queries : _u2.queries;
3814
+ updateViewDot(checkPerfAnomalies(_vm, _vq || []));
3815
+ }
3816
+ hideLoader();
3817
+ } catch (e) {}
3818
+ });
3819
+
3820
+ es.addEventListener('log', function (ev) {
3821
+ if (paused) return;
3822
+ try {
3823
+ var entry = JSON.parse(ev.data);
3824
+ entry._id = ++_logIdCounter;
3825
+ logs.push(entry);
3826
+ if (logs.length > MAX_LOG_ENTRIES) logs.shift();
3827
+ updateLogDot([entry]);
3828
+ scheduleRender();
3829
+ } catch (e) {}
3830
+ });
3831
+
3832
+ es.onerror = function () {
3833
+ // EventSource reconnects automatically. Opener polling is the
3834
+ // primary source here, so no UI state change is needed.
3835
+ };
3836
+ } catch (e) {
3837
+ _passiveAgentEs = null;
3838
+ return false;
3839
+ }
3840
+
3841
+ return true;
3842
+ }
3843
+
3590
3844
  // ── Copy to clipboard ──────────────────────────────────────────────────
3591
3845
 
3592
3846
  /**
@@ -4117,6 +4371,23 @@
4117
4371
  }
4118
4372
  var dlBtn = qs('#bm-download');
4119
4373
  if (dlBtn) dlBtn.addEventListener('click', openDownloadModal);
4374
+ var revealBtn = qs('#bm-reveal');
4375
+ if (revealBtn) {
4376
+ revealBtn.addEventListener('click', toggleReveal);
4377
+ // Restore the previously-saved Reveal state on init: if it was on
4378
+ // and the source is still local, fetch the unredacted snapshot.
4379
+ try {
4380
+ if (localStorage.getItem(REVEAL_STORAGE_KEY) === '1') {
4381
+ // Defer one tick so ginaData is populated by the first poll.
4382
+ setTimeout(function () {
4383
+ var scope = (ginaData && ginaData.gina && ginaData.gina.environment)
4384
+ ? ginaData.gina.environment.scope : null;
4385
+ if (scope === 'local') toggleReveal();
4386
+ else { try { localStorage.removeItem(REVEAL_STORAGE_KEY); } catch (e) {} }
4387
+ }, 250);
4388
+ }
4389
+ } catch (e) {}
4390
+ }
4120
4391
  var dlCancel = qs('#bm-dl-cancel');
4121
4392
  if (dlCancel) dlCancel.addEventListener('click', function () { qs('#bm-dl-modal').classList.add('hidden'); });
4122
4393
  var dlConfirm = qs('#bm-dl-confirm');
@@ -4432,12 +4703,68 @@
4432
4703
  setupScrollToTop();
4433
4704
 
4434
4705
  // ── Refresh button — force immediate re-poll ────────────────────────
4706
+ // Click = soft refresh (data, live indexes, reveal snapshot,
4707
+ // passive agent stream).
4708
+ // Shift+click = also reload the inspected page via window.opener.
4435
4709
  var refreshBtn = qs('#bm-refresh');
4436
4710
  if (refreshBtn) {
4437
- refreshBtn.addEventListener('click', function () {
4711
+ refreshBtn.addEventListener('click', function (ev) {
4438
4712
  lastGdStr = '';
4439
4713
  refreshBtn.classList.add('spinning');
4440
4714
  pollData();
4715
+
4716
+ // Bypass the cache guard in fetchLiveIndexes().
4717
+ _liveIndexes = null;
4718
+ _liveIndexesFetching = false;
4719
+ fetchLiveIndexes();
4720
+
4721
+ if (_revealActive) {
4722
+ var base = '';
4723
+ try {
4724
+ var params = new URLSearchParams(window.location.search);
4725
+ var target = (params.get('target') || '').replace(/\/+$/, '');
4726
+ if (target) {
4727
+ base = target;
4728
+ } else if (window.opener && window.opener.location) {
4729
+ base = (window.opener.location.pathname || '').replace(/\/+$/, '');
4730
+ } else {
4731
+ base = window.location.pathname.replace(/\/_gina\/inspector.*$/, '').replace(/\/+$/, '');
4732
+ }
4733
+ } catch (e) {
4734
+ base = window.location.pathname.replace(/\/_gina\/inspector.*$/, '').replace(/\/+$/, '');
4735
+ }
4736
+ try {
4737
+ var xhr = new XMLHttpRequest();
4738
+ xhr.open('GET', base + '/_gina/reveal', true);
4739
+ xhr.onreadystatechange = function () {
4740
+ if (xhr.readyState !== 4) return;
4741
+ if (xhr.status === 200) {
4742
+ try {
4743
+ _revealedData = JSON.parse(xhr.responseText);
4744
+ renderTab('data');
4745
+ } catch (e) {}
4746
+ }
4747
+ };
4748
+ xhr.send();
4749
+ } catch (e) {}
4750
+ }
4751
+
4752
+ // Reopen the passive /_gina/agent stream if it has closed.
4753
+ if (source !== 'agent'
4754
+ && (!_passiveAgentEs || _passiveAgentEs.readyState === 2)) {
4755
+ try { if (_passiveAgentEs) _passiveAgentEs.close(); } catch (e) {}
4756
+ _passiveAgentEs = null;
4757
+ tryAgentPassive();
4758
+ }
4759
+
4760
+ if (ev.shiftKey) {
4761
+ try {
4762
+ if (window.opener && !window.opener.closed && window.opener.location) {
4763
+ window.opener.location.reload();
4764
+ }
4765
+ } catch (e) {}
4766
+ }
4767
+
4441
4768
  refreshBtn.addEventListener('animationend', function onEnd() {
4442
4769
  refreshBtn.classList.remove('spinning');
4443
4770
  refreshBtn.removeEventListener('animationend', onEnd);
@@ -4490,7 +4817,13 @@
4490
4817
  }
4491
4818
 
4492
4819
  tryEngineIO();
4493
- tryServerLogs();
4820
+ // Subscribe to /_gina/agent in parallel with opener polling. Opener
4821
+ // polling alone misses SPA (pushState) and XHR renders because
4822
+ // those paths never rewrite window.__ginaData. The passive agent
4823
+ // stream delivers pushed data + log frames from those renders.
4824
+ // It also supersedes tryServerLogs() (same `event: log` frames).
4825
+ var _passiveAgentActive = tryAgentPassive();
4826
+ if (!_passiveAgentActive) tryServerLogs();
4494
4827
  }
4495
4828
 
4496
4829
  // ── Persist window geometry on resize/move ──────────────────────────
@@ -810,7 +810,13 @@ function Config(opt, contextResetNeeded) {
810
810
  // loading env if exists
811
811
  if ( self.isCacheless() ) {
812
812
  if (exists) {
813
- delete require.cache[require.resolve(_(filename, true))];
813
+ try {
814
+ delete require.cache[require.resolve(_(filename, true))];
815
+ } catch (_cacheErr) {
816
+ // requireJSON reads via fs.readFileSync and evicts its own cache.
817
+ // Filesystem races (e.g. OrbStack bind mount) can make require.resolve()
818
+ // throw EINVAL on readlink for freshly re-symlinked bundles dirs — non-fatal.
819
+ }
814
820
  }
815
821
  }
816
822
  // if (new RegExp('\.'+ env +'\.json$').test(fName)) {
@@ -839,7 +845,11 @@ function Config(opt, contextResetNeeded) {
839
845
  try {
840
846
 
841
847
  if (isCacheless && exists) {
842
- delete require.cache[require.resolve(_(filename, true))];
848
+ try {
849
+ delete require.cache[require.resolve(_(filename, true))];
850
+ } catch (_cacheErr) {
851
+ // See note above — EINVAL/ENOENT on require.resolve from symlink races is non-fatal.
852
+ }
843
853
  }
844
854
 
845
855
  if (exists) {
@@ -53,7 +53,13 @@ var routingLib = lib.routing;
53
53
  // removed: Domain import + domainLib instantiation — domainLib was never used in active code
54
54
  // (only usage at line 508 is commented out); re-instantiating Domain on every dev-mode request
55
55
  // via refreshCoreDependencies() caused [DOMAIN] PSL Loaded ×2 noise per request
56
- var swig = require('@rhinostone/swig');
56
+ // Swig is resolved through lib.swigResolver (process-cached on
57
+ // process.gina._swig). Server.js's initSwigEngine() populates the cache
58
+ // during bundle startup; controller.js is re-required on every request
59
+ // in dev mode via refreshCoreDependencies(), so this getter sees the
60
+ // already-loaded instance without re-running the resolver. Falls back to
61
+ // require('@rhinostone/swig') when no bundle has loaded yet (tests, etc).
62
+ var swig = lib.swigResolver.get();
57
63
  const { type } = require('node:os');
58
64
  var SwigFilters = lib.SwigFilters;
59
65
  var statusCodes = requireJSON( _( getPath('gina').core + '/status.codes') );
@@ -1037,12 +1043,38 @@ function SuperController(options) {
1037
1043
  if (_hints) self.setEarlyHints(_hints);
1038
1044
  }
1039
1045
 
1046
+ // Dispatch to the render delegate matching the bundle's configured
1047
+ // template engine. `settings.json > render.engine` defaults to "swig"
1048
+ // so existing bundles see zero change; "nunjucks" routes through
1049
+ // controller.render-nunjucks.js (MVP — see that file for the list of
1050
+ // deferred features relative to render-swig). The render-nunjucks
1051
+ // delegate fetches the nunjucks module itself via
1052
+ // `lib.nunjucksResolver.get()`, so the `swig` / `SwigFilters` deps
1053
+ // passed below are harmless when unused.
1054
+ var _engine = 'swig';
1055
+ try {
1056
+ var _settings = local.options
1057
+ && local.options.conf
1058
+ && local.options.conf.content
1059
+ && local.options.conf.content.settings;
1060
+ if (_settings && _settings.render && _settings.render.engine) {
1061
+ _engine = _settings.render.engine;
1062
+ }
1063
+ } catch (e) { /* fall back to default 'swig' */ }
1064
+
1065
+ var _delegate = (_engine === 'nunjucks')
1066
+ ? '/controller.render-nunjucks'
1067
+ : '/controller.render-swig';
1068
+
1040
1069
  if (this.isCacheless() ) {
1041
1070
  delete require.cache[require.resolve( _(__dirname + '/controller.render-v1', true))];
1042
1071
  delete require.cache[require.resolve( _(__dirname + '/controller.render-swig', true))];
1072
+ try {
1073
+ delete require.cache[require.resolve( _(__dirname + '/controller.render-nunjucks', true))];
1074
+ } catch (e) { /* nunjucks delegate may not exist on older framework dirs */ }
1043
1075
  }
1044
1076
 
1045
- return require( _(__dirname + '/controller.render-swig', true) )(userData, displayInspector, errOptions, {
1077
+ return require( _(__dirname + _delegate, true) )(userData, displayInspector, errOptions, {
1046
1078
  self : self,
1047
1079
  local : local,
1048
1080
  getData : getData,
@@ -3196,30 +3228,64 @@ if ( /^local$/i.test(process.env.NODE_SCOPE) ) {
3196
3228
  client.setTimeout(0); // disable the default timeout to keep session active
3197
3229
 
3198
3230
  client.on('error', (error) => {
3199
- if (_pingInterval) { clearInterval(_pingInterval); _pingInterval = null; }
3200
- console.error( '`'+ options[':path']+ '` : '+ error.stack||error.message);
3201
- cache.delete(sessKey);
3202
- var _errIdx = self.serverInstance._http2Sessions.indexOf(sessKey);
3203
- if (_errIdx !== -1) self.serverInstance._http2Sessions.splice(_errIdx, 1);
3204
- _errIdx = null;
3205
- if (
3206
- typeof(error.cause) != 'undefined' && typeof(error.cause.code) != 'undefined' && /ECONNREFUSED|ECONNRESET/.test(error.cause.code)
3207
- || /ECONNREFUSED|ECONNRESET/.test(error.code)
3208
- ) {
3209
-
3210
- var port = getContext('gina').ports[options.protocol][options.scheme.replace(/\:/, '')][ options.port ];
3211
- if ( typeof(port) != 'undefined' ) {
3212
- error.accessPoint = port;
3213
- error.message = 'Could not connect to [ ' + error.accessPoint + ' ].\nThe `'+port.split(/\@/)[0]+'` bundle is offline or unreachable.\n';
3231
+ // #H9 the whole listener body is wrapped in try/catch so that a throw
3232
+ // from enhancement (undefined options.protocol/scheme), cache mutation,
3233
+ // or self.throwError cannot escape an 'error' event and become an
3234
+ // uncaughtException that crashes the bundle.
3235
+ try {
3236
+ if (_pingInterval) { clearInterval(_pingInterval); _pingInterval = null; }
3237
+ try { console.error( '`'+ (options && options[':path']) +'` : '+ (error && (error.stack || error.message) || error)); } catch (_logErr) {}
3238
+ try {
3239
+ cache.delete(sessKey);
3240
+ var _errIdx = self.serverInstance._http2Sessions.indexOf(sessKey);
3241
+ if (_errIdx !== -1) self.serverInstance._http2Sessions.splice(_errIdx, 1);
3242
+ _errIdx = null;
3243
+ } catch (_cleanupErr) {
3244
+ console.error('[HTTP2] Session cleanup failed in error handler: ' + (_cleanupErr.stack || _cleanupErr.message));
3214
3245
  }
3246
+ if (
3247
+ error && (
3248
+ (typeof(error.cause) != 'undefined' && typeof(error.cause.code) != 'undefined' && /ECONNREFUSED|ECONNRESET/.test(error.cause.code))
3249
+ || /ECONNREFUSED|ECONNRESET/.test(error.code)
3250
+ )
3251
+ ) {
3252
+ // #H9 — safe-navigate the port lookup; callers sometimes pass a bare
3253
+ // hostname so options.protocol/options.scheme are undefined and the
3254
+ // original `ports[undefined][undefined.replace(...)]` chain threw a
3255
+ // TypeError from inside this error listener.
3256
+ try {
3257
+ var _ginaCtx = (typeof getContext === 'function') ? getContext('gina') : null;
3258
+ var _portsMap = (_ginaCtx && _ginaCtx.ports && options && options.protocol)
3259
+ ? _ginaCtx.ports[options.protocol] : null;
3260
+ var _schemeKey = (options && options.scheme && typeof options.scheme.replace === 'function')
3261
+ ? options.scheme.replace(/\:/, '') : null;
3262
+ var _schemeMap = (_portsMap && _schemeKey) ? _portsMap[_schemeKey] : null;
3263
+ var port = (_schemeMap && options) ? _schemeMap[options.port] : undefined;
3264
+ if ( typeof(port) != 'undefined' && port !== null ) {
3265
+ error.accessPoint = port;
3266
+ var _bundleName = (typeof port === 'string') ? port.split(/\@/)[0] : String(port);
3267
+ error.message = 'Could not connect to [ ' + error.accessPoint + ' ].\nThe `'+ _bundleName +'` bundle is offline or unreachable.\n';
3268
+ }
3269
+ } catch (_enhErr) {
3270
+ console.error('[HTTP2] Error while enhancing connect-error message: ' + (_enhErr.stack || _enhErr.message));
3271
+ }
3272
+ }
3273
+ // local.req/res may be null when the error fires outside a request context
3274
+ // (background socket event) — log and return instead of crashing
3275
+ if (!local.req || !local.res) {
3276
+ console.error('[HTTP2] Session error outside request context — cannot send error response.\n' + (error && (error.stack || error.message) || error));
3277
+ return;
3278
+ }
3279
+ try {
3280
+ self.throwError(error);
3281
+ } catch (_throwErr) {
3282
+ console.error('[HTTP2] self.throwError failed in error handler: ' + (_throwErr.stack || _throwErr.message));
3283
+ }
3284
+ } catch (_handlerErr) {
3285
+ // Last-resort swallow — throwing from an 'error' listener crashes the
3286
+ // process. Log and return so the session failure stays contained.
3287
+ try { console.error('[HTTP2] Uncaught failure inside error listener: ' + (_handlerErr.stack || _handlerErr.message)); } catch (_) {}
3215
3288
  }
3216
- // local.req/res may be null when the error fires outside a request context
3217
- // (background socket event) — log and return instead of crashing
3218
- if (!local.req || !local.res) {
3219
- console.error('[HTTP2] Session error outside request context — cannot send error response.\n' + (error.stack || error.message));
3220
- return;
3221
- }
3222
- self.throwError(error);
3223
3289
  return;
3224
3290
  });
3225
3291
 
@@ -278,14 +278,30 @@ module.exports = function renderJSON(jsonObj, deps) {
278
278
  // The resolved redact config is exposed under `gina.inspectorRedact`
279
279
  // so the standalone Inspector can mirror the same rules client-side.
280
280
  var _jsonRedactConf = inspectorRedact.getConfig(local.options.conf);
281
+ // #INS8 — expose the standalone Inspector URL (null when unset).
282
+ var _jsonInspUrl = null;
283
+ try {
284
+ var _jsonConfSource = local.options.conf || {};
285
+ if (_jsonConfSource.content && _jsonConfSource.content.settings
286
+ && _jsonConfSource.content.settings.inspector
287
+ && _jsonConfSource.content.settings.inspector.url) {
288
+ _jsonInspUrl = _jsonConfSource.content.settings.inspector.url;
289
+ }
290
+ } catch (e) { /* leave null */ }
281
291
  var __gdPayload = {
282
292
  gina : { environment: _env, inspectorRedact: {
283
293
  patterns : _jsonRedactConf.patterns,
284
294
  types : _jsonRedactConf.types,
285
295
  replacement : _jsonRedactConf.replacement
286
- }},
296
+ }, inspectorUrl: _jsonInspUrl },
287
297
  user : _gdUser
288
298
  };
299
+ // #R7 — JSON renders do NOT write _lastGinaDataUnredacted. The
300
+ // Reveal UX unmasks the Data tab, which always shows the HTML
301
+ // render payload (sourced from window.opener.__ginaData). JSON
302
+ // polling endpoints would otherwise clobber the HTML snapshot
303
+ // with tiny session/ping payloads between page load and click.
304
+ // Only render-swig.js writes the unredacted slot.
289
305
  __gdPayload = inspectorRedact.redact(__gdPayload, {
290
306
  compiledPatterns : _jsonRedactConf.compiledPatterns,
291
307
  replacement : _jsonRedactConf.replacement