@fulmenhq/tsfulmen 0.2.2 → 0.2.4

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.
@@ -1,7 +1,8 @@
1
1
  export { F as FoundryCatalogError, N as NormalizeOptions, a as SuggestOptions, S as Suggestion, c as casefold, d as distance, e as equalsIgnoreCase, n as normalize, s as score, b as stripAccents, f as suggest } from '../suggest-D8LbwtPV.js';
2
2
  import { Readable } from 'node:stream';
3
- export { AuthHook, AuthResult, ConfigLoader, ConfigReloadOptions, ConfigReloadResult, ConfigReloadTracker, ConfigValidationResult, ConfigValidator, DoubleTapConfig, DoubleTapState, GuardOptions, Platform, RateLimitHook, RateLimitResult, SignalEndpointOptions, SignalErrorResponse, PlatformCapabilities as SignalPlatformCapabilities, SignalRequest, SignalResponse, createBearerTokenAuth, createConfigReloadHandler, createDoubleTapTracker, createSignalEndpoint, createSimpleRateLimiter, ensurePOSIX, ensureSignalExitCodesSupported, ensureSupported, ensureWindows, getBehavior, getSignal, getSignalCatalog, getSignalNumber, getPlatformCapabilities as getSignalPlatformCapabilities, getSignalsVersion, getWindowTimeRemaining, getWindowsEvent, handleDoubleTap, isPOSIX as isSignalPOSIX, isWindows as isSignalWindows, isWithinWindow, listBehaviors, listSignals, onAnyShutdown, onEmergencyQuit, onReload, onShutdown, onUSR1, onUSR2, resetDoubleTap, supportsSignal, supportsSignalExitCodes as supportsSignalBasedExitCodes } from '../signals/index.js';
3
+ export { AuthHook, AuthResult, ConfigLoader, ConfigReloadEndpointOptions, ConfigReloadErrorResponse, ConfigReloadOptions, ConfigReloadRequest, ConfigReloadResponse, ConfigReloadResult, ConfigReloadTracker, ConfigValidationResult, ConfigValidator, ControlDiscoveryEndpointOptions, ControlDiscoveryErrorResponse, ControlDiscoveryResponse, ControlEndpointDescriptor, DoubleTapConfig, DoubleTapState, GuardOptions, Platform, RateLimitHook, RateLimitResult, SignalEndpointOptions, SignalErrorResponse, PlatformCapabilities as SignalPlatformCapabilities, SignalRequest, SignalResponse, createBearerTokenAuth, createConfigReloadEndpoint, createConfigReloadHandler, createControlDiscoveryEndpoint, createDoubleTapTracker, createSignalEndpoint, createSimpleRateLimiter, ensurePOSIX, ensureSignalExitCodesSupported, ensureSupported, ensureWindows, getBehavior, getSignal, getSignalCatalog, getSignalNumber, getPlatformCapabilities as getSignalPlatformCapabilities, getSignalsVersion, getWindowTimeRemaining, getWindowsEvent, handleDoubleTap, isPOSIX as isSignalPOSIX, isWindows as isSignalWindows, isWithinWindow, listBehaviors, listSignals, onAnyShutdown, onEmergencyQuit, onReload, onShutdown, onUSR1, onUSR2, resetDoubleTap, supportsSignal, supportsSignalExitCodes as supportsSignalBasedExitCodes } from '../signals/index.js';
4
4
  export { B as Behavior, a as BehaviorInfo, b as BehaviorPhase, E as ExitCodes, F as FallbackLogger, H as HandlerOptions, L as LogLevel, O as OsMappings, P as PlatformOverrides, e as PlatformSupport, f as PlatformSupportLevel, i as Signal, j as SignalBehavior, k as SignalCatalog, l as SignalHandler, m as SignalInfo, S as SignalManager, n as SignalManagerOptions, T as TelemetryEmitter, o as TimeoutBehavior, W as WindowsFallback, p as WindowsFallbackBehavior, q as WindowsFallbackOptions, s as WindowsFallbackResult, c as createSignalManager, g as getFallbackMetadata, d as getHttpFallbackGuidance, h as handleWindowsFallback, r as requiresFallback } from '../manager-CH3fX7zO.js';
5
+ import '../types-Dv5TERCM.js';
5
6
 
