@fulmenhq/tsfulmen 0.3.3 → 0.4.0

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 (123) hide show
  1. package/CHANGELOG.md +51 -1
  2. package/README.md +30 -1
  3. package/config/crucible-ts/taxonomy/metrics.yaml +1 -1
  4. package/dist/appidentity/index.js +9 -2209
  5. package/dist/appidentity/index.js.map +1 -1
  6. package/dist/assets/index.d.ts +179 -0
  7. package/dist/assets/index.js +4 -0
  8. package/dist/assets/index.js.map +1 -0
  9. package/dist/bin/prometheus-cli.js +15 -9139
  10. package/dist/bin/prometheus-cli.js.map +1 -1
  11. package/dist/bin/schema-cli.js +4 -6098
  12. package/dist/bin/schema-cli.js.map +1 -1
  13. package/dist/bin/signals-cli.js +15 -1910
  14. package/dist/bin/signals-cli.js.map +1 -1
  15. package/dist/chunk-3HISR2XI.js +36 -0
  16. package/dist/chunk-3HISR2XI.js.map +1 -0
  17. package/dist/chunk-5HZEJGZ5.js +725 -0
  18. package/dist/chunk-5HZEJGZ5.js.map +1 -0
  19. package/dist/chunk-7SVYOPJ3.js +9412 -0
  20. package/dist/chunk-7SVYOPJ3.js.map +1 -0
  21. package/dist/chunk-BCO3FUUO.js +682 -0
  22. package/dist/chunk-BCO3FUUO.js.map +1 -0
  23. package/dist/chunk-BJDL6JEX.js +208 -0
  24. package/dist/chunk-BJDL6JEX.js.map +1 -0
  25. package/dist/chunk-BTUS6PZZ.js +302 -0
  26. package/dist/chunk-BTUS6PZZ.js.map +1 -0
  27. package/dist/chunk-CW4CSNVF.js +410 -0
  28. package/dist/chunk-CW4CSNVF.js.map +1 -0
  29. package/dist/chunk-HIBZ2AY7.js +194 -0
  30. package/dist/chunk-HIBZ2AY7.js.map +1 -0
  31. package/dist/chunk-HS4F3BRR.js +985 -0
  32. package/dist/chunk-HS4F3BRR.js.map +1 -0
  33. package/dist/chunk-HY6JQOFN.js +32 -0
  34. package/dist/chunk-HY6JQOFN.js.map +1 -0
  35. package/dist/chunk-K2FYT43R.js +837 -0
  36. package/dist/chunk-K2FYT43R.js.map +1 -0
  37. package/dist/chunk-K7BMFGQP.js +43 -0
  38. package/dist/chunk-K7BMFGQP.js.map +1 -0
  39. package/dist/chunk-LWAH2UG7.js +103 -0
  40. package/dist/chunk-LWAH2UG7.js.map +1 -0
  41. package/dist/chunk-OHE2AOH4.js +273 -0
  42. package/dist/chunk-OHE2AOH4.js.map +1 -0
  43. package/dist/chunk-P3DNOZOG.js +1488 -0
  44. package/dist/chunk-P3DNOZOG.js.map +1 -0
  45. package/dist/chunk-PQ6TKPUN.js +27 -0
  46. package/dist/chunk-PQ6TKPUN.js.map +1 -0
  47. package/dist/chunk-QCCN6POA.js +211 -0
  48. package/dist/chunk-QCCN6POA.js.map +1 -0
  49. package/dist/chunk-RSLFR4TO.js +631 -0
  50. package/dist/chunk-RSLFR4TO.js.map +1 -0
  51. package/dist/chunk-UP2VWCW5.js +33 -0
  52. package/dist/chunk-UP2VWCW5.js.map +1 -0
  53. package/dist/chunk-W6TQFTTY.js +130 -0
  54. package/dist/chunk-W6TQFTTY.js.map +1 -0
  55. package/dist/chunk-WSMVLWLB.js +269 -0
  56. package/dist/chunk-WSMVLWLB.js.map +1 -0
  57. package/dist/config/index.js +6 -1220
  58. package/dist/config/index.js.map +1 -1
  59. package/dist/crucible/fulpack/index.js +2 -25
  60. package/dist/crucible/fulpack/index.js.map +1 -1
  61. package/dist/crucible/index.js +13 -1129
  62. package/dist/crucible/index.js.map +1 -1
  63. package/dist/docscribe/index.js +2 -680
  64. package/dist/docscribe/index.js.map +1 -1
  65. package/dist/errors/index.js +5 -1831
  66. package/dist/errors/index.js.map +1 -1
  67. package/dist/errors-D7KXV3QW.js +4 -0
  68. package/dist/errors-D7KXV3QW.js.map +1 -0
  69. package/dist/errors-RBJX6ETJ.js +8 -0
  70. package/dist/errors-RBJX6ETJ.js.map +1 -0
  71. package/dist/export-BWRETGYS.js +6 -0
  72. package/dist/export-BWRETGYS.js.map +1 -0
  73. package/dist/foundry/index.js +340 -3949
  74. package/dist/foundry/index.js.map +1 -1
  75. package/dist/foundry/similarity/index.js +3 -134
  76. package/dist/foundry/similarity/index.js.map +1 -1
  77. package/dist/fulencode/index.js +3 -319
  78. package/dist/fulencode/index.js.map +1 -1
  79. package/dist/fulhash/index.js +3 -611
  80. package/dist/fulhash/index.js.map +1 -1
  81. package/dist/fulpack/index.js +3 -1515
  82. package/dist/fulpack/index.js.map +1 -1
  83. package/dist/hash-YOJYVOWH.js +4 -0
  84. package/dist/hash-YOJYVOWH.js.map +1 -0
  85. package/dist/index.d.ts +1 -1
  86. package/dist/index.js +14 -4395
  87. package/dist/index.js.map +1 -1
  88. package/dist/loader-H5K7HSO5.js +9 -0
  89. package/dist/loader-H5K7HSO5.js.map +1 -0
  90. package/dist/logging/index.js +2 -723
  91. package/dist/logging/index.js.map +1 -1
  92. package/dist/pathfinder/index.js +18 -2341
  93. package/dist/pathfinder/index.js.map +1 -1
  94. package/dist/prom-client-PNEBGD3G.js +4801 -0
  95. package/dist/prom-client-PNEBGD3G.js.map +1 -0
  96. package/dist/reports/license-inventory.csv +1 -1
  97. package/dist/schema/index.d.ts +19 -6
  98. package/dist/schema/index.js +4 -6148
  99. package/dist/schema/index.js.map +1 -1
  100. package/dist/signals/index.js +8 -2767
  101. package/dist/signals/index.js.map +1 -1
  102. package/dist/similarity/index.js +3 -134
  103. package/dist/similarity/index.js.map +1 -1
  104. package/dist/telemetry/http/index.js +9 -930
  105. package/dist/telemetry/http/index.js.map +1 -1
  106. package/dist/telemetry/index.js +4 -1561
  107. package/dist/telemetry/index.js.map +1 -1
  108. package/dist/telemetry/prometheus/index.js +7 -8422
  109. package/dist/telemetry/prometheus/index.js.map +1 -1
  110. package/dist/validator-U4CKD2Y3.js +6 -0
  111. package/dist/validator-U4CKD2Y3.js.map +1 -0
  112. package/package.json +5 -1
  113. package/schemas/crucible-ts/library/module-manifest/v1.0.0/module-manifest.schema.json +1 -1
  114. package/schemas/crucible-ts/observability/logging/v1.0.0/definitions.schema.json +1 -1
  115. package/schemas/crucible-ts/observability/logging/v1.0.0/log-event.schema.json +13 -13
  116. package/schemas/crucible-ts/observability/logging/v1.0.0/logger-config.schema.json +2 -2
  117. package/schemas/crucible-ts/observability/logging/v1.0.0/logging-policy.schema.json +1 -1
  118. package/schemas/crucible-ts/observability/logging/v1.0.0/middleware-config.schema.json +2 -2
  119. package/schemas/crucible-ts/observability/logging/v1.0.0/severity-filter.schema.json +3 -3
  120. package/schemas/crucible-ts/upstream/3leaps/crucible/PROVENANCE.md +3 -3
  121. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/catalog/classifiers/README.md +1 -1
  122. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/classifiers-framework.md +1 -1
  123. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/data-sensitivity-classification.md +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/foundry/signals/config-reload-endpoint.ts","../src/foundry/signals/control-discovery-endpoint.ts","../src/foundry/signals/convenience.ts","../src/foundry/signals/double-tap.ts","../src/foundry/signals/windows.ts","../src/foundry/signals/guards.ts","../src/foundry/signals/http-helper.ts","../src/foundry/signals/manager.ts","../src/foundry/signals/reload.ts"],"names":["onReload","generateCorrelationId"],"mappings":";;;;;AAgDO,SAAS,2BACd,OAAA,EAIyF;AACzF,EAAA,MAAM,EAAE,QAAQ,SAAA,EAAW,QAAA,EAAAA,WAAU,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAU,GAAI,OAAA;AAE5E,EAAA,OAAO,OAAO,SAA8B,GAAA,KAAiB;AAC3D,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,cAAA,IAAkB,qBAAA,EAAsB;AAEtE,IAAA,MAAM,UAAA,GAAyB,MAAM,IAAA,CAAK,GAAG,CAAA;AAC7C,IAAA,IAAI,CAAC,WAAW,aAAA,EAAe;AAC7B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,KAAK,+CAAA,EAAiD;AAAA,UAC3D,cAAA,EAAgB,aAAA;AAAA,UAChB,QAAQ,UAAA,CAAW;AAAA,SACpB,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,KAAK,yCAAA,EAA2C;AAAA,UACxD,cAAA,EAAgB;AAAA,SACjB,CAAA;AAAA,MACH;AAEA,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA,EAAO,uBAAA;AAAA,QACP,OAAA,EAAS,WAAW,MAAA,IAAU,yBAAA;AAAA,QAC9B,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,WAAW,QAAA,IAAY,SAAA;AAExC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,eAAA,GAAkB,MAAM,SAAA,CAAU,QAAQ,CAAA;AAChD,MAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,CAAO,KAAK,6CAAA,EAA+C;AAAA,YACzD,cAAA,EAAgB,aAAA;AAAA,YAChB;AAAA,WACD,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,SAAA,CAAU,KAAK,0CAAA,EAA4C;AAAA,YACzD,cAAA,EAAgB;AAAA,WACjB,CAAA;AAAA,QACH;AAEA,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAO,qBAAA;AAAA,UACP,OAAA,EAAS,8CAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,KAAK,8CAAA,EAAgD;AAAA,QAC7D,cAAA,EAAgB;AAAA,OACjB,CAAA;AAAA,IACH;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,EAAO;AAE5B,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,UAAA,GAAa,MAAM,SAAA,CAAU,MAAM,CAAA;AACzC,QAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,MAAA,CAAO,KAAK,2CAAA,EAA6C;AAAA,cACvD,cAAA,EAAgB,aAAA;AAAA,cAChB,WAAA,EAAa,UAAA,CAAW,MAAA,EAAQ,MAAA,IAAU;AAAA,aAC3C,CAAA;AAAA,UACH;AAEA,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,SAAA,CAAU,KAAK,6CAAA,EAA+C;AAAA,cAC5D,cAAA,EAAgB,aAAA;AAAA,cAChB,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH;AAEA,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,OAAA;AAAA,YACR,KAAA,EAAO,mBAAA;AAAA,YACP,OAAA,EAAS,iCAAA;AAAA,YACT,mBAAmB,UAAA,CAAW,MAAA;AAAA,YAC9B,UAAA,EAAY;AAAA,WACd;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAIA,SAAAA,EAAU;AACZ,QAAA,MAAMA,UAAS,MAAM,CAAA;AAAA,MACvB;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,KAAK,6CAAA,EAA+C;AAAA,UAC5D,cAAA,EAAgB;AAAA,SACjB,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,KAAK,yCAAA,EAA2C;AAAA,UACrD,cAAA,EAAgB,aAAA;AAAA,UAChB,QAAQ,OAAA,CAAQ;AAAA,SACjB,CAAA;AAAA,MACH;AAEA,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,UAAA;AAAA,QACR,cAAA,EAAgB,aAAA;AAAA,QAChB,OAAA,EAAS,wBAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACd;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,KAAK,uCAAA,EAAyC;AAAA,UACnD,cAAA,EAAgB,aAAA;AAAA,UAChB,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,KAAK,0CAAA,EAA4C;AAAA,UACzD,cAAA,EAAgB,aAAA;AAAA,UAChB,UAAA,EAAY,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,YAAY,IAAA,GAAO;AAAA,SAC/D,CAAA;AAAA,MACH;AAEA,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA,EAAO,eAAA;AAAA,QACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,QAC9D,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF,CAAA;AACF;AAEA,SAAS,qBAAA,GAAgC;AACvC,EAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACxE;;;AC/IO,SAAS,+BAA+B,OAAA,EAM7C;AACA,EAAA,MAAM,EAAE,UAAU,OAAA,EAAS,SAAA,EAAW,MAAM,WAAA,EAAa,MAAA,EAAQ,WAAU,GAAI,OAAA;AAE/E,EAAA,OAAO,OAAO,GAAA,KAAiB;AAC7B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,UAAA,GAAyB,MAAM,IAAA,CAAK,GAAG,CAAA;AAC7C,MAAA,IAAI,CAAC,WAAW,aAAA,EAAe;AAC7B,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,CAAO,KAAK,mDAAA,EAAqD;AAAA,YAC/D,QAAQ,UAAA,CAAW;AAAA,WACpB,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,SAAA,CAAU,KAAK,sCAAA,EAAwC;AAAA,YACrD,OAAA,EAAS,SAAS,GAAA,CAAI;AAAA,WACvB,CAAA;AAAA,QACH;AAEA,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAO,uBAAA;AAAA,UACP,OAAA,EAAS,WAAW,MAAA,IAAU,yBAAA;AAAA,UAC9B,UAAA,EAAY;AAAA,SACd;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,KAAK,iCAAA,EAAmC;AAAA,QAChD,OAAA,EAAS,SAAS,GAAA,CAAI;AAAA,OACvB,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,EAAE,QAAA,EAAU,SAAS,CAAA;AAEtD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,SAAS,GAAA,CAAI,WAAA;AAAA,QACnB,MAAA,EAAQ,SAAS,GAAA,CAAI,MAAA;AAAA,QACrB;AAAA,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,QAAQ,OAAA,CAAQ,IAAA;AAAA,QACtB,OAAA,EAAS,QAAQ,OAAA,CAAQ,OAAA;AAAA,QACzB,QAAA,EAAU,QAAQ,QAAA,CAAS,EAAA;AAAA,QAC3B,IAAA,EAAM,QAAQ,QAAA,CAAS;AAAA,OACzB;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,SAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACd;AAAA,EACF,CAAA;AACF;;;ACtFA,eAAsB,UAAA,CACpB,OAAA,EACA,OAAA,EACA,OAAA,GAA0B,EAAC,EACZ;AACf,EAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,SAAA,EAAW,OAAA,EAAS,OAAO,CAAA;AAClD,EAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AACnD;AAqBA,eAAsB,QAAA,CACpB,OAAA,EACA,OAAA,EACA,OAAA,GAA0B,EAAC,EACZ;AACf,EAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AACnD;AAmBA,eAAsB,MAAA,CACpB,OAAA,EACA,OAAA,EACA,OAAA,GAA0B,EAAC,EACZ;AACf,EAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,SAAA,EAAW,OAAA,EAAS,OAAO,CAAA;AACpD;AAmBA,eAAsB,MAAA,CACpB,OAAA,EACA,OAAA,EACA,OAAA,GAA0B,EAAC,EACZ;AACf,EAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,SAAA,EAAW,OAAA,EAAS,OAAO,CAAA;AACpD;AAmBA,eAAsB,eAAA,CACpB,OAAA,EACA,OAAA,EACA,OAAA,GAA0B,EAAC,EACZ;AACf,EAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,SAAA,EAAW,OAAA,EAAS,OAAO,CAAA;AACpD;AAYA,eAAsB,aAAA,CACpB,OAAA,EACA,OAAA,EACA,OAAA,GAA0B,EAAC,EACZ;AACf,EAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,SAAA,EAAW,OAAA,EAAS,OAAO,CAAA;AAClD,EAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AACjD,EAAA,MAAM,OAAA,CAAQ,QAAA,CAAS,SAAA,EAAW,OAAA,EAAS,OAAO,CAAA;AACpD;;;ACjGA,eAAsB,sBAAA,CACpB,UAAA,EACA,MAAA,GAA0B,EAAC,EACF;AACzB,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,UAAU,CAAA;AAGzC,EAAA,MAAM,eAAA,GAAkB,MAAA,EAAQ,yBAAA,GAC5B,MAAA,CAAO,4BAA4B,GAAA,GACnC,GAAA;AACJ,EAAA,MAAM,eAAA,GAAkB,QAAQ,oBAAA,IAAwB,GAAA;AACxD,EAAA,MAAM,kBAAA,GACJ,QAAQ,kBAAA,IAAsB,4CAAA;AAEhC,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,IAAA;AAAA,IACd,QAAA,EAAU,OAAO,QAAA,IAAY,eAAA;AAAA,IAC7B,QAAA,EAAU,OAAO,QAAA,IAAY,eAAA;AAAA,IAC7B,WAAA,EAAa,OAAO,WAAA,IAAe,kBAAA;AAAA,IACnC,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,QAAA,EAAU,OAAO,QAAA,IAAY;AAAA,GAC/B;AACF;AAWO,SAAS,gBAAgB,KAAA,EAAgC;AAC9D,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,EAAA,IAAI,KAAA,CAAM,iBAAiB,IAAA,EAAM;AAC/B,IAAA,KAAA,CAAM,YAAA,GAAe,GAAA;AACrB,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,WAAW,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,YAAA;AAC5B,EAAA,IAAI,OAAA,GAAU,MAAM,QAAA,EAAU;AAE5B,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,KAAA,CAAM,MAAA,CAAO,KAAK,mBAAmB,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,mBAAmB,CAAA;AAAA,IACjC;AAEA,IAAA,IAAI,CAAC,MAAM,QAAA,EAAU;AACnB,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,KAAA,CAAM,YAAA,GAAe,GAAA;AACrB,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAAA,EACrC,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAM,WAAW,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,eAAe,KAAA,EAA6B;AAC1D,EAAA,KAAA,CAAM,YAAA,GAAe,IAAA;AACvB;AAOO,SAAS,eAAe,KAAA,EAAgC;AAC7D,EAAA,IAAI,KAAA,CAAM,iBAAiB,IAAA,EAAM;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,YAAA;AACnC,EAAA,OAAO,UAAU,KAAA,CAAM,QAAA;AACzB;AAOO,SAAS,uBAAuB,KAAA,EAAsC;AAC3E,EAAA,IAAI,KAAA,CAAM,iBAAiB,IAAA,EAAM;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,YAAA;AACnC,EAAA,MAAM,SAAA,GAAY,MAAM,QAAA,GAAW,OAAA;AACnC,EAAA,OAAO,SAAA,GAAY,IAAI,SAAA,GAAY,IAAA;AACrC;;;AClHA,IAAM,aAAA,GAAgC;AAAA,EACpC,IAAA,CAAK,SAAiB,IAAA,EAAgC;AACpD,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,IAC5B,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,IACtB;AAAA,EACF,CAAA;AAAA,EACA,IAAA,CAAK,SAAiB,IAAA,EAAgC;AACpD,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,IAC5B,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,IACtB;AAAA,EACF;AACF,CAAA;AAgBA,eAAsB,qBAAA,CACpB,UAAA,EACA,OAAA,GAAkC,EAAC,EACH;AAChC,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,UAAU,CAAA;AAGzC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,kBAAkB,IAAA,EAAM;AACjC,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,IAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAGA,EAAA,MAAM,WAAW,MAAA,CAAO,gBAAA;AACxB,EAAA,IAAI,CAAC,QAAA,EAAU;AAEb,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAA;AAAA,MACX,QAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,aAAA;AACjC,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAI1B,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,QAAQ,MAAA,CAAO,IAAA;AAAA,IACf,QAAA,EAAU,SAAA;AAAA,IACV,UAAU,QAAA,CAAS,iBAAA;AAAA,IACnB,gBAAgB,QAAA,CAAS;AAAA,GAC3B;AAGA,EAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,WAAA,EAAa,OAAO,CAAA;AAGzC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,SAAA,CAAU,IAAA,CAAK,QAAA,CAAS,eAAA,EAAiB,QAAA,CAAS,cAAc,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,QAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AACF;AASA,eAAsB,oBAAoB,UAAA,EAAqD;AAC7F,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,UAAU,CAAA;AACzC,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,gBAAA,EAAkB;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,gBAAA;AAChB;AAUA,eAAsB,iBAAiB,UAAA,EAAsC;AAC3E,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,UAAU,CAAA;AACzC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,aAAA,KAAkB,IAAA,IAAQ,MAAA,CAAO,gBAAA,KAAqB,MAAA;AACtE;AAUA,eAAsB,wBAAwB,UAAA,EAA4C;AACxF,EAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoB,UAAU,CAAA;AACrD,EAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,iBAAA,KAAsB,qBAAA,EAAuB;AACrE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA,CAAS,cAAA;AAClB;;;AC7JA,eAAsB,eAAA,CACpB,UAAA,EACA,OAAA,GAAwB,EAAC,EACV;AACf,EAAA,MAAM,EAAE,eAAA,GAAkB,IAAA,EAAK,GAAI,OAAA;AAGnC,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,UAAU,CAAA;AACzC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,mBAAA,CAAoB,aAAA;AAAA,MACxB,SAAA;AAAA,MACA,WAAW,UAAU,CAAA,2GAAA;AAAA,KAEvB;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,MAAM,cAAA,CAAe,UAAU,CAAA;AACjD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,GAAU,CAAA,OAAA,EAAU,MAAA,CAAO,IAAI,CAAA,kCAAA,CAAA;AAEnC,EAAA,IAAI,SAAA,MAAe,eAAA,EAAiB;AAClC,IAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoB,UAAU,CAAA;AACrD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAA,IAAW,CAAA,EAAA,EAAK,SAAS,WAAW,CAAA,CAAA;AAGpC,MAAA,QAAQ,SAAS,iBAAA;AAAmB,QAClC,KAAK,qBAAA;AACH,UAAA,OAAA,IAAW,CAAA,qBAAA,EAAwB,SAAS,cAAc,CAAA,CAAA;AAC1D,UAAA;AAAA,QACF,KAAK,oBAAA;AACH,UAAA,OAAA,IAAW,CAAA,eAAA,EAAkB,SAAS,cAAc,CAAA,CAAA;AACpD,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,OAAA,IAAW,CAAA,eAAA,EAAkB,SAAS,cAAc,CAAA,CAAA;AACpD,UAAA;AAAA;AACJ,IACF;AAAA,EACF;AAEA,EAAA,MAAM,mBAAA,CAAoB,aAAA,CAAc,SAAA,EAAW,OAAO,CAAA;AAC5D;AAiBO,SAAS,8BAAA,GAAuC;AACrD,EAAA,IAAI,CAAC,SAAQ,EAAG;AACd,IAAA,MAAM,mBAAA,CAAoB,aAAA;AAAA,MACxB,SAAA;AAAA,MACA;AAAA,KAGF;AAAA,EACF;AACF;AAUO,SAAS,WAAA,GAAoB;AAClC,EAAA,IAAI,CAAC,SAAQ,EAAG;AACd,IAAA,MAAM,mBAAA,CAAoB,aAAA;AAAA,MACxB,SAAA;AAAA,MACA;AAAA,KAEF;AAAA,EACF;AACF;AAUO,SAAS,aAAA,GAAsB;AACpC,EAAA,IAAI,CAAC,WAAU,EAAG;AAChB,IAAA,MAAM,mBAAA,CAAoB,aAAA;AAAA,MACxB,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;ACCO,SAAS,qBACd,OAAA,EAI6E;AAC7E,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAM,WAAW,MAAA,EAAQ,SAAA,EAAW,gBAAe,GAAI,OAAA;AAExE,EAAA,OAAO,OAAO,SAAwB,GAAA,KAAiB;AACrD,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,cAAA,IAAkBC,sBAAAA,EAAsB;AAGtE,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAG,CAAA;AACjC,IAAA,IAAI,CAAC,WAAW,aAAA,EAAe;AAC7B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,KAAK,wCAAA,EAA0C;AAAA,UACpD,cAAA,EAAgB,aAAA;AAAA,UAChB,QAAQ,UAAA,CAAW;AAAA,SACpB,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,KAAK,yCAAA,EAA2C;AAAA,UACxD,cAAA,EAAgB;AAAA,SACjB,CAAA;AAAA,MACH;AAEA,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA,EAAO,uBAAA;AAAA,QACP,OAAA,EAAS,WAAW,MAAA,IAAU,yBAAA;AAAA,QAC9B,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,WAAW,QAAA,IAAY,SAAA;AAGxC,IAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA,EAAO,iBAAA;AAAA,QACP,OAAA,EAAS,yBAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,OAAA,CAAQ,MAAM,CAAA;AAGrD,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,QAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,OAAA,GAAA,CAAW,kBAAkB,cAAA,EAAgB,GAAA,CAAI,CAAC,CAAA,KAAM,mBAAA,CAAoB,CAAC,CAAC,CAAA;AAEpF,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,EAAG;AACjC,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA,EAAO,gBAAA;AAAA,QACP,OAAA,EAAS,WAAW,OAAA,CAAQ,MAAM,uCAAuC,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QAC3F,aAAA,EAAe,OAAA;AAAA,QACf,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,MAAM,cAAA,CAAe,UAAU,CAAA;AACjD,IAAA,IAAI,CAAC,SAAA,EAAW;AAGd,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,KAAA,EAAO,sBAAA;AAAA,QACP,OAAA,EAAS,UAAU,UAAU,CAAA,kCAAA,CAAA;AAAA,QAC7B,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,eAAA,GAAkB,MAAM,SAAA,CAAU,QAAA,EAAU,UAAU,CAAA;AAC5D,MAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,CAAO,KAAK,sCAAA,EAAwC;AAAA,YAClD,cAAA,EAAgB,aAAA;AAAA,YAChB,QAAA;AAAA,YACA,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,SAAA,CAAU,KAAK,0CAAA,EAA4C;AAAA,YACzD,cAAA,EAAgB,aAAA;AAAA,YAChB,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AAEA,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAO,qBAAA;AAAA,UACP,OAAA,EAAS,8CAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACd;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,KAAK,kCAAA,EAAoC;AAAA,QAC9C,cAAA,EAAgB,aAAA;AAAA,QAChB,QAAA;AAAA,QACA,MAAA,EAAQ,UAAA;AAAA,QACR,QAAQ,OAAA,CAAQ;AAAA,OACjB,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,KAAK,6CAAA,EAA+C;AAAA,QAC5D,cAAA,EAAgB,aAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAIA,IAAA,KAAK,QAAQ,OAAA,CAAQ,UAAU,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAChD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,KAAK,iCAAA,EAAmC;AAAA,UAC7C,cAAA,EAAgB,aAAA;AAAA,UAChB,MAAA,EAAQ,UAAA;AAAA,UACR,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,UAAA;AAAA,MACR,cAAA,EAAgB,aAAA;AAAA,MAChB,OAAA,EAAS,yCAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACd;AAAA,EACF,CAAA;AACF;AAOA,SAAS,oBAAoB,MAAA,EAAwB;AACnD,EAAA,MAAM,KAAA,GAAQ,OAAO,WAAA,EAAY;AACjC,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAM,KAAK,CAAA,CAAA;AACpB;AAKA,SAASA,sBAAAA,GAAgC;AACvC,EAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACxE;AAgBO,SAAS,sBAAsB,aAAA,EAAiC;AACrE,EAAA,OAAO,CAAC,GAAA,KAAiB;AACvB,IAAA,MAAM,UAAW,GAAA,CAA6C,OAAA;AAC9D,IAAA,MAAM,UAAA,GAAa,OAAA,EAAS,aAAA,IAAiB,OAAA,EAAS,aAAA;AAEtD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,KAAA;AAAA,QACf,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,MAAM,CAAC,MAAA,EAAQ,KAAK,CAAA,GAAI,UAAA,CAAW,MAAM,GAAG,CAAA;AAC5C,IAAA,IAAI,MAAA,KAAW,QAAA,IAAY,KAAA,KAAU,aAAA,EAAe;AAClD,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,KAAA;AAAA,QACf,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,IAAA;AAAA,MACf,QAAA,EAAU;AAAA,KACZ;AAAA,EACF,CAAA;AACF;AAgBO,SAAS,wBAAwB,iBAAA,EAA0C;AAChF,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAsB;AAC3C,EAAA,MAAM,QAAA,GAAW,GAAA;AAEjB,EAAA,OAAO,CAAC,QAAA,KAAqB;AAC3B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,GAAA,GAAM,QAAA;AAGZ,IAAA,IAAI,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,GAAG,KAAK,EAAC;AAGvC,IAAA,UAAA,GAAa,WAAW,MAAA,CAAO,CAAC,EAAA,KAAO,GAAA,GAAM,KAAK,QAAQ,CAAA;AAG1D,IAAA,IAAI,UAAA,CAAW,UAAU,iBAAA,EAAmB;AAC1C,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,GAAG,UAAU,CAAA;AAC9C,MAAA,MAAM,UAAU,eAAA,GAAkB,QAAA;AAElC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,CAAA;AAAA,QACX,QAAA,EAAU;AAAA,OACZ;AAAA,IACF;AAGA,IAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AACnB,IAAA,QAAA,CAAS,GAAA,CAAI,KAAK,UAAU,CAAA;AAE5B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAW,oBAAoB,UAAA,CAAW,MAAA;AAAA,MAC1C,UAAU,GAAA,GAAM;AAAA,KAClB;AAAA,EACF,CAAA;AACF;;;AClTO,IAAM,gBAAN,MAAoB;AAAA,EACjB,QAAA,uBAAiD,GAAA,EAAI;AAAA,EACrD,eAAA,uBAAqE,GAAA,EAAI;AAAA,EACzE,OAAA;AAAA,EAIA,gBAAA,GAAmB,CAAA;AAAA,EACnB,iBAAA,uBAAqD,GAAA,EAAI;AAAA,EACzD,YAAA,GAAe,KAAA;AAAA,EAEvB,WAAA,CAAY,OAAA,GAAgC,EAAC,EAAG;AAC9C,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB,GAAA;AAAA,MAC9C,eAAA,EAAiB,QAAQ,eAAA,IAAmB,kBAAA;AAAA,MAC5C,QAAA,EAAU,QAAQ,QAAA,IAAY,KAAA;AAAA,MAC9B,iBAAA,EAAmB,QAAQ,iBAAA,IAAqB,GAAA;AAAA,MAChD,iBAAA,EAAmB,QAAQ,iBAAA,IAAqB,GAAA;AAAA,MAChD,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,WAAW,OAAA,CAAQ;AAAA,KACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAA,CACJ,MAAA,EACA,OAAA,EACA,OAAA,GAA0B,EAAC,EACZ;AACf,IAAA,MAAM,UAAA,GAAa,OAAO,MAAA,KAAW,QAAA,GAAW,MAAA,GAAS,MAAA;AAGzD,IAAA,MAAM,SAAA,GAAY,MAAM,cAAA,CAAe,UAAU,CAAA;AACjD,IAAA,IAAI,CAAC,SAAA,EAAW;AAEd,MAAA,IAAI,WAAU,EAAG;AACf,QAAA,MAAM,sBAAsB,UAAA,EAAY;AAAA,UACtC,MAAA,EAAQ,KAAK,OAAA,CAAQ,MAAA;AAAA,UACrB,SAAA,EAAW,KAAK,OAAA,CAAQ;AAAA,SACzB,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAA,EAAY,EAAE,CAAA;AAAA,IAClC;AAGA,IAAA,MAAM,YAAA,GAAkC;AAAA,MACtC,MAAA,EAAQ,UAAA;AAAA,MACR,OAAA;AAAA,MACA,QAAA,EAAU,QAAQ,QAAA,IAAY,CAAA;AAAA,MAC9B,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,OAAA,CAAQ,gBAAA;AAAA,MAC7C,IAAI,OAAA,CAAQ,EAAA,IAAM,CAAA,QAAA,EAAW,EAAE,KAAK,gBAAgB,CAAA,CAAA;AAAA,MACpD,YAAA,EAAc,KAAK,GAAA;AAAI,KACzB;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAC7C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,UAAU,CAAA,CAAE,CAAA;AAAA,IACzE;AACA,IAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAG1B,IAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,IAAI,CAAA,CAAE,QAAA,KAAa,CAAA,CAAE,QAAA,EAAU;AAC7B,QAAA,OAAO,CAAA,CAAE,WAAW,CAAA,CAAE,QAAA;AAAA,MACxB;AACA,MAAA,OAAO,CAAA,CAAE,eAAe,CAAA,CAAE,YAAA;AAAA,IAC5B,CAAC,CAAA;AAGD,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,UAAU,CAAA,EAAG;AACzC,MAAA,MAAM,IAAA,CAAK,uBAAuB,UAAU,CAAA;AAAA,IAC9C;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,2BAAA,EAA8B,UAAU,CAAA,CAAA,EAAI;AAAA,QACnE,YAAY,YAAA,CAAa,EAAA;AAAA,QACzB,UAAU,YAAA,CAAa,QAAA;AAAA,QACvB,YAAY,YAAA,CAAa;AAAA,OAC1B,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,kCAAA,EAAoC;AAAA,QAC9D,MAAA,EAAQ,UAAA;AAAA,QACR,YAAY,YAAA,CAAa,EAAA;AAAA,QACzB,QAAA,EAAU,MAAA,CAAO,YAAA,CAAa,QAAQ;AAAA,OACvC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,uBAAuB,UAAA,EAAmC;AACtE,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,UAAU,CAAA;AACzC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAe,OAAO,gBAAA,KAAqB,mCAAA;AAEjD,IAAA,IAAI,YAAA,EAAc;AAEhB,MAAA,MAAM,OAAA,GAAU,MAAM,sBAAA,CAAuB,UAAA,EAAY;AAAA,QACvD,QAAA,EAAU,KAAK,OAAA,CAAQ,iBAAA;AAAA,QACvB,QAAA,EAAU,KAAK,OAAA,CAAQ,iBAAA;AAAA,QACvB,MAAA,EAAQ,KAAK,OAAA,CAAQ,MAAA;AAAA,QACrB,QAAA,EAAU,KAAK,OAAA,CAAQ;AAAA,OACxB,CAAA;AACD,MAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA;AAAA,IAChD;AAGA,IAAA,MAAM,QAAA,GAAW,OAAO,GAAA,KAAwB;AAE9C,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,UAAU,CAAA;AACrD,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,SAAA,GAAY,gBAAgB,OAAO,CAAA;AACzC,UAAA,IAAI,SAAA,EAAW;AAEb,YAAA;AAAA,UACF;AAAA,QAEF;AAAA,MACF;AAGA,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,UAAA,EAAY,GAAG,CAAA;AAAA,IAC5C,CAAA;AAGA,IAAA,OAAA,CAAQ,EAAA,CAAG,YAA8B,QAAQ,CAAA;AACjD,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,UAAA,EAAY,QAAQ,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAA,CAAgB,UAAA,EAAoB,MAAA,EAAuC;AACvF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AAC7C,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACtC,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAGpB,IAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,UAAU,CAAA,CAAA,EAAI;AAAA,QACzD,eAAe,QAAA,CAAS;AAAA,OACzB,CAAA;AAAA,IACH;AAGA,IAAA,KAAA,MAAW,gBAAgB,QAAA,EAAU;AACnC,MAAA,IAAI;AAEF,QAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,YAAA,EAAc,MAAM,CAAA;AAAA,MACpD,SAAS,KAAA,EAAO;AAEd,QAAA,IAAI,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvB,UAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,uBAAA,EAA0B,UAAU,CAAA,CAAA,EAAI;AAAA,YAC/D,YAAY,YAAA,CAAa,EAAA;AAAA,YACzB,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,WAC7D,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,UAAA,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,6BAAA,EAA+B;AAAA,YACzD,MAAA,EAAQ,UAAA;AAAA,YACR,YAAY,YAAA,CAAa,EAAA;AAAA,YACzB,UAAA,EAAY,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,YAAY,IAAA,GAAO;AAAA,WAC/D,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,eAAA,KAAoB,YAAA,EAAc;AACjD,UAAA,MAAM,QAAA,GAAA,CAAY,MAAM,SAAA,CAAU,UAAU,IAAI,SAAA,IAAa,CAAA;AAC7D,UAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU;AAC1B,YAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,UACvB;AACA,UAAA;AAAA,QACF;AAAA,MAEF;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,UAAU,CAAA;AACrD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,cAAA,CAAe,OAAO,CAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAA,CACZ,YAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,cAAA,GAAiB,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AACvD,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,YAAA,CAAa,SAAS,IAAI,CAAC,CAAA;AAAA,MAC3E,CAAA,EAAG,aAAa,SAAS,CAAA;AAAA,IAC3B,CAAC,CAAA;AAED,IAAA,MAAM,iBAAiB,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAa,OAAA,CAAQ,MAAM,CAAC,CAAA;AAEnE,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,cAAA,EAAgB,cAAc,CAAC,CAAA;AAGnD,MAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,QAAA,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,iCAAA,EAAmC;AAAA,UAC7D,QAAQ,YAAA,CAAa,MAAA;AAAA,UACrB,YAAY,YAAA,CAAa;AAAA,SAC1B,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,IAAA,CAAK,QAAQ,SAAA,EAAW;AAC1B,QAAA,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,+BAAA,EAAiC;AAAA,UAC3D,QAAQ,YAAA,CAAa,MAAA;AAAA,UACrB,YAAY,YAAA,CAAa,EAAA;AAAA,UACzB,UAAA,EAAY,MAAA,CAAO,YAAA,CAAa,SAAS;AAAA,SAC1C,CAAA;AAAA,MACH;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAA,CAAW,QAAgB,OAAA,EAA+B;AACxD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACzC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,EAAS;AAEX,MAAA,MAAM,QAAQ,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,OAAO,CAAA;AAC7D,MAAA,IAAI,UAAU,EAAA,EAAI;AAChB,QAAA,QAAA,CAAS,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,QAAA,CAAS,MAAA,GAAS,CAAA;AAAA,IACpB;AAGA,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AAChD,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAA,CAAQ,GAAA,CAAI,QAA0B,QAAQ,CAAA;AAC9C,QAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,MAAM,CAAA;AAAA,MACpC;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,EAAyB;AACpC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACzC,IAAA,OAAO,QAAA,KAAa,MAAA,IAAa,QAAA,CAAS,MAAA,GAAS,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAAA,EAAwB;AACtC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACzC,IAAA,OAAO,UAAU,MAAA,IAAU,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAQ,MAAA,EAA+B;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACzC,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAQ,MAAwB,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA0B;AAE9B,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,QAAQ,KAAK,IAAA,CAAK,eAAA,CAAgB,SAAQ,EAAG;AAC/D,MAAA,OAAA,CAAQ,GAAA,CAAI,QAA0B,QAAQ,CAAA;AAAA,IAChD;AAGA,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,kBAAkB,KAAA,EAAM;AAC7B,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AACF;AAOO,SAAS,mBAAA,CAAoB,OAAA,GAAgC,EAAC,EAAkB;AACrF,EAAA,OAAO,IAAI,cAAc,OAAO,CAAA;AAClC;;;ACnVO,SAAS,0BACd,OAAA,EACqB;AACrB,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA,GAAW,GAAA;AAAA,IACX,MAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA,GAAW;AAAA,GACb,GAAI,OAAA;AAEJ,EAAA,OAAO,YAAY;AAEjB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,KAAK,kCAAkC,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,KAAK,uCAAA,EAAyC;AAAA,QACtD,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,MAAM,MAAA,EAAO;AAG/B,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,SAAS,CAAA;AAExC,MAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AAEjB,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,CAAO,KAAK,2DAAA,EAA6D;AAAA,YACvE,WAAA,EAAa,MAAA,CAAO,MAAA,EAAQ,MAAA,IAAU,CAAA;AAAA,YACtC,QAAQ,MAAA,CAAO;AAAA,WAChB,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,SAAA,CAAU,KAAK,sCAAA,EAAwC;AAAA,YACrD,MAAA,EAAQ,QAAA;AAAA,YACR,MAAA,EAAQ,mBAAA;AAAA,YACR,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,UAAU,CAAC;AAAA,WAC/C,CAAA;AAAA,QACH;AAEA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,KAAK,mDAAmD,CAAA;AAAA,MACjE;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,KAAK,sCAAA,EAAwC;AAAA,UACrD,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,YAAY,SAAS,CAAA;AAAA,MAC7B;AAGA,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,MACvB;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA,CAAO,KAAK,kEAAA,EAAoE;AAAA,UAC9E,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,KAAK,mCAAA,EAAqC;AAAA,UAClD,MAAA,EAAQ,QAAA;AAAA,UACR,UAAA,EAAY,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,YAAY,IAAA,GAAO;AAAA,SAC/D,CAAA;AAAA,MACH;AAAA,IAGF;AAAA,EACF,CAAA;AACF;AAQO,IAAM,sBAAN,MAA0B;AAAA,EACvB,QAAA,GAAW,CAAA;AAAA,EACX,eAAA,GAAiC,IAAA;AAAA,EACxB,WAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EAEjB,YAAY,OAAA,EAIT;AACD,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,WAAA,IAAe,CAAA;AAC1C,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAA,GAAyB;AACvB,IAAA,IAAA,CAAK,QAAA,EAAA;AACL,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,GAAA,EAAI;AAEhC,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,WAAA,EAAa;AACrC,MAAA,IAAI,KAAK,MAAA,EAAQ;AACf,QAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UACV,CAAA,EAAG,KAAK,QAAQ,CAAA,yDAAA,CAAA;AAAA,UAChB;AAAA,YACE,eAAe,IAAA,CAAK,QAAA;AAAA,YACpB,WAAW,IAAA,CAAK;AAAA;AAClB,SACF;AAAA,MACF;AAEA,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,IAAA,CAAK,SAAA,CAAU,KAAK,gDAAA,EAAkD;AAAA,UACpE,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,UACnC,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,WAAW;AAAA,SACnC,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAAoC;AAClC,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AACF","file":"chunk-HS4F3BRR.js","sourcesContent":["/**\n * HTTP Config Reload Endpoint Helper\n *\n * Framework-agnostic scaffold for POST /admin/config/reload.\n *\n * Unlike the signal-based reload handler, this helper is synchronous from the\n * perspective of the caller (it returns a response object). Applications can\n * choose whether to apply config live or initiate a restart.\n */\n\nimport type { AuthHook, AuthResult, RateLimitResult } from \"./http-helper.js\";\nimport type { ConfigLoader, ConfigValidator } from \"./reload.js\";\nimport type { FallbackLogger, TelemetryEmitter } from \"./windows.js\";\n\nexport interface ConfigReloadRequest {\n reason?: string;\n correlation_id?: string;\n}\n\nexport interface ConfigReloadResponse {\n status: \"reloaded\";\n correlation_id: string;\n message: string;\n}\n\nexport interface ConfigReloadErrorResponse {\n status: \"error\";\n error: string;\n message: string;\n validation_errors?: Array<{ path: string; message: string }>;\n}\n\nexport type ConfigReloadRateLimitHook = (\n identity: string,\n) => Promise<RateLimitResult> | RateLimitResult;\n\nexport interface ConfigReloadEndpointOptions<T = unknown> {\n loader: ConfigLoader<T>;\n validator?: ConfigValidator<T>;\n onReload?: (config: T) => Promise<void> | void;\n\n auth: AuthHook;\n rateLimit?: ConfigReloadRateLimitHook;\n\n logger?: FallbackLogger;\n telemetry?: TelemetryEmitter;\n}\n\nexport function createConfigReloadEndpoint<T = unknown>(\n options: ConfigReloadEndpointOptions<T>,\n): (\n payload: ConfigReloadRequest,\n req: unknown,\n) => Promise<(ConfigReloadResponse | ConfigReloadErrorResponse) & { statusCode?: number }> {\n const { loader, validator, onReload, auth, rateLimit, logger, telemetry } = options;\n\n return async (payload: ConfigReloadRequest, req: unknown) => {\n const correlationId = payload.correlation_id ?? generateCorrelationId();\n\n const authResult: AuthResult = await auth(req);\n if (!authResult.authenticated) {\n if (logger) {\n logger.warn(\"Config reload endpoint: authentication failed\", {\n correlation_id: correlationId,\n reason: authResult.reason,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.config.http_endpoint.auth_failed\", {\n correlation_id: correlationId,\n });\n }\n\n return {\n status: \"error\",\n error: \"authentication_failed\",\n message: authResult.reason || \"Authentication required\",\n statusCode: 401,\n };\n }\n\n const identity = authResult.identity || \"unknown\";\n\n if (rateLimit) {\n const rateLimitResult = await rateLimit(identity);\n if (!rateLimitResult.allowed) {\n if (logger) {\n logger.warn(\"Config reload endpoint: rate limit exceeded\", {\n correlation_id: correlationId,\n identity,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.config.http_endpoint.rate_limited\", {\n correlation_id: correlationId,\n });\n }\n\n return {\n status: \"error\",\n error: \"rate_limit_exceeded\",\n message: \"Rate limit exceeded. Please try again later.\",\n statusCode: 429,\n };\n }\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.config.http_endpoint.reload_requested\", {\n correlation_id: correlationId,\n });\n }\n\n try {\n const config = await loader();\n\n if (validator) {\n const validation = await validator(config);\n if (!validation.valid) {\n if (logger) {\n logger.warn(\"Config reload endpoint: validation failed\", {\n correlation_id: correlationId,\n error_count: validation.errors?.length ?? 0,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.config.http_endpoint.reload_rejected\", {\n correlation_id: correlationId,\n reason: \"validation_failed\",\n });\n }\n\n return {\n status: \"error\",\n error: \"validation_failed\",\n message: \"Configuration validation failed\",\n validation_errors: validation.errors,\n statusCode: 422,\n };\n }\n }\n\n if (onReload) {\n await onReload(config);\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.config.http_endpoint.reload_accepted\", {\n correlation_id: correlationId,\n });\n }\n\n if (logger) {\n logger.info(\"Config reload endpoint: reload accepted\", {\n correlation_id: correlationId,\n reason: payload.reason,\n });\n }\n\n return {\n status: \"reloaded\",\n correlation_id: correlationId,\n message: \"Configuration reloaded\",\n statusCode: 200,\n };\n } catch (error) {\n if (logger) {\n logger.warn(\"Config reload endpoint: reload failed\", {\n correlation_id: correlationId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.config.http_endpoint.reload_error\", {\n correlation_id: correlationId,\n error_type: error instanceof Error ? error.constructor.name : \"unknown\",\n });\n }\n\n return {\n status: \"error\",\n error: \"reload_failed\",\n message: error instanceof Error ? error.message : String(error),\n statusCode: 500,\n };\n }\n };\n}\n\nfunction generateCorrelationId(): string {\n return `cfg-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n","/**\n * HTTP Control Discovery Endpoint Helper\n *\n * Framework-agnostic scaffold for a control-plane discovery endpoint.\n */\n\nimport { buildRuntimeInfo } from \"../../appidentity/runtime.js\";\nimport type { Identity } from \"../../appidentity/types.js\";\nimport type { AuthHook, AuthResult } from \"./http-helper.js\";\nimport type { FallbackLogger, TelemetryEmitter } from \"./windows.js\";\n\nexport interface ControlEndpointDescriptor {\n method: string;\n path: string;\n summary?: string;\n}\n\nexport interface ControlDiscoveryResponse {\n status: \"ok\";\n service: {\n name: string;\n vendor: string;\n version: string;\n };\n runtime: {\n name: string;\n version?: string;\n platform: string;\n arch: string;\n };\n auth_summary?: string;\n endpoints: ControlEndpointDescriptor[];\n}\n\nexport interface ControlDiscoveryErrorResponse {\n status: \"error\";\n error: string;\n message: string;\n}\n\nexport interface ControlDiscoveryEndpointOptions {\n identity: Identity;\n version: string;\n endpoints: ControlEndpointDescriptor[];\n\n auth?: AuthHook;\n authSummary?: string;\n\n logger?: FallbackLogger;\n telemetry?: TelemetryEmitter;\n}\n\nexport function createControlDiscoveryEndpoint(options: ControlDiscoveryEndpointOptions): (\n req: unknown,\n) => Promise<\n (ControlDiscoveryResponse | ControlDiscoveryErrorResponse) & {\n statusCode?: number;\n }\n> {\n const { identity, version, endpoints, auth, authSummary, logger, telemetry } = options;\n\n return async (req: unknown) => {\n if (auth) {\n const authResult: AuthResult = await auth(req);\n if (!authResult.authenticated) {\n if (logger) {\n logger.warn(\"Control discovery endpoint: authentication failed\", {\n reason: authResult.reason,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.control.discovery.auth_failed\", {\n service: identity.app.binary_name,\n });\n }\n\n return {\n status: \"error\",\n error: \"authentication_failed\",\n message: authResult.reason || \"Authentication required\",\n statusCode: 401,\n };\n }\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.control.discovery.served\", {\n service: identity.app.binary_name,\n });\n }\n\n const runtime = buildRuntimeInfo({ identity, version });\n\n return {\n status: \"ok\",\n service: {\n name: identity.app.binary_name,\n vendor: identity.app.vendor,\n version,\n },\n runtime: {\n name: runtime.runtime.name,\n version: runtime.runtime.version,\n platform: runtime.platform.os,\n arch: runtime.platform.arch,\n },\n auth_summary: authSummary,\n endpoints,\n statusCode: 200,\n };\n };\n}\n","/**\n * Signal Handler Convenience Wrappers\n *\n * Common signal handling patterns for shutdown, reload, and custom behaviors.\n */\n\nimport type { HandlerOptions, SignalHandler, SignalManager } from \"./manager.js\";\n\n/**\n * Register a graceful shutdown handler\n *\n * Convenience wrapper for SIGTERM and SIGINT handlers.\n * Automatically registers both signals to the same handler.\n *\n * @param manager - Signal manager instance\n * @param handler - Shutdown handler function\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onShutdown(manager, async () => {\n * await closeDatabase();\n * await flushLogs();\n * });\n * ```\n */\nexport async function onShutdown(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGTERM\", handler, options);\n await manager.register(\"SIGINT\", handler, options);\n}\n\n/**\n * Register a config reload handler\n *\n * Convenience wrapper for SIGHUP handler.\n * Only registers on POSIX platforms (SIGHUP not supported on Windows).\n *\n * @param manager - Signal manager instance\n * @param handler - Reload handler function\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onReload(manager, async () => {\n * const newConfig = await loadConfig();\n * await validateConfig(newConfig);\n * process.exit(129); // Exit for restart\n * });\n * ```\n */\nexport async function onReload(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGHUP\", handler, options);\n}\n\n/**\n * Register a custom handler for SIGUSR1\n *\n * Common use cases: toggle debug logging, reopen log files, dump statistics.\n *\n * @param manager - Signal manager instance\n * @param handler - Custom handler function\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onUSR1(manager, async () => {\n * logger.info('SIGUSR1 received - reopening log files');\n * await reopenLogFiles();\n * });\n * ```\n */\nexport async function onUSR1(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGUSR1\", handler, options);\n}\n\n/**\n * Register a custom handler for SIGUSR2\n *\n * Common use cases: trigger profiling, rotate credentials, toggle verbose mode.\n *\n * @param manager - Signal manager instance\n * @param handler - Custom handler function\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onUSR2(manager, async () => {\n * logger.info('SIGUSR2 received - toggling debug mode');\n * toggleDebugMode();\n * });\n * ```\n */\nexport async function onUSR2(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGUSR2\", handler, options);\n}\n\n/**\n * Register an emergency quit handler\n *\n * Convenience wrapper for SIGQUIT (immediate exit, no cleanup).\n *\n * @param manager - Signal manager instance\n * @param handler - Emergency quit handler\n * @param options - Handler options\n *\n * @example\n * ```typescript\n * await onEmergencyQuit(manager, async () => {\n * logger.error('SIGQUIT received - emergency exit');\n * process.exit(131);\n * });\n * ```\n */\nexport async function onEmergencyQuit(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGQUIT\", handler, options);\n}\n\n/**\n * Register handlers for all common shutdown signals\n *\n * Registers the same handler for SIGTERM, SIGINT, and SIGQUIT.\n * Useful for applications that want consistent shutdown behavior.\n *\n * @param manager - Signal manager instance\n * @param handler - Shutdown handler function\n * @param options - Handler options\n */\nexport async function onAnyShutdown(\n manager: SignalManager,\n handler: SignalHandler,\n options: HandlerOptions = {},\n): Promise<void> {\n await manager.register(\"SIGTERM\", handler, options);\n await manager.register(\"SIGINT\", handler, options);\n await manager.register(\"SIGQUIT\", handler, options);\n}\n","/**\n * Double-Tap Signal Handling\n *\n * Implements Ctrl+C double-tap pattern for graceful shutdown with force-quit option.\n * Per Crucible standard: 2-second window, immediate exit on second signal.\n */\n\nimport { getSignal } from \"./catalog.js\";\nimport type { FallbackLogger } from \"./windows.js\";\n\n/**\n * Double-tap configuration\n */\nexport interface DoubleTapConfig {\n /**\n * Debounce window in milliseconds (default: 2000ms per Crucible standard)\n */\n windowMs?: number;\n\n /**\n * Exit code for forced double-tap exit (default: 130 for SIGINT)\n */\n exitCode?: number;\n\n /**\n * Message to display on first signal (default: from catalog)\n */\n hintMessage?: string;\n\n /**\n * Logger for double-tap events\n */\n logger?: FallbackLogger;\n\n /**\n * Enable test mode (prevents process.exit calls)\n */\n testMode?: boolean;\n}\n\n/**\n * Double-tap state tracker\n */\nexport interface DoubleTapState {\n firstTapTime: number | null;\n windowMs: number;\n exitCode: number;\n hintMessage: string;\n logger?: FallbackLogger;\n testMode: boolean;\n}\n\n/**\n * Create double-tap state tracker for a signal\n *\n * @param signalName - Signal name (typically \"SIGINT\")\n * @param config - Double-tap configuration\n */\nexport async function createDoubleTapTracker(\n signalName: string,\n config: DoubleTapConfig = {},\n): Promise<DoubleTapState> {\n const signal = await getSignal(signalName);\n\n // Get defaults from catalog if available\n const defaultWindowMs = signal?.double_tap_window_seconds\n ? signal.double_tap_window_seconds * 1000\n : 2000;\n const defaultExitCode = signal?.double_tap_exit_code || 130;\n const defaultHintMessage =\n signal?.double_tap_message || \"Press Ctrl+C again within 2s to force quit\";\n\n return {\n firstTapTime: null,\n windowMs: config.windowMs ?? defaultWindowMs,\n exitCode: config.exitCode ?? defaultExitCode,\n hintMessage: config.hintMessage ?? defaultHintMessage,\n logger: config.logger,\n testMode: config.testMode ?? false,\n };\n}\n\n/**\n * Handle double-tap signal logic\n *\n * Returns true if this is the second tap (force-quit), false if first tap.\n * Updates state to track timing between taps.\n *\n * @param state - Double-tap state tracker\n * @returns true if force-quit should proceed, false if graceful shutdown\n */\nexport function handleDoubleTap(state: DoubleTapState): boolean {\n const now = Date.now();\n\n // First tap\n if (state.firstTapTime === null) {\n state.firstTapTime = now;\n if (state.logger) {\n state.logger.info(state.hintMessage);\n } else {\n console.log(state.hintMessage);\n }\n return false; // Start graceful shutdown\n }\n\n // Check if within window\n const elapsed = now - state.firstTapTime;\n if (elapsed < state.windowMs) {\n // Second tap within window - force quit\n if (state.logger) {\n state.logger.info(\"Force quitting...\");\n } else {\n console.log(\"Force quitting...\");\n }\n\n if (!state.testMode) {\n process.exit(state.exitCode);\n }\n\n return true; // Force quit\n }\n\n // Outside window - treat as new first tap\n state.firstTapTime = now;\n if (state.logger) {\n state.logger.info(state.hintMessage);\n } else {\n console.log(state.hintMessage);\n }\n return false; // Start new graceful shutdown\n}\n\n/**\n * Reset double-tap state\n *\n * Called when graceful shutdown completes before second tap.\n */\nexport function resetDoubleTap(state: DoubleTapState): void {\n state.firstTapTime = null;\n}\n\n/**\n * Check if currently within double-tap window\n *\n * Useful for testing and debugging.\n */\nexport function isWithinWindow(state: DoubleTapState): boolean {\n if (state.firstTapTime === null) {\n return false;\n }\n const elapsed = Date.now() - state.firstTapTime;\n return elapsed < state.windowMs;\n}\n\n/**\n * Get time remaining in double-tap window (milliseconds)\n *\n * Returns null if not in a window, otherwise milliseconds remaining.\n */\nexport function getWindowTimeRemaining(state: DoubleTapState): number | null {\n if (state.firstTapTime === null) {\n return null;\n }\n const elapsed = Date.now() - state.firstTapTime;\n const remaining = state.windowMs - elapsed;\n return remaining > 0 ? remaining : null;\n}\n","/**\n * Windows Signal Fallback\n *\n * Implements standardized Windows fallback behavior for unsupported signals.\n * Follows Crucible specification for logging, telemetry, and operational hints.\n */\n\nimport { getSignal } from \"./catalog.js\";\nimport type { WindowsFallback } from \"./types.js\";\n\n/**\n * Windows fallback result\n */\nexport interface WindowsFallbackResult {\n supported: boolean;\n fallback?: WindowsFallback;\n logged: boolean;\n}\n\n/**\n * Logger interface for Windows fallback\n *\n * Applications should provide a logger instance that implements this interface.\n * If no logger is provided, messages are written to console.\n */\nexport interface FallbackLogger {\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n}\n\n/**\n * Telemetry emitter interface\n *\n * Applications should provide a telemetry emitter for observability.\n * If no emitter is provided, telemetry events are skipped.\n */\nexport interface TelemetryEmitter {\n emit(event: string, tags: Record<string, string>): void;\n}\n\n/**\n * Windows fallback options\n */\nexport interface WindowsFallbackOptions {\n logger?: FallbackLogger;\n telemetry?: TelemetryEmitter;\n silent?: boolean; // Skip logging/telemetry (for testing)\n}\n\n/**\n * Default console logger implementation\n */\nconst defaultLogger: FallbackLogger = {\n info(message: string, meta?: Record<string, unknown>) {\n if (meta) {\n console.info(message, meta);\n } else {\n console.info(message);\n }\n },\n warn(message: string, meta?: Record<string, unknown>) {\n if (meta) {\n console.warn(message, meta);\n } else {\n console.warn(message);\n }\n },\n};\n\n/**\n * Handle Windows signal registration fallback\n *\n * This function is called when attempting to register a signal handler\n * on Windows for a signal that lacks native support.\n *\n * Behavior per Crucible standard:\n * 1. Log structured message at INFO level (not WARN - this is expected on Windows)\n * 2. Emit standardized telemetry event (fulmen.signal.unsupported)\n * 3. Return fallback metadata for operational guidance\n *\n * @param signalName - Signal name (e.g., \"SIGHUP\")\n * @param options - Logging and telemetry configuration\n */\nexport async function handleWindowsFallback(\n signalName: string,\n options: WindowsFallbackOptions = {},\n): Promise<WindowsFallbackResult> {\n const signal = await getSignal(signalName);\n\n // Signal not found in catalog\n if (!signal) {\n return {\n supported: false,\n logged: false,\n };\n }\n\n // Signal is supported (has windows_event)\n if (signal.windows_event !== null) {\n return {\n supported: true,\n logged: false,\n };\n }\n\n // Signal is unsupported on Windows - apply fallback\n const fallback = signal.windows_fallback;\n if (!fallback) {\n // No fallback metadata defined (shouldn't happen with valid catalog)\n return {\n supported: false,\n logged: false,\n };\n }\n\n // Skip logging/telemetry if silent mode\n if (options.silent) {\n return {\n supported: false,\n fallback,\n logged: false,\n };\n }\n\n const logger = options.logger || defaultLogger;\n const telemetry = options.telemetry;\n\n // Structured logging per Crucible standard\n // Template: signal=${signal} platform=${platform} fallback=${fallback_behavior} message='${operation_hint}'\n const logMeta = {\n signal: signal.name,\n platform: \"windows\",\n fallback: fallback.fallback_behavior,\n operation_hint: fallback.operation_hint,\n };\n\n // Log at INFO level (not WARN - this is expected Windows behavior)\n logger.info(fallback.log_message, logMeta);\n\n // Emit standardized telemetry\n if (telemetry) {\n telemetry.emit(fallback.telemetry_event, fallback.telemetry_tags);\n }\n\n return {\n supported: false,\n fallback,\n logged: true,\n };\n}\n\n/**\n * Get fallback metadata for a signal without logging\n *\n * Useful for capability checking and testing without side effects.\n *\n * @param signalName - Signal name (e.g., \"SIGHUP\")\n */\nexport async function getFallbackMetadata(signalName: string): Promise<WindowsFallback | null> {\n const signal = await getSignal(signalName);\n if (!signal || !signal.windows_fallback) {\n return null;\n }\n return signal.windows_fallback;\n}\n\n/**\n * Check if a signal requires Windows fallback\n *\n * Returns true if signal is defined in catalog but lacks Windows support\n * (windows_event is null and windows_fallback is defined).\n *\n * @param signalName - Signal name (e.g., \"SIGHUP\")\n */\nexport async function requiresFallback(signalName: string): Promise<boolean> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return false;\n }\n return signal.windows_event === null && signal.windows_fallback !== undefined;\n}\n\n/**\n * Get HTTP endpoint recommendation for Windows fallback\n *\n * Returns formatted operational guidance for signals that require\n * HTTP admin endpoint fallback on Windows.\n *\n * @param signalName - Signal name (e.g., \"SIGHUP\")\n */\nexport async function getHttpFallbackGuidance(signalName: string): Promise<string | null> {\n const fallback = await getFallbackMetadata(signalName);\n if (!fallback || fallback.fallback_behavior !== \"http_admin_endpoint\") {\n return null;\n }\n return fallback.operation_hint;\n}\n","/**\n * Signal Support Guards\n *\n * Validation functions that throw actionable errors when signals are unsupported.\n * Used to fail-fast with clear operational guidance.\n */\n\nimport { FoundryCatalogError } from \"../errors.js\";\nimport { isPOSIX, isWindows, supportsSignal } from \"./capabilities.js\";\nimport { getSignal } from \"./catalog.js\";\nimport { getFallbackMetadata } from \"./windows.js\";\n\n/**\n * Guard options\n */\nexport interface GuardOptions {\n /**\n * Include platform-specific operational guidance in error message\n */\n includeGuidance?: boolean;\n}\n\n/**\n * Ensure a signal is supported on the current platform\n *\n * Throws an error with actionable guidance if the signal is not supported.\n * Use this as a guard at the start of signal registration functions.\n *\n * @param signalName - Signal name (e.g., \"SIGTERM\") or id (e.g., \"term\")\n * @param options - Guard configuration\n * @throws {FoundryCatalogError} If signal is not found or not supported\n *\n * @example\n * ```typescript\n * await ensureSupported(\"SIGHUP\");\n * // On Windows: throws with HTTP fallback guidance\n * // On POSIX: passes through\n * ```\n */\nexport async function ensureSupported(\n signalName: string,\n options: GuardOptions = {},\n): Promise<void> {\n const { includeGuidance = true } = options;\n\n // Check if signal exists in catalog\n const signal = await getSignal(signalName);\n if (!signal) {\n throw FoundryCatalogError.invalidSchema(\n \"signals\",\n `Signal \"${signalName}\" not found in catalog. ` +\n `Valid signals: SIGTERM, SIGINT, SIGHUP, SIGQUIT, SIGPIPE, SIGALRM, SIGUSR1, SIGUSR2`,\n );\n }\n\n // Check platform support\n const supported = await supportsSignal(signalName);\n if (supported) {\n return; // Signal is supported\n }\n\n // Signal is not supported - build actionable error message\n let message = `Signal ${signal.name} is not supported on this platform`;\n\n if (isWindows() && includeGuidance) {\n const fallback = await getFallbackMetadata(signalName);\n if (fallback) {\n message += `. ${fallback.log_message}`;\n\n // Add specific guidance based on fallback type\n switch (fallback.fallback_behavior) {\n case \"http_admin_endpoint\":\n message += `. Use HTTP endpoint: ${fallback.operation_hint}`;\n break;\n case \"exception_handling\":\n message += `. Alternative: ${fallback.operation_hint}`;\n break;\n case \"timer_api\":\n message += `. Alternative: ${fallback.operation_hint}`;\n break;\n }\n }\n }\n\n throw FoundryCatalogError.invalidSchema(\"signals\", message);\n}\n\n/**\n * Ensure platform supports signal-based exit codes\n *\n * Throws an error if the platform doesn't support the POSIX 128+N exit code pattern.\n * Use this when exit code semantics are critical to application logic.\n *\n * @throws {FoundryCatalogError} If platform doesn't support signal exit codes\n *\n * @example\n * ```typescript\n * ensureSignalExitCodesSupported();\n * // On Windows: throws with guidance\n * // On POSIX: passes through\n * ```\n */\nexport function ensureSignalExitCodesSupported(): void {\n if (!isPOSIX()) {\n throw FoundryCatalogError.invalidSchema(\n \"signals\",\n \"Signal-based exit codes (128+N pattern) are not supported on this platform. \" +\n \"Windows does not propagate signal numbers via exit codes. \" +\n \"Use explicit exit codes or monitor via HTTP admin endpoint.\",\n );\n }\n}\n\n/**\n * Ensure platform is POSIX\n *\n * Throws an error if the platform is not POSIX-compliant.\n * Use this for functionality that strictly requires POSIX signal semantics.\n *\n * @throws {FoundryCatalogError} If platform is not POSIX\n */\nexport function ensurePOSIX(): void {\n if (!isPOSIX()) {\n throw FoundryCatalogError.invalidSchema(\n \"signals\",\n \"This operation requires a POSIX-compliant platform (Linux, macOS, FreeBSD). \" +\n \"Current platform does not support native signal handling.\",\n );\n }\n}\n\n/**\n * Ensure platform is Windows\n *\n * Throws an error if the platform is not Windows.\n * Use this for Windows-specific fallback testing or functionality.\n *\n * @throws {FoundryCatalogError} If platform is not Windows\n */\nexport function ensureWindows(): void {\n if (!isWindows()) {\n throw FoundryCatalogError.invalidSchema(\n \"signals\",\n \"This operation requires Windows platform. Current platform uses native signals.\",\n );\n }\n}\n","/**\n * HTTP Signal Endpoint Helper\n *\n * Framework-agnostic scaffold for POST /admin/signal endpoint.\n * Applications provide auth/rate-limiting; helper handles validation and execution.\n */\n\nimport { supportsSignal } from \"./capabilities.js\";\nimport type { SignalManager } from \"./manager.js\";\nimport type { FallbackLogger, TelemetryEmitter } from \"./windows.js\";\n\n/**\n * Signal request payload\n */\nexport interface SignalRequest {\n signal: string;\n reason?: string;\n correlation_id?: string;\n}\n\n/**\n * Signal response (success)\n */\nexport interface SignalResponse {\n status: \"accepted\";\n signal: string;\n correlation_id: string;\n message: string;\n}\n\n/**\n * Signal error response\n */\nexport interface SignalErrorResponse {\n status: \"error\";\n error: string;\n message: string;\n valid_signals?: string[];\n}\n\n/**\n * Authentication result\n */\nexport interface AuthResult {\n authenticated: boolean;\n identity?: string; // Client identifier (IP, cert fingerprint, etc.)\n reason?: string;\n}\n\n/**\n * Rate limit result\n */\nexport interface RateLimitResult {\n allowed: boolean;\n remaining?: number;\n reset_at?: number;\n}\n\n/**\n * Authentication hook function\n *\n * Applications must provide this to validate requests.\n * Returns authentication result with optional identity.\n */\nexport type AuthHook = (req: unknown) => Promise<AuthResult> | AuthResult;\n\n/**\n * Rate limiting hook function\n *\n * Applications may provide this to enforce rate limits.\n * Returns whether request is allowed and quota info.\n */\nexport type RateLimitHook = (\n identity: string,\n signal: string,\n) => Promise<RateLimitResult> | RateLimitResult;\n\n/**\n * Signal endpoint options\n */\nexport interface SignalEndpointOptions {\n /**\n * Signal manager instance\n */\n manager: SignalManager;\n\n /**\n * Authentication hook (required)\n */\n auth: AuthHook;\n\n /**\n * Rate limiting hook (optional)\n */\n rateLimit?: RateLimitHook;\n\n /**\n * Logger for endpoint events\n */\n logger?: FallbackLogger;\n\n /**\n * Telemetry emitter\n */\n telemetry?: TelemetryEmitter;\n\n /**\n * Allowed signals (default: all catalog signals)\n */\n allowedSignals?: string[];\n}\n\n/**\n * Create a framework-agnostic signal endpoint handler\n *\n * Returns an async function that processes signal requests.\n * Applications wire this to their HTTP framework (Express, Fastify, etc.)\n *\n * @param options - Endpoint configuration\n *\n * @example Express\n * ```typescript\n * const handler = createSignalEndpoint({\n * manager,\n * auth: async (req) => {\n * const token = req.headers.authorization?.split(' ')[1];\n * return { authenticated: token === process.env.ADMIN_TOKEN };\n * },\n * });\n *\n * app.post('/admin/signal', async (req, res) => {\n * const result = await handler(req.body, req);\n * res.status(result.status === 'accepted' ? 202 : result.statusCode || 400)\n * .json(result);\n * });\n * ```\n *\n * @example Fastify\n * ```typescript\n * const handler = createSignalEndpoint({ manager, auth });\n *\n * fastify.post('/admin/signal', async (request, reply) => {\n * const result = await handler(request.body, request);\n * reply.status(result.status === 'accepted' ? 202 : 400).send(result);\n * });\n * ```\n */\nexport function createSignalEndpoint(\n options: SignalEndpointOptions,\n): (\n payload: SignalRequest,\n req: unknown,\n) => Promise<(SignalResponse | SignalErrorResponse) & { statusCode?: number }> {\n const { manager, auth, rateLimit, logger, telemetry, allowedSignals } = options;\n\n return async (payload: SignalRequest, req: unknown) => {\n const correlationId = payload.correlation_id ?? generateCorrelationId();\n\n // Authenticate request\n const authResult = await auth(req);\n if (!authResult.authenticated) {\n if (logger) {\n logger.warn(\"Signal endpoint: authentication failed\", {\n correlation_id: correlationId,\n reason: authResult.reason,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.http_endpoint.auth_failed\", {\n correlation_id: correlationId,\n });\n }\n\n return {\n status: \"error\",\n error: \"authentication_failed\",\n message: authResult.reason || \"Authentication required\",\n statusCode: 401,\n };\n }\n\n const identity = authResult.identity || \"unknown\";\n\n // Validate signal name\n if (!payload.signal) {\n return {\n status: \"error\",\n error: \"invalid_request\",\n message: \"Signal name is required\",\n statusCode: 400,\n };\n }\n\n // Normalize signal name first\n const signalName = normalizeSignalName(payload.signal);\n\n // Check if signal is in allowed list\n const defaultAllowed = [\n \"SIGHUP\",\n \"SIGTERM\",\n \"SIGINT\",\n \"SIGQUIT\",\n \"SIGUSR1\",\n \"SIGUSR2\",\n \"SIGPIPE\",\n \"SIGALRM\",\n ];\n\n // Normalize allowed signals list (handle both 'HUP' and 'SIGHUP' formats)\n const allowed = (allowedSignals || defaultAllowed).map((s) => normalizeSignalName(s));\n\n if (!allowed.includes(signalName)) {\n return {\n status: \"error\",\n error: \"invalid_signal\",\n message: `Signal '${payload.signal}' is not recognized. Valid signals: ${allowed.join(\", \")}`,\n valid_signals: allowed,\n statusCode: 400,\n };\n }\n\n // Check platform support\n const supported = await supportsSignal(signalName);\n if (!supported) {\n // This shouldn't happen on Windows (the only reason for HTTP endpoint)\n // but handle gracefully\n return {\n status: \"error\",\n error: \"signal_not_supported\",\n message: `Signal ${signalName} is not supported on this platform`,\n statusCode: 400,\n };\n }\n\n // Check rate limit\n if (rateLimit) {\n const rateLimitResult = await rateLimit(identity, signalName);\n if (!rateLimitResult.allowed) {\n if (logger) {\n logger.warn(\"Signal endpoint: rate limit exceeded\", {\n correlation_id: correlationId,\n identity,\n signal: signalName,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.http_endpoint.rate_limited\", {\n correlation_id: correlationId,\n signal: signalName,\n });\n }\n\n return {\n status: \"error\",\n error: \"rate_limit_exceeded\",\n message: \"Rate limit exceeded. Please try again later.\",\n statusCode: 429,\n };\n }\n }\n\n // Log signal request\n if (logger) {\n logger.info(\"Signal endpoint: signal received\", {\n correlation_id: correlationId,\n identity,\n signal: signalName,\n reason: payload.reason,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.http_endpoint.signal_received\", {\n correlation_id: correlationId,\n signal: signalName,\n });\n }\n\n // Trigger signal asynchronously\n // Don't await - signal handlers may exit the process\n void manager.trigger(signalName).catch((error) => {\n if (logger) {\n logger.warn(\"Signal handler execution failed\", {\n correlation_id: correlationId,\n signal: signalName,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // Return success response immediately\n return {\n status: \"accepted\",\n signal: signalName,\n correlation_id: correlationId,\n message: \"Signal will be processed asynchronously\",\n statusCode: 202,\n };\n };\n}\n\n/**\n * Normalize signal name from HTTP request\n *\n * Converts \"HUP\" or \"hup\" to \"SIGHUP\"\n */\nfunction normalizeSignalName(signal: string): string {\n const upper = signal.toUpperCase();\n if (upper.startsWith(\"SIG\")) {\n return upper;\n }\n return `SIG${upper}`;\n}\n\n/**\n * Generate a correlation ID\n */\nfunction generateCorrelationId(): string {\n return `sig-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Create a simple bearer token auth hook\n *\n * Validates requests against a static token.\n * For production, use mTLS or more robust auth.\n *\n * @param expectedToken - Expected bearer token\n *\n * @example\n * ```typescript\n * const auth = createBearerTokenAuth(process.env.ADMIN_TOKEN);\n * const handler = createSignalEndpoint({ manager, auth });\n * ```\n */\nexport function createBearerTokenAuth(expectedToken: string): AuthHook {\n return (req: unknown) => {\n const headers = (req as { headers?: Record<string, string> }).headers;\n const authHeader = headers?.authorization || headers?.Authorization;\n\n if (!authHeader) {\n return {\n authenticated: false,\n reason: \"Missing Authorization header\",\n };\n }\n\n const [scheme, token] = authHeader.split(\" \");\n if (scheme !== \"Bearer\" || token !== expectedToken) {\n return {\n authenticated: false,\n reason: \"Invalid bearer token\",\n };\n }\n\n return {\n authenticated: true,\n identity: \"bearer-token-user\",\n };\n };\n}\n\n/**\n * Create a simple in-memory rate limiter\n *\n * Tracks requests per identity with sliding window.\n * For production, use Redis or distributed rate limiting.\n *\n * @param requestsPerMinute - Max requests per minute per identity\n *\n * @example\n * ```typescript\n * const rateLimit = createSimpleRateLimiter(10); // 10 req/min\n * const handler = createSignalEndpoint({ manager, auth, rateLimit });\n * ```\n */\nexport function createSimpleRateLimiter(requestsPerMinute: number): RateLimitHook {\n const requests = new Map<string, number[]>();\n const windowMs = 60000; // 1 minute\n\n return (identity: string) => {\n const now = Date.now();\n const key = identity;\n\n // Get existing requests\n let timestamps = requests.get(key) || [];\n\n // Remove timestamps outside window\n timestamps = timestamps.filter((ts) => now - ts < windowMs);\n\n // Check if limit exceeded\n if (timestamps.length >= requestsPerMinute) {\n const oldestTimestamp = Math.min(...timestamps);\n const resetAt = oldestTimestamp + windowMs;\n\n return {\n allowed: false,\n remaining: 0,\n reset_at: resetAt,\n };\n }\n\n // Add current request\n timestamps.push(now);\n requests.set(key, timestamps);\n\n return {\n allowed: true,\n remaining: requestsPerMinute - timestamps.length,\n reset_at: now + windowMs,\n };\n };\n}\n","/**\n * Signal Manager\n *\n * Cross-platform signal handler registration and lifecycle management.\n * Implements FIFO execution, priority overrides, timeout enforcement, and double-tap support.\n */\n\nimport { isWindows, supportsSignal } from \"./capabilities.js\";\nimport { getSignal } from \"./catalog.js\";\nimport {\n createDoubleTapTracker,\n type DoubleTapState,\n handleDoubleTap,\n resetDoubleTap,\n} from \"./double-tap.js\";\nimport { type FallbackLogger, handleWindowsFallback, type TelemetryEmitter } from \"./windows.js\";\n\n/**\n * Signal handler function type\n */\nexport type SignalHandler = (signal: NodeJS.Signals) => void | Promise<void>;\n\n/**\n * Handler registration options\n */\nexport interface HandlerOptions {\n /**\n * Priority for execution order (higher priority runs first)\n * Default: 0 (FIFO order)\n */\n priority?: number;\n\n /**\n * Timeout for this handler in milliseconds\n * Default: manager's default timeout (30s)\n */\n timeoutMs?: number;\n\n /**\n * Handler identifier for debugging\n */\n id?: string;\n}\n\n/**\n * Timeout behavior options\n */\nexport type TimeoutBehavior = \"force_exit\" | \"log_and_continue\";\n\n/**\n * Signal manager configuration\n */\nexport interface SignalManagerOptions {\n /**\n * Default handler timeout in milliseconds\n * Default: 30000 (30 seconds)\n */\n defaultTimeoutMs?: number;\n\n /**\n * Behavior when handler timeout is exceeded\n * Default: 'log_and_continue'\n */\n timeoutBehavior?: TimeoutBehavior;\n\n /**\n * Logger for handler events\n */\n logger?: FallbackLogger;\n\n /**\n * Telemetry emitter for observability\n */\n telemetry?: TelemetryEmitter;\n\n /**\n * Enable test mode (prevents process.exit, allows signal injection)\n */\n testMode?: boolean;\n\n /**\n * Double-tap debounce window in milliseconds (for SIGINT)\n * Default: 2000 (2 seconds per Crucible standard)\n */\n doubleTapWindowMs?: number;\n\n /**\n * Exit code for double-tap force quit\n * Default: 130 (SIGINT)\n */\n doubleTapExitCode?: number;\n}\n\n/**\n * Internal handler registration\n */\ninterface RegisteredHandler {\n signal: string;\n handler: SignalHandler;\n priority: number;\n timeoutMs: number;\n id: string;\n registeredAt: number;\n}\n\n/**\n * Signal Manager\n */\nexport class SignalManager {\n private handlers: Map<string, RegisteredHandler[]> = new Map();\n private nativeListeners: Map<string, (signal: NodeJS.Signals) => void> = new Map();\n private options: Required<Omit<SignalManagerOptions, \"logger\" | \"telemetry\">> & {\n logger?: FallbackLogger;\n telemetry?: TelemetryEmitter;\n };\n private handlerIdCounter = 0;\n private doubleTapTrackers: Map<string, DoubleTapState> = new Map();\n private shuttingDown = false;\n\n constructor(options: SignalManagerOptions = {}) {\n this.options = {\n defaultTimeoutMs: options.defaultTimeoutMs ?? 30000,\n timeoutBehavior: options.timeoutBehavior ?? \"log_and_continue\",\n testMode: options.testMode ?? false,\n doubleTapWindowMs: options.doubleTapWindowMs ?? 2000,\n doubleTapExitCode: options.doubleTapExitCode ?? 130,\n logger: options.logger,\n telemetry: options.telemetry,\n };\n }\n\n /**\n * Register a signal handler\n *\n * @param signal - Signal name (e.g., \"SIGTERM\") or NodeJS.Signals\n * @param handler - Handler function\n * @param options - Handler options\n */\n async register(\n signal: string | NodeJS.Signals,\n handler: SignalHandler,\n options: HandlerOptions = {},\n ): Promise<void> {\n const signalName = typeof signal === \"string\" ? signal : signal;\n\n // Check if signal is supported on this platform\n const supported = await supportsSignal(signalName);\n if (!supported) {\n // Log Windows fallback if applicable\n if (isWindows()) {\n await handleWindowsFallback(signalName, {\n logger: this.options.logger,\n telemetry: this.options.telemetry,\n });\n }\n return; // Don't register unsupported signals\n }\n\n // Get or create handler list for this signal\n if (!this.handlers.has(signalName)) {\n this.handlers.set(signalName, []);\n }\n\n // Create handler registration\n const registration: RegisteredHandler = {\n signal: signalName,\n handler,\n priority: options.priority ?? 0,\n timeoutMs: options.timeoutMs ?? this.options.defaultTimeoutMs,\n id: options.id ?? `handler-${++this.handlerIdCounter}`,\n registeredAt: Date.now(),\n };\n\n // Add to handler list (guaranteed to exist from lines 160-162)\n const handlers = this.handlers.get(signalName);\n if (!handlers) {\n throw new Error(`Handler list not initialized for signal ${signalName}`);\n }\n handlers.push(registration);\n\n // Sort by priority (higher first), then by registration order (FIFO)\n handlers.sort((a, b) => {\n if (a.priority !== b.priority) {\n return b.priority - a.priority; // Higher priority first\n }\n return a.registeredAt - b.registeredAt; // FIFO for same priority\n });\n\n // Register native listener if not already registered\n if (!this.nativeListeners.has(signalName)) {\n await this.registerNativeListener(signalName);\n }\n\n // Log registration\n if (this.options.logger) {\n this.options.logger.info(`Signal handler registered: ${signalName}`, {\n handler_id: registration.id,\n priority: registration.priority,\n timeout_ms: registration.timeoutMs,\n });\n }\n\n // Emit telemetry\n if (this.options.telemetry) {\n this.options.telemetry.emit(\"fulmen.signal.handler_registered\", {\n signal: signalName,\n handler_id: registration.id,\n priority: String(registration.priority),\n });\n }\n }\n\n /**\n * Register native Node.js signal listener\n */\n private async registerNativeListener(signalName: string): Promise<void> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return;\n }\n\n // Check if this signal uses double-tap behavior\n const useDoubleTap = signal.default_behavior === \"graceful_shutdown_with_double_tap\";\n\n if (useDoubleTap) {\n // Create double-tap tracker\n const tracker = await createDoubleTapTracker(signalName, {\n windowMs: this.options.doubleTapWindowMs,\n exitCode: this.options.doubleTapExitCode,\n logger: this.options.logger,\n testMode: this.options.testMode,\n });\n this.doubleTapTrackers.set(signalName, tracker);\n }\n\n // Create native listener\n const listener = async (sig: NodeJS.Signals) => {\n // Handle double-tap if enabled\n if (useDoubleTap) {\n const tracker = this.doubleTapTrackers.get(signalName);\n if (tracker) {\n const forceQuit = handleDoubleTap(tracker);\n if (forceQuit) {\n // Second tap - force quit already handled by handleDoubleTap\n return;\n }\n // First tap - continue to graceful shutdown\n }\n }\n\n // Execute registered handlers\n await this.executeHandlers(signalName, sig);\n };\n\n // Register with Node.js\n process.on(signalName as NodeJS.Signals, listener);\n this.nativeListeners.set(signalName, listener);\n }\n\n /**\n * Execute all registered handlers for a signal\n */\n private async executeHandlers(signalName: string, signal: NodeJS.Signals): Promise<void> {\n const handlers = this.handlers.get(signalName);\n if (!handlers || handlers.length === 0) {\n return;\n }\n\n // Mark as shutting down\n this.shuttingDown = true;\n\n // Log signal receipt\n if (this.options.logger) {\n this.options.logger.info(`Signal received: ${signalName}`, {\n handler_count: handlers.length,\n });\n }\n\n // Execute handlers in priority order\n for (const registration of handlers) {\n try {\n // Execute with timeout\n await this.executeWithTimeout(registration, signal);\n } catch (error) {\n // Handler failed - log and continue or exit\n if (this.options.logger) {\n this.options.logger.warn(`Signal handler failed: ${signalName}`, {\n handler_id: registration.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (this.options.telemetry) {\n this.options.telemetry.emit(\"fulmen.signal.handler_error\", {\n signal: signalName,\n handler_id: registration.id,\n error_type: error instanceof Error ? error.constructor.name : \"unknown\",\n });\n }\n\n if (this.options.timeoutBehavior === \"force_exit\") {\n const exitCode = (await getSignal(signalName))?.exit_code ?? 1;\n if (!this.options.testMode) {\n process.exit(exitCode);\n }\n return;\n }\n // Otherwise continue to next handler\n }\n }\n\n // Reset double-tap state if graceful shutdown completed\n const tracker = this.doubleTapTrackers.get(signalName);\n if (tracker) {\n resetDoubleTap(tracker);\n }\n }\n\n /**\n * Execute a handler with timeout enforcement\n */\n private async executeWithTimeout(\n registration: RegisteredHandler,\n signal: NodeJS.Signals,\n ): Promise<void> {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Handler timeout exceeded: ${registration.timeoutMs}ms`));\n }, registration.timeoutMs);\n });\n\n const handlerPromise = Promise.resolve(registration.handler(signal));\n\n try {\n await Promise.race([handlerPromise, timeoutPromise]);\n\n // Handler completed successfully\n if (this.options.telemetry) {\n this.options.telemetry.emit(\"fulmen.signal.handler_completed\", {\n signal: registration.signal,\n handler_id: registration.id,\n });\n }\n } catch (error) {\n // Timeout or handler error\n if (this.options.telemetry) {\n this.options.telemetry.emit(\"fulmen.signal.handler_timeout\", {\n signal: registration.signal,\n handler_id: registration.id,\n timeout_ms: String(registration.timeoutMs),\n });\n }\n throw error;\n }\n }\n\n /**\n * Unregister a signal handler\n *\n * @param signal - Signal name\n * @param handler - Handler to remove (if not provided, removes all handlers)\n */\n unregister(signal: string, handler?: SignalHandler): void {\n const handlers = this.handlers.get(signal);\n if (!handlers) {\n return;\n }\n\n if (handler) {\n // Remove specific handler\n const index = handlers.findIndex((h) => h.handler === handler);\n if (index !== -1) {\n handlers.splice(index, 1);\n }\n } else {\n // Remove all handlers for this signal\n handlers.length = 0;\n }\n\n // If no handlers left, remove native listener\n if (handlers.length === 0) {\n const listener = this.nativeListeners.get(signal);\n if (listener) {\n process.off(signal as NodeJS.Signals, listener);\n this.nativeListeners.delete(signal);\n }\n this.handlers.delete(signal);\n }\n }\n\n /**\n * Check if a signal has registered handlers\n */\n isRegistered(signal: string): boolean {\n const handlers = this.handlers.get(signal);\n return handlers !== undefined && handlers.length > 0;\n }\n\n /**\n * Get handler count for a signal\n */\n getHandlerCount(signal: string): number {\n const handlers = this.handlers.get(signal);\n return handlers?.length ?? 0;\n }\n\n /**\n * Trigger signal handlers manually (for testing)\n *\n * @param signal - Signal name\n */\n async trigger(signal: string): Promise<void> {\n const handlers = this.handlers.get(signal);\n if (!handlers || handlers.length === 0) {\n return;\n }\n\n await this.executeHandlers(signal, signal as NodeJS.Signals);\n }\n\n /**\n * Shutdown the signal manager and cleanup all handlers\n */\n async shutdown(): Promise<void> {\n // Remove all native listeners\n for (const [signal, listener] of this.nativeListeners.entries()) {\n process.off(signal as NodeJS.Signals, listener);\n }\n\n // Clear state\n this.nativeListeners.clear();\n this.handlers.clear();\n this.doubleTapTrackers.clear();\n this.shuttingDown = false;\n }\n\n /**\n * Check if manager is currently shutting down\n */\n isShuttingDown(): boolean {\n return this.shuttingDown;\n }\n}\n\n/**\n * Create a new signal manager instance\n *\n * @param options - Manager configuration\n */\nexport function createSignalManager(options: SignalManagerOptions = {}): SignalManager {\n return new SignalManager(options);\n}\n","/**\n * Configuration Reload Helpers\n *\n * Implements restart-based config reload pattern with mandatory schema validation.\n * Per Crucible standard: validate before restart, reject invalid configs without disruption.\n */\n\nimport type { FallbackLogger, TelemetryEmitter } from \"./windows.js\";\n\n/**\n * Configuration validator function type\n *\n * Applications provide this function to validate new config against schema.\n * Should return validation result with errors if invalid.\n */\nexport type ConfigValidator<T = unknown> = (\n config: T,\n) => Promise<ConfigValidationResult> | ConfigValidationResult;\n\n/**\n * Configuration validation result\n */\nexport interface ConfigValidationResult {\n valid: boolean;\n errors?: Array<{\n path: string;\n message: string;\n }>;\n}\n\n/**\n * Configuration loader function type\n *\n * Applications provide this function to load new config from disk/environment.\n */\nexport type ConfigLoader<T = unknown> = () => Promise<T> | T;\n\n/**\n * Config reload options\n */\nexport interface ConfigReloadOptions<T = unknown> {\n /**\n * Config loader function\n */\n loader: ConfigLoader<T>;\n\n /**\n * Schema validator function\n */\n validator: ConfigValidator<T>;\n\n /**\n * Callback invoked after successful validation, before exit\n * Use for cleanup, logging, etc.\n */\n onValidated?: (config: T) => void | Promise<void>;\n\n /**\n * Exit code for successful reload (default: 129 for SIGHUP)\n */\n exitCode?: number;\n\n /**\n * Logger for reload events\n */\n logger?: FallbackLogger;\n\n /**\n * Telemetry emitter\n */\n telemetry?: TelemetryEmitter;\n\n /**\n * Test mode (prevents process.exit)\n */\n testMode?: boolean;\n}\n\n/**\n * Config reload result (for testing)\n */\nexport interface ConfigReloadResult {\n reloaded: boolean;\n validationErrors?: Array<{ path: string; message: string }>;\n error?: Error;\n}\n\n/**\n * Create a config reload handler with schema validation\n *\n * Returns a signal handler function that implements restart-based reload:\n * 1. Load new config\n * 2. Validate against schema (mandatory)\n * 3. If invalid: log errors, continue with current config\n * 4. If valid: invoke callback, exit for restart\n *\n * @param options - Reload configuration\n *\n * @example\n * ```typescript\n * const reloadHandler = createConfigReloadHandler({\n * loader: () => loadConfig('./config.yaml'),\n * validator: (config) => validateConfigSchema(config),\n * onValidated: async (config) => {\n * logger.info('Config validated, restarting...');\n * },\n * logger: myLogger,\n * });\n *\n * await manager.register('SIGHUP', reloadHandler);\n * ```\n */\nexport function createConfigReloadHandler<T = unknown>(\n options: ConfigReloadOptions<T>,\n): () => Promise<void> {\n const {\n loader,\n validator,\n onValidated,\n exitCode = 129,\n logger,\n telemetry,\n testMode = false,\n } = options;\n\n return async () => {\n // Log reload request\n if (logger) {\n logger.info(\"Config reload requested (SIGHUP)\");\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.config_reload_requested\", {\n signal: \"SIGHUP\",\n });\n }\n\n try {\n // Load new config\n const newConfig = await loader();\n\n // Validate against schema (mandatory)\n const result = await validator(newConfig);\n\n if (!result.valid) {\n // Invalid config - log and reject without restart\n if (logger) {\n logger.warn(\"Config validation failed - continuing with current config\", {\n error_count: result.errors?.length ?? 0,\n errors: result.errors,\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.config_reload_rejected\", {\n signal: \"SIGHUP\",\n reason: \"validation_failed\",\n error_count: String(result.errors?.length ?? 0),\n });\n }\n\n return; // Don't exit - continue with current config\n }\n\n // Valid config - proceed with restart\n if (logger) {\n logger.info(\"Config validation succeeded - exiting for restart\");\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.config_reload_accepted\", {\n signal: \"SIGHUP\",\n });\n }\n\n // Invoke pre-restart callback\n if (onValidated) {\n await onValidated(newConfig);\n }\n\n // Exit for restart (process supervisor will restart with new config)\n if (!testMode) {\n process.exit(exitCode);\n }\n } catch (error) {\n // Config load or validation threw error\n if (logger) {\n logger.warn(\"Config reload failed with error - continuing with current config\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (telemetry) {\n telemetry.emit(\"fulmen.signal.config_reload_error\", {\n signal: \"SIGHUP\",\n error_type: error instanceof Error ? error.constructor.name : \"unknown\",\n });\n }\n\n // Don't exit - continue with current config\n }\n };\n}\n\n/**\n * Three-strikes failure tracker\n *\n * Tracks consecutive config reload failures and triggers alerts.\n * Useful for detecting persistent config source issues.\n */\nexport class ConfigReloadTracker {\n private failures = 0;\n private lastFailureTime: number | null = null;\n private readonly maxFailures: number;\n private readonly logger?: FallbackLogger;\n private readonly telemetry?: TelemetryEmitter;\n\n constructor(options: {\n maxFailures?: number;\n logger?: FallbackLogger;\n telemetry?: TelemetryEmitter;\n }) {\n this.maxFailures = options.maxFailures ?? 3;\n this.logger = options.logger;\n this.telemetry = options.telemetry;\n }\n\n /**\n * Record a reload failure\n *\n * @returns true if threshold exceeded, false otherwise\n */\n recordFailure(): boolean {\n this.failures++;\n this.lastFailureTime = Date.now();\n\n if (this.failures >= this.maxFailures) {\n if (this.logger) {\n this.logger.warn(\n `${this.failures} consecutive config reload failures - check config source`,\n {\n failure_count: this.failures,\n threshold: this.maxFailures,\n },\n );\n }\n\n if (this.telemetry) {\n this.telemetry.emit(\"fulmen.signal.config_reload_threshold_exceeded\", {\n failure_count: String(this.failures),\n threshold: String(this.maxFailures),\n });\n }\n\n return true; // Threshold exceeded\n }\n\n return false;\n }\n\n /**\n * Record a successful reload (resets counter)\n */\n recordSuccess(): void {\n this.failures = 0;\n this.lastFailureTime = null;\n }\n\n /**\n * Get current failure count\n */\n getFailureCount(): number {\n return this.failures;\n }\n\n /**\n * Get last failure timestamp\n */\n getLastFailureTime(): number | null {\n return this.lastFailureTime;\n }\n}\n"]}