6
7
  /**
7
8
  * Foundry module - TypeScript type definitions
@@ -1,6 +1,7 @@
1
1
  import { access, readFile, mkdir, writeFile } from 'fs/promises';
2
2
  import { dirname, extname, join, relative } from 'path';
3
3
  import { parse, stringify } from 'yaml';
4
+ import addFormats from 'ajv-formats';
4
5
  import { spawn } from 'child_process';
5
6
  import { fileURLToPath } from 'url';
6
7
  import glob from 'fast-glob';
@@ -10,7 +11,6 @@ import Ajv from 'ajv';
10
11
  import Ajv2019 from 'ajv/dist/2019';
11
12
  import Ajv2020 from 'ajv/dist/2020';
12
13
  import AjvDraft04 from 'ajv-draft-04';
13
- import addFormats from 'ajv-formats';
14
14
  import { Readable } from 'stream';
15
15
  import picomatch from 'picomatch';
16
16
  import { substringSimilarity, jaro_winkler, damerau_levenshtein, osa_distance, levenshtein, normalize as normalize$1, score as score$1, suggest as suggest$1 } from '@3leaps/string-metrics-wasm';
@@ -729,6 +729,27 @@ var init_types = __esm({
729
729
  "src/telemetry/types.ts"() {
730
730
  }
731
731
  });
732
+ function applyFulmenAjvFormats(ajv, options = {}) {
733
+ const mode = options.mode ?? "fast";
734
+ const formats = options.formats ?? DEFAULT_FORMATS;
735
+ addFormats(ajv, { mode, formats });
736
+ return ajv;
737
+ }
738
+ var DEFAULT_FORMATS;
739
+ var init_ajv_formats = __esm({
740
+ "src/schema/ajv-formats.ts"() {
741
+ DEFAULT_FORMATS = [
742
+ "date-time",
743
+ "email",
744
+ "hostname",
745
+ "ipv4",
746
+ "ipv6",
747
+ "uri",
748
+ "uri-reference",
749
+ "uuid"
750
+ ];
751
+ }
752
+ });
732
753
 
733
754
  // src/schema/errors.ts
734
755
  var errors_exports = {};
@@ -2554,6 +2575,7 @@ var init_cli = __esm({
2554
2575
  // src/schema/index.ts
2555
2576
  var init_schema = __esm({
2556
2577
  "src/schema/index.ts"() {
2578
+ init_ajv_formats();
2557
2579
  init_cli();
2558
2580
  init_errors();
2559
2581
  init_export();
@@ -2720,10 +2742,7 @@ function createAjv(dialect) {
2720
2742
  // Enable async schema loading for YAML references
2721
2743
  loadSchema: loadReferencedSchema
2722
2744
  });
2723
- addFormats(ajv, {
2724
- mode: "fast",
2725
- formats: ["date-time", "email", "hostname", "ipv4", "ipv6", "uri", "uri-reference"]
2726
- });
2745
+ applyFulmenAjvFormats(ajv);
2727
2746
  return ajv;
2728
2747
  }
2729
2748
  async function getAjv(dialect) {
@@ -2969,6 +2988,7 @@ var ajvInstances, metaschemaReady, schemaCache;
2969
2988
  var init_validator = __esm({
2970
2989
  "src/schema/validator.ts"() {
2971
2990
  init_telemetry();
2991
+ init_ajv_formats();
2972
2992
  init_errors();
2973
2993
  init_registry2();
2974
2994
  init_utils();
@@ -4753,6 +4773,224 @@ var init_capabilities2 = __esm({
4753
4773
  }
4754
4774
  });
4755
4775
 
4776
+ // src/foundry/signals/config-reload-endpoint.ts
4777
+ function createConfigReloadEndpoint(options) {
4778
+ const { loader, validator, onReload: onReload2, auth, rateLimit, logger, telemetry } = options;
4779
+ return async (payload, req) => {
4780
+ const correlationId = payload.correlation_id ?? generateCorrelationId2();
4781
+ const authResult = await auth(req);
4782
+ if (!authResult.authenticated) {
4783
+ if (logger) {
4784
+ logger.warn("Config reload endpoint: authentication failed", {
4785
+ correlation_id: correlationId,
4786
+ reason: authResult.reason
4787
+ });
4788
+ }
4789
+ if (telemetry) {
4790
+ telemetry.emit("fulmen.config.http_endpoint.auth_failed", {
4791
+ correlation_id: correlationId
4792
+ });
4793
+ }
4794
+ return {
4795
+ status: "error",
4796
+ error: "authentication_failed",
4797
+ message: authResult.reason || "Authentication required",
4798
+ statusCode: 401
4799
+ };
4800
+ }
4801
+ const identity = authResult.identity || "unknown";
4802
+ if (rateLimit) {
4803
+ const rateLimitResult = await rateLimit(identity);
4804
+ if (!rateLimitResult.allowed) {
4805
+ if (logger) {
4806
+ logger.warn("Config reload endpoint: rate limit exceeded", {
4807
+ correlation_id: correlationId,
4808
+ identity
4809
+ });
4810
+ }
4811
+ if (telemetry) {
4812
+ telemetry.emit("fulmen.config.http_endpoint.rate_limited", {
4813
+ correlation_id: correlationId
4814
+ });
4815
+ }
4816
+ return {
4817
+ status: "error",
4818
+ error: "rate_limit_exceeded",
4819
+ message: "Rate limit exceeded. Please try again later.",
4820
+ statusCode: 429
4821
+ };
4822
+ }
4823
+ }
4824
+ if (telemetry) {
4825
+ telemetry.emit("fulmen.config.http_endpoint.reload_requested", {
4826
+ correlation_id: correlationId
4827
+ });
4828
+ }
4829
+ try {
4830
+ const config = await loader();
4831
+ if (validator) {
4832
+ const validation = await validator(config);
4833
+ if (!validation.valid) {
4834
+ if (logger) {
4835
+ logger.warn("Config reload endpoint: validation failed", {
4836
+ correlation_id: correlationId,
4837
+ error_count: validation.errors?.length ?? 0
4838
+ });
4839
+ }
4840
+ if (telemetry) {
4841
+ telemetry.emit("fulmen.config.http_endpoint.reload_rejected", {
4842
+ correlation_id: correlationId,
4843
+ reason: "validation_failed"
4844
+ });
4845
+ }
4846
+ return {
4847
+ status: "error",
4848
+ error: "validation_failed",
4849
+ message: "Configuration validation failed",
4850
+ validation_errors: validation.errors,
4851
+ statusCode: 422
4852
+ };
4853
+ }
4854
+ }
4855
+ if (onReload2) {
4856
+ await onReload2(config);
4857
+ }
4858
+ if (telemetry) {
4859
+ telemetry.emit("fulmen.config.http_endpoint.reload_accepted", {
4860
+ correlation_id: correlationId
4861
+ });
4862
+ }
4863
+ if (logger) {
4864
+ logger.info("Config reload endpoint: reload accepted", {
4865
+ correlation_id: correlationId,
4866
+ reason: payload.reason
4867
+ });
4868
+ }
4869
+ return {
4870
+ status: "reloaded",
4871
+ correlation_id: correlationId,
4872
+ message: "Configuration reloaded",
4873
+ statusCode: 200
4874
+ };
4875
+ } catch (error) {
4876
+ if (logger) {
4877
+ logger.warn("Config reload endpoint: reload failed", {
4878
+ correlation_id: correlationId,
4879
+ error: error instanceof Error ? error.message : String(error)
4880
+ });
4881
+ }
4882
+ if (telemetry) {
4883
+ telemetry.emit("fulmen.config.http_endpoint.reload_error", {
4884
+ correlation_id: correlationId,
4885
+ error_type: error instanceof Error ? error.constructor.name : "unknown"
4886
+ });
4887
+ }
4888
+ return {
4889
+ status: "error",
4890
+ error: "reload_failed",
4891
+ message: error instanceof Error ? error.message : String(error),
4892
+ statusCode: 500
4893
+ };
4894
+ }
4895
+ };
4896
+ }
4897
+ function generateCorrelationId2() {
4898
+ return `cfg-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
4899
+ }
4900
+ var init_config_reload_endpoint = __esm({
4901
+ "src/foundry/signals/config-reload-endpoint.ts"() {
4902
+ }
4903
+ });
4904
+
4905
+ // src/appidentity/runtime.ts
4906
+ function detectRuntime() {
4907
+ const versions = process.versions;
4908
+ if (typeof versions.bun === "string" && versions.bun.length > 0) {
4909
+ return { name: "bun", version: versions.bun };
4910
+ }
4911
+ if (typeof versions.node === "string" && versions.node.length > 0) {
4912
+ return { name: "node", version: versions.node };
4913
+ }
4914
+ return { name: "unknown" };
4915
+ }
4916
+ function buildRuntimeInfo(options = {}) {
4917
+ const runtime = detectRuntime();
4918
+ const serviceName = options.serviceName ?? options.identity?.app.binary_name ?? "unknown-service";
4919
+ const vendor = options.vendor ?? options.identity?.app.vendor;
4920
+ return {
4921
+ service: {
4922
+ name: serviceName,
4923
+ vendor,
4924
+ version: options.version
4925
+ },
4926
+ runtime,
4927
+ platform: {
4928
+ os: process.platform,
4929
+ arch: process.arch
4930
+ }
4931
+ };
4932
+ }
4933
+ var init_runtime = __esm({
4934
+ "src/appidentity/runtime.ts"() {
4935
+ }
4936
+ });
4937
+
4938
+ // src/foundry/signals/control-discovery-endpoint.ts
4939
+ function createControlDiscoveryEndpoint(options) {
4940
+ const { identity, version, endpoints, auth, authSummary, logger, telemetry } = options;
4941
+ return async (req) => {
4942
+ if (auth) {
4943
+ const authResult = await auth(req);
4944
+ if (!authResult.authenticated) {
4945
+ if (logger) {
4946
+ logger.warn("Control discovery endpoint: authentication failed", {
4947
+ reason: authResult.reason
4948
+ });
4949
+ }
4950
+ if (telemetry) {
4951
+ telemetry.emit("fulmen.control.discovery.auth_failed", {
4952
+ service: identity.app.binary_name
4953
+ });
4954
+ }
4955
+ return {
4956
+ status: "error",
4957
+ error: "authentication_failed",
4958
+ message: authResult.reason || "Authentication required",
4959
+ statusCode: 401
4960
+ };
4961
+ }
4962
+ }
4963
+ if (telemetry) {
4964
+ telemetry.emit("fulmen.control.discovery.served", {
4965
+ service: identity.app.binary_name
4966
+ });
4967
+ }
4968
+ const runtime = buildRuntimeInfo({ identity, version });
4969
+ return {
4970
+ status: "ok",
4971
+ service: {
4972
+ name: identity.app.binary_name,
4973
+ vendor: identity.app.vendor,
4974
+ version
4975
+ },
4976
+ runtime: {
4977
+ name: runtime.runtime.name,
4978
+ version: runtime.runtime.version,
4979
+ platform: runtime.platform.os,
4980
+ arch: runtime.platform.arch
4981
+ },
4982
+ auth_summary: authSummary,
4983
+ endpoints,
4984
+ statusCode: 200
4985
+ };
4986
+ };
4987
+ }
4988
+ var init_control_discovery_endpoint = __esm({
4989
+ "src/foundry/signals/control-discovery-endpoint.ts"() {
4990
+ init_runtime();
4991
+ }
4992
+ });
4993
+
4756
4994
  // src/foundry/signals/convenience.ts
4757
4995
  async function onShutdown(manager, handler, options = {}) {
4758
4996
  await manager.register("SIGTERM", handler, options);
@@ -5012,7 +5250,7 @@ var init_guards = __esm({
5012
5250
  function createSignalEndpoint(options) {
5013
5251
  const { manager, auth, rateLimit, logger, telemetry, allowedSignals } = options;
5014
5252
  return async (payload, req) => {
5015
- const correlationId = payload.correlation_id ?? generateCorrelationId2();
5253
+ const correlationId = payload.correlation_id ?? generateCorrelationId3();
5016
5254
  const authResult = await auth(req);
5017
5255
  if (!authResult.authenticated) {
5018
5256
  if (logger) {
@@ -5135,7 +5373,7 @@ function normalizeSignalName(signal) {
5135
5373
  }
5136
5374
  return `SIG${upper}`;
5137
5375
  }
5138
- function generateCorrelationId2() {
5376
+ function generateCorrelationId3() {
5139
5377
  return `sig-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
5140
5378
  }
5141
5379
  function createBearerTokenAuth(expectedToken) {
@@ -5602,6 +5840,8 @@ var init_signals = __esm({
5602
5840
  "src/foundry/signals/index.ts"() {
5603
5841
  init_capabilities2();
5604
5842
  init_catalog();
5843
+ init_config_reload_endpoint();
5844
+ init_control_discovery_endpoint();
5605
5845
  init_convenience();
5606
5846
  init_double_tap();
5607
5847
  init_guards();
@@ -5747,7 +5987,9 @@ __export(foundry_exports, {
5747
5987
  clearMimeTypeCache: () => clearMimeTypeCache,
5748
5988
  clearPatternCache: () => clearPatternCache,
5749
5989
  createBearerTokenAuth: () => createBearerTokenAuth,
5990
+ createConfigReloadEndpoint: () => createConfigReloadEndpoint,
5750
5991
  createConfigReloadHandler: () => createConfigReloadHandler,
5992
+ createControlDiscoveryEndpoint: () => createControlDiscoveryEndpoint,
5751
5993
  createDoubleTapTracker: () => createDoubleTapTracker,
5752
5994
  createSignalEndpoint: () => createSignalEndpoint,
5753
5995
  createSignalManager: () => createSignalManager,
@@ -5849,6 +6091,6 @@ var init_foundry = __esm({
5849
6091
  });
5850
6092
  init_foundry();
5851
6093
 
5852
- export { ConfigReloadTracker, EXIT_CODES_VERSION, FoundryCatalogError, SignalManager, SimplifiedMode, VERSION, casefold, clearCountryCodeCache, clearHttpStatusCache, clearMimeTypeCache, clearPatternCache, createBearerTokenAuth, createConfigReloadHandler, createDoubleTapTracker, createSignalEndpoint, createSignalManager, createSimpleRateLimiter, describePattern, detectMimeType, detectMimeTypeFromBuffer, detectMimeTypeFromFile, detectMimeTypeFromStream, distance, ensurePOSIX, ensureSignalExitCodesSupported, ensureSupported, ensureWindows, equalsIgnoreCase, exitCodeMetadata, exitCodes, getBehavior, getCountryByAlpha2, getCountryByAlpha3, getCountryByNumeric, getExitCodeInfo, getFallbackMetadata, getHttpFallbackGuidance, getHttpStatus, getMimeType, getMimeTypeByExtension, getPattern, getPatternRegex, getPlatform, getPlatformCapabilities, getSignal, getSignalCatalog, getSignalNumber, getPlatformCapabilities2 as getSignalPlatformCapabilities, getSignalsVersion, getSimplifiedCodeDescription, getSimplifiedCodes, getStatusReason, getWindowTimeRemaining, getWindowsEvent, handleDoubleTap, handleWindowsFallback, isClientError, isInformational, isPOSIX, isRedirection, isServerError, isPOSIX2 as isSignalPOSIX, isWindows2 as isSignalWindows, isSuccess, isSupportedMimeType, isWindows, isWithinWindow, listBehaviors, listCountries, listHttpStatuses, listMimeTypes, listPatterns, listSignals, loadAllCatalogs, loadCountryCodeCatalog, loadHttpStatusCatalog, loadMimeTypeCatalog, loadPatternCatalog, mapExitCodeToSimplified, matchMagicNumber, matchPattern, normalize, onAnyShutdown, onEmergencyQuit, onReload, onShutdown, onUSR1, onUSR2, requiresFallback, resetDoubleTap, score, stripAccents, suggest, supportsSignal, supportsSignalExitCodes2 as supportsSignalBasedExitCodes, supportsSignalExitCodes };
6094
+ export { ConfigReloadTracker, EXIT_CODES_VERSION, FoundryCatalogError, SignalManager, SimplifiedMode, VERSION, casefold, clearCountryCodeCache, clearHttpStatusCache, clearMimeTypeCache, clearPatternCache, createBearerTokenAuth, createConfigReloadEndpoint, createConfigReloadHandler, createControlDiscoveryEndpoint, createDoubleTapTracker, createSignalEndpoint, createSignalManager, createSimpleRateLimiter, describePattern, detectMimeType, detectMimeTypeFromBuffer, detectMimeTypeFromFile, detectMimeTypeFromStream, distance, ensurePOSIX, ensureSignalExitCodesSupported, ensureSupported, ensureWindows, equalsIgnoreCase, exitCodeMetadata, exitCodes, getBehavior, getCountryByAlpha2, getCountryByAlpha3, getCountryByNumeric, getExitCodeInfo, getFallbackMetadata, getHttpFallbackGuidance, getHttpStatus, getMimeType, getMimeTypeByExtension, getPattern, getPatternRegex, getPlatform, getPlatformCapabilities, getSignal, getSignalCatalog, getSignalNumber, getPlatformCapabilities2 as getSignalPlatformCapabilities, getSignalsVersion, getSimplifiedCodeDescription, getSimplifiedCodes, getStatusReason, getWindowTimeRemaining, getWindowsEvent, handleDoubleTap, handleWindowsFallback, isClientError, isInformational, isPOSIX, isRedirection, isServerError, isPOSIX2 as isSignalPOSIX, isWindows2 as isSignalWindows, isSuccess, isSupportedMimeType, isWindows, isWithinWindow, listBehaviors, listCountries, listHttpStatuses, listMimeTypes, listPatterns, listSignals, loadAllCatalogs, loadCountryCodeCatalog, loadHttpStatusCatalog, loadMimeTypeCatalog, loadPatternCatalog, mapExitCodeToSimplified, matchMagicNumber, matchPattern, normalize, onAnyShutdown, onEmergencyQuit, onReload, onShutdown, onUSR1, onUSR2, requiresFallback, resetDoubleTap, score, stripAccents, suggest, supportsSignal, supportsSignalExitCodes2 as supportsSignalBasedExitCodes, supportsSignalExitCodes };
5853
6095
  //# sourceMappingURL=index.js.map
5854
6096
  //# sourceMappingURL=index.js.map