@@ -0,0 +1,32 @@
1
+ // src/appidentity/runtime.ts
2
+ function detectRuntime() {
3
+ const versions = process.versions;
4
+ if (typeof versions.bun === "string" && versions.bun.length > 0) {
5
+ return { name: "bun", version: versions.bun };
6
+ }
7
+ if (typeof versions.node === "string" && versions.node.length > 0) {
8
+ return { name: "node", version: versions.node };
9
+ }
10
+ return { name: "unknown" };
11
+ }
12
+ function buildRuntimeInfo(options = {}) {
13
+ const runtime = detectRuntime();
14
+ const serviceName = options.serviceName ?? options.identity?.app.binary_name ?? "unknown-service";
15
+ const vendor = options.vendor ?? options.identity?.app.vendor;
16
+ return {
17
+ service: {
18
+ name: serviceName,
19
+ vendor,
20
+ version: options.version
21
+ },
22
+ runtime,
23
+ platform: {
24
+ os: process.platform,
25
+ arch: process.arch
26
+ }
27
+ };
28
+ }
29
+
30
+ export { buildRuntimeInfo };
31
+ //# sourceMappingURL=chunk-HY6JQOFN.js.map
32
+ //# sourceMappingURL=chunk-HY6JQOFN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/appidentity/runtime.ts"],"names":[],"mappings":";AA2BA,SAAS,aAAA,GAAyD;AAChE,EAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AAEzB,EAAA,IAAI,OAAO,QAAA,CAAS,GAAA,KAAQ,YAAY,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAC/D,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,SAAS,GAAA,EAAI;AAAA,EAC9C;AAEA,EAAA,IAAI,OAAO,QAAA,CAAS,IAAA,KAAS,YAAY,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,EAAG;AACjE,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,IAAA,EAAK;AAAA,EAChD;AAEA,EAAA,OAAO,EAAE,MAAM,SAAA,EAAU;AAC3B;AAKO,SAAS,gBAAA,CAAiB,OAAA,GAAmC,EAAC,EAAgB;AACnF,EAAA,MAAM,UAAU,aAAA,EAAc;AAE9B,EAAA,MAAM,cAAc,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,QAAA,EAAU,IAAI,WAAA,IAAe,iBAAA;AAChF,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,UAAU,GAAA,CAAI,MAAA;AAEvD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,WAAA;AAAA,MACN,MAAA;AAAA,MACA,SAAS,OAAA,CAAQ;AAAA,KACnB;AAAA,IACA,OAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAI,OAAA,CAAQ,QAAA;AAAA,MACZ,MAAM,OAAA,CAAQ;AAAA;AAChB,GACF;AACF","file":"chunk-HY6JQOFN.js","sourcesContent":["import type { Identity } from \"./types.js\";\n\nexport type RuntimeName = \"bun\" | \"node\" | \"unknown\";\n\nexport interface RuntimeInfo {\n service: {\n name: string;\n vendor?: string;\n version?: string;\n };\n runtime: {\n name: RuntimeName;\n version?: string;\n };\n platform: {\n os: NodeJS.Platform;\n arch: string;\n };\n}\n\nexport interface BuildRuntimeInfoOptions {\n identity?: Identity;\n version?: string;\n serviceName?: string;\n vendor?: string;\n}\n\nfunction detectRuntime(): { name: RuntimeName; version?: string } {\n const versions = process.versions as unknown as Record<string, string | undefined>;\n\n if (typeof versions.bun === \"string\" && versions.bun.length > 0) {\n return { name: \"bun\", version: versions.bun };\n }\n\n if (typeof versions.node === \"string\" && versions.node.length > 0) {\n return { name: \"node\", version: versions.node };\n }\n\n return { name: \"unknown\" };\n}\n\n/**\n * Build a minimal runtime info payload suitable for discovery endpoints.\n */\nexport function buildRuntimeInfo(options: BuildRuntimeInfoOptions = {}): RuntimeInfo {\n const runtime = detectRuntime();\n\n const serviceName = options.serviceName ?? options.identity?.app.binary_name ?? \"unknown-service\";\n const vendor = options.vendor ?? options.identity?.app.vendor;\n\n return {\n service: {\n name: serviceName,\n vendor,\n version: options.version,\n },\n runtime,\n platform: {\n os: process.platform,\n arch: process.arch,\n },\n };\n}\n"]}