@fulmenhq/tsfulmen 0.3.3 → 0.4.1
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.
- package/CHANGELOG.md +76 -1
- package/README.md +30 -1
- package/config/crucible-ts/taxonomy/metrics.yaml +1 -1
- package/dist/appidentity/index.js +9 -2209
- package/dist/appidentity/index.js.map +1 -1
- package/dist/assets/index.d.ts +184 -0
- package/dist/assets/index.js +4 -0
- package/dist/assets/index.js.map +1 -0
- package/dist/bin/prometheus-cli.js +15 -9139
- package/dist/bin/prometheus-cli.js.map +1 -1
- package/dist/bin/schema-cli.js +4 -6098
- package/dist/bin/schema-cli.js.map +1 -1
- package/dist/bin/signals-cli.js +15 -1910
- package/dist/bin/signals-cli.js.map +1 -1
- package/dist/chunk-24BAF63H.js +194 -0
- package/dist/chunk-24BAF63H.js.map +1 -0
- package/dist/chunk-3HISR2XI.js +36 -0
- package/dist/chunk-3HISR2XI.js.map +1 -0
- package/dist/chunk-56F2EEAG.js +328 -0
- package/dist/chunk-56F2EEAG.js.map +1 -0
- package/dist/chunk-5HZEJGZ5.js +725 -0
- package/dist/chunk-5HZEJGZ5.js.map +1 -0
- package/dist/chunk-7YWACZEJ.js +837 -0
- package/dist/chunk-7YWACZEJ.js.map +1 -0
- package/dist/chunk-BCO3FUUO.js +682 -0
- package/dist/chunk-BCO3FUUO.js.map +1 -0
- package/dist/chunk-GOTEQYAD.js +410 -0
- package/dist/chunk-GOTEQYAD.js.map +1 -0
- package/dist/chunk-HY6JQOFN.js +32 -0
- package/dist/chunk-HY6JQOFN.js.map +1 -0
- package/dist/chunk-LMNAUTW7.js +43 -0
- package/dist/chunk-LMNAUTW7.js.map +1 -0
- package/dist/chunk-LWAH2UG7.js +103 -0
- package/dist/chunk-LWAH2UG7.js.map +1 -0
- package/dist/chunk-OHE2AOH4.js +273 -0
- package/dist/chunk-OHE2AOH4.js.map +1 -0
- package/dist/chunk-P3DNOZOG.js +1488 -0
- package/dist/chunk-P3DNOZOG.js.map +1 -0
- package/dist/chunk-PQ6TKPUN.js +27 -0
- package/dist/chunk-PQ6TKPUN.js.map +1 -0
- package/dist/chunk-QCCN6POA.js +211 -0
- package/dist/chunk-QCCN6POA.js.map +1 -0
- package/dist/chunk-QGTNV4U2.js +985 -0
- package/dist/chunk-QGTNV4U2.js.map +1 -0
- package/dist/chunk-RSLFR4TO.js +631 -0
- package/dist/chunk-RSLFR4TO.js.map +1 -0
- package/dist/chunk-SNV5WG5V.js +9412 -0
- package/dist/chunk-SNV5WG5V.js.map +1 -0
- package/dist/chunk-UP2VWCW5.js +33 -0
- package/dist/chunk-UP2VWCW5.js.map +1 -0
- package/dist/chunk-VJIGX7MH.js +208 -0
- package/dist/chunk-VJIGX7MH.js.map +1 -0
- package/dist/chunk-WCCMRVZF.js +130 -0
- package/dist/chunk-WCCMRVZF.js.map +1 -0
- package/dist/chunk-WSMVLWLB.js +269 -0
- package/dist/chunk-WSMVLWLB.js.map +1 -0
- package/dist/config/index.js +6 -1220
- package/dist/config/index.js.map +1 -1
- package/dist/crucible/fulpack/index.js +2 -25
- package/dist/crucible/fulpack/index.js.map +1 -1
- package/dist/crucible/index.js +13 -1129
- package/dist/crucible/index.js.map +1 -1
- package/dist/docscribe/index.js +2 -680
- package/dist/docscribe/index.js.map +1 -1
- package/dist/errors/index.js +5 -1831
- package/dist/errors/index.js.map +1 -1
- package/dist/errors-D7KXV3QW.js +4 -0
- package/dist/errors-D7KXV3QW.js.map +1 -0
- package/dist/errors-R7ZODJXS.js +8 -0
- package/dist/errors-R7ZODJXS.js.map +1 -0
- package/dist/export-EA3RNQNS.js +6 -0
- package/dist/export-EA3RNQNS.js.map +1 -0
- package/dist/foundry/index.js +340 -3949
- package/dist/foundry/index.js.map +1 -1
- package/dist/foundry/similarity/index.js +3 -134
- package/dist/foundry/similarity/index.js.map +1 -1
- package/dist/fulencode/index.js +3 -319
- package/dist/fulencode/index.js.map +1 -1
- package/dist/fulhash/index.js +3 -611
- package/dist/fulhash/index.js.map +1 -1
- package/dist/fulpack/index.js +3 -1515
- package/dist/fulpack/index.js.map +1 -1
- package/dist/hash-YOJYVOWH.js +4 -0
- package/dist/hash-YOJYVOWH.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +14 -4395
- package/dist/index.js.map +1 -1
- package/dist/loader-VP2ZIC4O.js +9 -0
- package/dist/loader-VP2ZIC4O.js.map +1 -0
- package/dist/logging/index.js +2 -723
- package/dist/logging/index.js.map +1 -1
- package/dist/pathfinder/index.js +18 -2341
- package/dist/pathfinder/index.js.map +1 -1
- package/dist/prom-client-PNEBGD3G.js +4801 -0
- package/dist/prom-client-PNEBGD3G.js.map +1 -0
- package/dist/reports/license-inventory.csv +1 -1
- package/dist/schema/index.d.ts +19 -6
- package/dist/schema/index.js +4 -6148
- package/dist/schema/index.js.map +1 -1
- package/dist/signals/index.js +8 -2767
- package/dist/signals/index.js.map +1 -1
- package/dist/similarity/index.js +3 -134
- package/dist/similarity/index.js.map +1 -1
- package/dist/telemetry/http/index.js +9 -930
- package/dist/telemetry/http/index.js.map +1 -1
- package/dist/telemetry/index.js +4 -1561
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/prometheus/index.js +7 -8422
- package/dist/telemetry/prometheus/index.js.map +1 -1
- package/dist/validator-I3ASDVDB.js +6 -0
- package/dist/validator-I3ASDVDB.js.map +1 -0
- package/package.json +5 -1
- package/schemas/crucible-ts/library/module-manifest/v1.0.0/module-manifest.schema.json +1 -1
- package/schemas/crucible-ts/observability/logging/v1.0.0/definitions.schema.json +1 -1
- package/schemas/crucible-ts/observability/logging/v1.0.0/log-event.schema.json +13 -13
- package/schemas/crucible-ts/observability/logging/v1.0.0/logger-config.schema.json +2 -2
- package/schemas/crucible-ts/observability/logging/v1.0.0/logging-policy.schema.json +1 -1
- package/schemas/crucible-ts/observability/logging/v1.0.0/middleware-config.schema.json +2 -2
- package/schemas/crucible-ts/observability/logging/v1.0.0/severity-filter.schema.json +3 -3
- package/schemas/crucible-ts/upstream/3leaps/crucible/PROVENANCE.md +3 -3
- package/schemas/crucible-ts/upstream/3leaps/crucible/docs/catalog/classifiers/README.md +1 -1
- package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/classifiers-framework.md +1 -1
- package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/data-sensitivity-classification.md +1 -1
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { FoundryCatalogError } from './chunk-3HISR2XI.js';
|
|
2
|
+
import { validateDataBySchemaId } from './chunk-SNV5WG5V.js';
|
|
3
|
+
import { registerEmbeddedAssets, getAssetResolver } from './chunk-56F2EEAG.js';
|
|
4
|
+
import { parse } from 'yaml';
|
|
5
|
+
|
|
6
|
+
// src/assets/generated/foundry.generated.ts
|
|
7
|
+
var manifest = {
|
|
8
|
+
domain: "foundry",
|
|
9
|
+
files: {
|
|
10
|
+
"config/crucible-ts/library/foundry/country-codes.yaml": "$schema: https://schemas.fulmenhq.dev/library/foundry/v1.0.0/country-codes.schema.json\ndescription: Sample ISO 3166 country codes for helper-library lookups.\nversion: v0.1.0\ncountries:\n - alpha2: US\n alpha3: USA\n numeric: '840'\n name: United States of America\n officialName: United States of America\n - alpha2: CA\n alpha3: CAN\n numeric: '124'\n name: Canada\n officialName: Canada\n - alpha2: JP\n alpha3: JPN\n numeric: '392'\n name: Japan\n officialName: Japan\n - alpha2: DE\n alpha3: DEU\n numeric: '276'\n name: Germany\n officialName: Federal Republic of Germany\n - alpha2: BR\n alpha3: BRA\n numeric: '076'\n name: Brazil\n officialName: Federative Republic of Brazil\n",
|
|
11
|
+
"config/crucible-ts/library/foundry/http-statuses.yaml": "$schema: https://schemas.fulmenhq.dev/library/foundry/v1.0.0/http-status-groups.schema.json\ndescription: HTTP status code groups shared across helper libraries.\nversion: v0.1.0\ngroups:\n - id: informational\n name: Informational Responses\n description: '1xx HTTP status codes indicating provisional responses.'\n codes:\n - value: 100\n reason: Continue\n - value: 101\n reason: Switching Protocols\n - value: 102\n reason: Processing\n - value: 103\n reason: Early Hints\n - id: success\n name: Successful Responses\n description: '2xx HTTP status codes indicating successful requests.'\n codes:\n - value: 200\n reason: OK\n - value: 201\n reason: Created\n - value: 202\n reason: Accepted\n - value: 203\n reason: Non-Authoritative Information\n - value: 204\n reason: No Content\n - value: 205\n reason: Reset Content\n - value: 206\n reason: Partial Content\n - value: 207\n reason: Multi-Status\n - value: 208\n reason: Already Reported\n - value: 226\n reason: IM Used\n - id: redirect\n name: Redirection Responses\n description: '3xx HTTP status codes indicating redirects.'\n codes:\n - value: 300\n reason: Multiple Choices\n - value: 301\n reason: Moved Permanently\n - value: 302\n reason: Found\n - value: 303\n reason: See Other\n - value: 304\n reason: Not Modified\n - value: 305\n reason: Use Proxy\n - value: 307\n reason: Temporary Redirect\n - value: 308\n reason: Permanent Redirect\n - id: client-error\n name: Client Error Responses\n description: '4xx HTTP status codes indicating client errors.'\n codes:\n - value: 400\n reason: Bad Request\n - value: 401\n reason: Unauthorized\n - value: 402\n reason: Payment Required\n - value: 403\n reason: Forbidden\n - value: 404\n reason: Not Found\n - value: 405\n reason: Method Not Allowed\n - value: 406\n reason: Not Acceptable\n - value: 407\n reason: Proxy Authentication Required\n - value: 408\n reason: Request Timeout\n - value: 409\n reason: Conflict\n - value: 410\n reason: Gone\n - value: 411\n reason: Length Required\n - value: 412\n reason: Precondition Failed\n - value: 413\n reason: Content Too Large\n - value: 414\n reason: URI Too Long\n - value: 415\n reason: Unsupported Media Type\n - value: 416\n reason: Range Not Satisfiable\n - value: 417\n reason: Expectation Failed\n - value: 418\n reason: I'm a teapot\n - value: 421\n reason: Misdirected Request\n - value: 422\n reason: Unprocessable Content\n - value: 423\n reason: Locked\n - value: 424\n reason: Failed Dependency\n - value: 425\n reason: Too Early\n - value: 426\n reason: Upgrade Required\n - value: 428\n reason: Precondition Required\n - value: 429\n reason: Too Many Requests\n - value: 431\n reason: Request Header Fields Too Large\n - value: 451\n reason: Unavailable For Legal Reasons\n - id: server-error\n name: Server Error Responses\n description: '5xx HTTP status codes indicating server errors.'\n codes:\n - value: 500\n reason: Internal Server Error\n - value: 501\n reason: Not Implemented\n - value: 502\n reason: Bad Gateway\n - value: 503\n reason: Service Unavailable\n - value: 504\n reason: Gateway Timeout\n - value: 505\n reason: HTTP Version Not Supported\n - value: 506\n reason: Variant Also Negotiates\n - value: 507\n reason: Insufficient Storage\n - value: 508\n reason: Loop Detected\n - value: 510\n reason: Not Extended\n - value: 511\n reason: Network Authentication Required\n",
|
|
12
|
+
"config/crucible-ts/library/foundry/mime-types.yaml": "$schema: https://schemas.fulmenhq.dev/library/foundry/v1.0.0/mime-types.schema.json\ndescription: Common MIME types that helper libraries should recognize.\nversion: v0.1.0\ntypes:\n - id: json\n mime: application/json\n name: JSON\n extensions: [json, map]\n description: JavaScript Object Notation\n - id: yaml\n mime: application/yaml\n name: YAML\n extensions: [yaml, yml]\n description: YAML Ain't Markup Language\n - id: ndjson\n mime: application/x-ndjson\n name: NDJSON\n extensions: [ndjson]\n description: Newline-delimited JSON\n - id: csv\n mime: text/csv\n name: CSV\n extensions: [csv]\n description: Comma-separated values\n - id: xml\n mime: application/xml\n name: XML\n extensions: [xml]\n description: Extensible Markup Language\n - id: protobuf\n mime: application/x-protobuf\n name: Protocol Buffers\n extensions: [pb, proto]\n description: Google Protocol Buffers binary format\n - id: plain-text\n mime: text/plain\n name: Plain Text\n extensions: [txt]\n description: UTF-8 plain text\n",
|
|
13
|
+
"config/crucible-ts/library/foundry/patterns.yaml": "$schema: https://schemas.fulmenhq.dev/library/foundry/v1.0.0/patterns.schema.json\ndescription: Canonical regex/glob/literal patterns shared across Fulmen helper libraries.\nversion: v0.1.0\npatterns:\n - id: ansi-email\n name: RFC 5322 Email\n kind: regex\n pattern: '^[\\p{Letter}\\p{Number}._%+-]+@[\\p{Letter}\\p{Number}.-]+\\.[\\p{Letter}]{2,}$'\n flags:\n python:\n unicode: true\n ignoreCase: true\n go:\n unicode: true\n ignoreCase: true\n typescript:\n ignoreCase: true\n rust:\n unicode: true\n ignoreCase: true\n csharp:\n unicode: true\n ignoreCase: true\n description: 'Internationalized email address with Unicode letters; case-insensitive.'\n examples:\n - 'user@example.com'\n - '\u4F60\u597D@\u4F8B\u5B50.\u516C\u53F8'\n - id: slug\n name: Slug (kebab/underscore)\n kind: regex\n pattern: '^[a-z0-9]+(?:[-_][a-z0-9]+)*$'\n description: 'Lowercase slug with hyphen/underscore separators.'\n examples:\n - 'fulmen-hq'\n - 'data_pipeline'\n - id: path-segment\n name: Path Segment\n kind: regex\n pattern: '^[a-z0-9]+(?:[/_-][a-z0-9]+)*$'\n description: 'Lowercase path fragment allowing slash, underscore, hyphen separators.'\n examples:\n - 'foo/bar'\n - 'docs_v1'\n - id: identifier\n name: Identifier (Alpha + underscore)\n kind: regex\n pattern: '^[A-Za-z][A-Za-z0-9_]*[A-Za-z0-9]$'\n description: 'Camel/snake compatible identifier, starts with letter.'\n examples:\n - 'ConfigValue'\n - 'config_value1'\n - id: uri-scheme\n name: URI Scheme (RFC 3986)\n kind: regex\n pattern: '^[a-z][a-z0-9+.-]*$'\n description: 'Lowercase URI scheme (e.g., http, git+ssh).'\n examples:\n - 'https'\n - 'git+ssh'\n - id: logger-name\n name: Logger Name\n kind: regex\n pattern: '^[A-Za-z][A-Za-z0-9_]*(?:\\.[A-Za-z][A-Za-z0-9_]*)*$'\n description: 'Dot-separated logger names (e.g., package.module.component).'\n examples:\n - 'fulmen.logger'\n - 'app.core.worker'\n - id: env-prefix\n name: Environment Prefix\n kind: regex\n pattern: '^[A-Z][A-Z0-9_]*_$'\n description: 'Uppercase environment variable prefix ending with underscore.'\n examples:\n - 'FULMEN_'\n - 'CRUCIBLE_'\n - id: tag\n name: Tag (ASCII)\n kind: regex\n pattern: '^[A-Za-z0-9][A-Za-z0-9_\\-\\s]*[A-Za-z0-9]$'\n description: 'Label allowing spaces, underscores, hyphens; no leading/trailing separators.'\n examples:\n - 'stable release'\n - 'beta-1'\n - id: unicode-tag\n name: Tag (Unicode)\n kind: regex\n pattern: '^[\\p{L}\\p{N}][\\p{L}\\p{N}_\\-\\s]*[\\p{L}\\p{N}]$'\n flags:\n python:\n unicode: true\n go:\n unicode: true\n rust:\n unicode: true\n csharp:\n unicode: true\n description: 'Unicode-aware tag allowing letters/numbers from any script.'\n examples:\n - '\u56FD\u9645\u5316 \u6807\u7B7E'\n - '\u30C7\u30FC\u30BF-01'\n - id: domain-name\n name: Fully Qualified Domain Name\n kind: regex\n pattern: '^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z]{2,63}$'\n description: 'Lowercase ASCII domain labels per RFC 1035 (no wildcard).'\n examples:\n - 'example.com'\n - 'api.fulmenhq.net'\n - id: ipv6\n name: IPv6 Address (Full/Compressed)\n kind: regex\n pattern: '^(?:[A-Fa-f0-9]{1,4}:){7}[A-Fa-f0-9]{1,4}$|^(?:[A-Fa-f0-9]{1,4}:){1,7}:$|^:(?::[A-Fa-f0-9]{1,4}){1,7}$|^(?:[A-Fa-f0-9]{1,4}:){1,6}:[A-Fa-f0-9]{1,4}$|^(?:[A-Fa-f0-9]{1,4}:){1,5}(?::[A-Fa-f0-9]{1,4}){1,2}$|^(?:[A-Fa-f0-9]{1,4}:){1,4}(?::[A-Fa-f0-9]{1,4}){1,3}$|^(?:[A-Fa-f0-9]{1,4}:){1,3}(?::[A-Fa-f0-9]{1,4}){1,4}$|^(?:[A-Fa-f0-9]{1,4}:){1,2}(?::[A-Fa-f0-9]{1,4}){1,5}$|^[A-Fa-f0-9]{1,4}:(?:(?::[A-Fa-f0-9]{1,4}){1,6})$|^:(?::[A-Fa-f0-9]{1,4}){1,7}$|^(?:[A-Fa-f0-9]{1,4}:){1,4}:(?:[A-Fa-f0-9]{1,4}:){1,2}[A-Fa-f0-9]{1,4}$'\n description: 'IPv6 address with support for shorthand compression (RFC 4291).'\n examples:\n - '2001:0db8:85a3:0000:0000:8a2e:0370:7334'\n - '2001:db8::1428:57ab'\n - id: hex-lower\n name: Lowercase Hex String\n kind: regex\n pattern: '^[0-9a-f]+$'\n description: 'Lowercase hexadecimal characters (length validated by consumer).'\n examples:\n - 'deadbeef'\n - '0123456789abcdef'\n - id: base64\n name: Base64 Encoded String\n kind: regex\n pattern: '^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$'\n description: 'Standard Base64 encoding with padding.'\n examples:\n - 'SGVsbG8gd29ybGQ='\n - id: jwt\n name: JSON Web Token (compact)\n kind: regex\n pattern: '^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+$'\n description: 'JWT compact serialization (header.payload.signature).'\n examples:\n - 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U'\n - id: strict-iso-date\n name: ISO Date (YYYY-MM-DD)\n kind: regex\n pattern: '^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$'\n description: 'ISO 8601 calendar date with validated month/day ranges.'\n examples:\n - '2025-10-09'\n - id: iso-timestamp-z\n name: ISO Timestamp (UTC)\n kind: regex\n pattern: '^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,6})?Z$'\n description: 'UTC timestamp with optional fractional seconds.'\n examples:\n - '2025-10-09T14:15:16Z'\n - '2025-10-09T14:15:16.123456Z'\n - id: uuid-v4\n name: UUID v4\n kind: regex\n pattern: '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$'\n description: 'RFC 4122 version 4 UUID.'\n examples:\n - '123e4567-e89b-42d3-a456-426614174000'\n - id: ulid\n name: ULID\n kind: regex\n pattern: '^[0-9A-HJKMNP-TV-Z]{26}$'\n description: 'Crockford-base32 ULID (26 chars, upper-case).'\n examples:\n - '01HCP5MZF1H84D0CW7V5T9FQ0P'\n - id: semantic-version\n name: Semantic Version\n kind: regex\n pattern: '^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$'\n description: 'SemVer 2.0.0 specification-compliant version string.'\n examples:\n - '1.2.3'\n - '1.2.3-beta.1+build.5'\n - id: glob-any-json\n name: Glob \u2013 JSON Files\n kind: glob\n pattern: '**/*.json'\n description: 'Recursive glob matching all JSON files.'\n - id: glob-any-yaml\n name: Glob \u2013 YAML Files\n kind: glob\n pattern: '**/*.{yml,yaml}'\n description: 'Recursive glob matching YAML files.'\n",
|
|
14
|
+
"config/crucible-ts/library/foundry/signals.yaml": '$schema: https://schemas.fulmenhq.dev/library/foundry/v1.0.0/signals.schema.json\ndescription: Standard signal handling semantics for Fulmen ecosystem\nversion: v1.0.0\nsignals:\n - id: term\n name: SIGTERM\n unix_number: 15\n windows_event: CTRL_CLOSE_EVENT\n description: Graceful termination signal\n default_behavior: graceful_shutdown\n exit_code: 143 # 128 + 15\n timeout_seconds: 30\n cleanup_actions:\n - close_connections\n - flush_buffers\n - remove_pid_file\n - log_shutdown\n usage_notes: Standard termination signal sent by container orchestrators (Kubernetes, Docker). Applications should perform cleanup within timeout period before exiting.\n - id: int\n name: SIGINT\n unix_number: 2\n windows_event: CTRL_C_EVENT\n description: User interrupt (Ctrl+C)\n default_behavior: graceful_shutdown_with_double_tap\n exit_code: 130 # 128 + 2\n timeout_seconds: 5\n double_tap_window_seconds: 2\n double_tap_message: "Press Ctrl+C again within 2s to force quit"\n double_tap_behavior: immediate_exit\n double_tap_exit_code: 130\n cleanup_actions:\n - close_connections\n - flush_buffers\n - remove_pid_file\n - log_interrupt\n usage_notes: Interactive interrupt signal (Ctrl+C). First press initiates graceful shutdown, second press within 2s forces immediate exit for hung processes.\n - id: hup\n name: SIGHUP\n unix_number: 1\n windows_event: null\n description: Hangup signal (config reload via restart)\n default_behavior: reload_via_restart\n exit_code: 129 # 128 + 1\n reload_strategy: restart_based\n validation_required: true\n timeout_seconds: 30\n cleanup_actions:\n - validate_new_config_against_schema\n - graceful_shutdown\n - restart_with_new_config\n - log_reload\n usage_notes: Historically "hangup" (terminal disconnect). In Fulmen, triggers config reload via restart. MANDATORY schema validation before restart. On Windows, use HTTP /admin/signal endpoint as fallback.\n windows_fallback:\n fallback_behavior: http_admin_endpoint\n log_level: INFO\n log_message: "SIGHUP unavailable on Windows - use HTTP endpoint for config reload"\n log_template: "signal=${signal} platform=${platform} fallback=${fallback_behavior} message=\'${operation_hint}\'"\n operation_hint: "POST /admin/signal with signal=HUP"\n telemetry_event: fulmen.signal.unsupported\n telemetry_tags:\n signal: SIGHUP\n platform: windows\n fallback_behavior: http_admin_endpoint\n - id: quit\n name: SIGQUIT\n unix_number: 3\n windows_event: CTRL_BREAK_EVENT\n description: Quit with core dump (immediate termination)\n default_behavior: immediate_exit\n exit_code: 131 # 128 + 3\n timeout_seconds: 0\n usage_notes: Immediate termination signal (Ctrl+\\\\ on Unix, Ctrl+Break on Windows). Does not perform cleanup. Use for emergency shutdown or debugging (core dumps).\n - id: pipe\n name: SIGPIPE\n unix_number: 13\n windows_event: null\n description: Broken pipe (write to closed socket/pipe)\n default_behavior: observe_only\n exit_code: 141 # 128 + 13\n usage_notes: Default POSIX behavior terminates process immediately. Fulmen default is observe_only (log at INFO level + exit gracefully with code 141). Applications may override to ignore SIGPIPE for network services that expect broken pipes. Long-running servers typically ignore; CLI tools typically exit.\n windows_fallback:\n fallback_behavior: exception_handling\n log_level: INFO\n log_message: "SIGPIPE unavailable on Windows - broken pipes raise exceptions instead"\n log_template: "signal=${signal} platform=${platform} fallback=${fallback_behavior} message=\'${operation_hint}\'"\n operation_hint: "Handle BrokenPipeError (Python), EPIPE (Go), EPIPE (C)"\n telemetry_event: fulmen.signal.unsupported\n telemetry_tags:\n signal: SIGPIPE\n platform: windows\n fallback_behavior: exception_handling\n - id: alrm\n name: SIGALRM\n unix_number: 14\n windows_event: null\n description: Alarm timer expired (watchdog timeout)\n default_behavior: immediate_exit\n exit_code: 142 # 128 + 14\n timeout_seconds: 0\n usage_notes: Used by watchdog timers. Treat as timeout-induced exit unless application overrides. Watchdog pattern - call signal.alarm(N) to set timer, reset periodically with progress; if no reset within N seconds, SIGALRM fires and process exits. Out of scope for v1.0.0 module implementations.\n windows_fallback:\n fallback_behavior: timer_api\n log_level: INFO\n log_message: "SIGALRM unavailable on Windows - use native timer APIs instead"\n log_template: "signal=${signal} platform=${platform} fallback=${fallback_behavior} message=\'${operation_hint}\'"\n operation_hint: "Use threading.Timer (Python), time.AfterFunc (Go), setTimeout (TypeScript)"\n telemetry_event: fulmen.signal.unsupported\n telemetry_tags:\n signal: SIGALRM\n platform: windows\n fallback_behavior: timer_api\n - id: usr1\n name: SIGUSR1\n unix_number: 10\n platform_overrides:\n darwin: 30\n freebsd: 30\n windows_event: null\n description: User-defined signal 1\n default_behavior: custom\n exit_code: 138 # 128 + 10\n usage_notes: Application-specific signal (e.g., reopen log files, dump statistics, toggle verbose logging). Helper libraries provide registration API; application provides custom handler.\n windows_fallback:\n fallback_behavior: http_admin_endpoint\n log_level: INFO\n log_message: "SIGUSR1 unavailable on Windows - use HTTP endpoint for custom operations"\n log_template: "signal=${signal} platform=${platform} fallback=${fallback_behavior} message=\'${operation_hint}\'"\n operation_hint: "POST /admin/signal with signal=USR1"\n telemetry_event: fulmen.signal.unsupported\n telemetry_tags:\n signal: SIGUSR1\n platform: windows\n fallback_behavior: http_admin_endpoint\n - id: usr2\n name: SIGUSR2\n unix_number: 12\n platform_overrides:\n darwin: 31\n freebsd: 31\n windows_event: null\n description: User-defined signal 2\n default_behavior: custom\n exit_code: 140 # 128 + 12\n usage_notes: Application-specific signal (e.g., toggle debug mode, trigger profiling, rotate credentials). Helper libraries provide registration API; application provides custom handler.\n windows_fallback:\n fallback_behavior: http_admin_endpoint\n log_level: INFO\n log_message: "SIGUSR2 unavailable on Windows - use HTTP endpoint for custom operations"\n log_template: "signal=${signal} platform=${platform} fallback=${fallback_behavior} message=\'${operation_hint}\'"\n operation_hint: "POST /admin/signal with signal=USR2"\n telemetry_event: fulmen.signal.unsupported\n telemetry_tags:\n signal: SIGUSR2\n platform: windows\n fallback_behavior: http_admin_endpoint\n - id: kill\n name: SIGKILL\n unix_number: 9\n windows_event: null\n description: Force immediate termination - cannot be caught, blocked, or ignored\n default_behavior: immediate_exit\n exit_code: 137 # 128 + 9\n timeout_seconds: 0\n cleanup_actions: []\n usage_notes: |\n SIGKILL terminates a process immediately without allowing cleanup.\n Use only as a last resort after SIGTERM grace period expires. The process\n has no opportunity to save state, close files, or release resources.\n On Windows, use TerminateProcess() for single process or TerminateJobObject() for groups.\nbehaviors:\n - id: graceful_shutdown\n name: Graceful Shutdown\n description: Clean shutdown with timeout and cleanup chain\n phases:\n - name: notify\n description: Log signal receipt with correlation ID\n - name: stop_accepting\n description: Stop accepting new work (close listeners, reject requests)\n - name: drain\n description: Complete in-flight operations within timeout\n - name: cleanup\n description: Run registered cleanup handlers in order\n - name: exit\n description: Exit with appropriate code (128+N pattern)\n - id: graceful_shutdown_with_double_tap\n name: Graceful Shutdown with Double-Tap\n description: Graceful shutdown with force-quit option (Ctrl+C pattern)\n phases:\n - name: first_signal\n description: First signal starts graceful shutdown and prints hint message\n - name: notify\n description: Log signal receipt with correlation ID\n - name: stop_accepting\n description: Stop accepting new work\n - name: drain\n description: Complete in-flight operations within timeout\n - name: cleanup\n description: Run registered cleanup handlers in order\n - name: second_signal_check\n description: If second signal within window, force immediate exit\n - name: exit\n description: Exit with appropriate code\n - id: reload_via_restart\n name: Configuration Reload via Restart\n description: Reload configuration by validating and restarting process\n phases:\n - name: notify\n description: Log reload request with correlation ID\n - name: validate\n description: Validate new configuration against Crucible schema (MANDATORY)\n - name: reject_invalid\n description: If invalid, log error and continue with current config (no restart)\n - name: graceful_shutdown\n description: If valid, initiate graceful shutdown\n - name: exit\n description: Exit with code 129 (SIGHUP) - process supervisor restarts\n - name: restart\n description: Process supervisor (systemd, K8s, etc.) restarts process with new config\n - id: immediate_exit\n name: Immediate Exit\n description: Exit immediately without cleanup (emergency shutdown)\n phases:\n - name: notify\n description: Log signal receipt (no correlation ID needed - too fast)\n - name: exit\n description: Exit immediately with appropriate code\n - id: custom\n name: Custom Handler\n description: Application-specific behavior defined by handler registration\n phases:\n - name: delegate\n description: Call application-provided handler function\n - name: log_completion\n description: Log custom handler completion (do not exit unless handler exits)\n - id: observe_only\n name: Observe Only\n description: Log the signal and increment telemetry without exiting\n phases:\n - name: notify\n description: Log signal receipt at INFO level\n - name: telemetry\n description: Increment signal counter in telemetry system\n - name: continue\n description: Continue execution (do not exit)\nos_mappings:\n unix:\n SIGTERM: 15\n SIGINT: 2\n SIGHUP: 1\n SIGQUIT: 3\n SIGPIPE: 13\n SIGALRM: 14\n SIGUSR1: 10 # Linux standard\n SIGUSR2: 12 # Linux standard\n SIGKILL: 9 # Not catchable, documented for completeness\n windows:\n CTRL_C_EVENT: 0\n CTRL_BREAK_EVENT: 1\n CTRL_CLOSE_EVENT: 2\n CTRL_LOGOFF_EVENT: 5\n CTRL_SHUTDOWN_EVENT: 6\n # Platform-specific signal number overrides\n platform_overrides:\n darwin: # macOS\n SIGUSR1: 30\n SIGUSR2: 31\n freebsd:\n SIGUSR1: 30\n SIGUSR2: 31\n # Mapping Unix signals to Windows console events\n signal_to_event:\n SIGTERM: CTRL_CLOSE_EVENT\n SIGINT: CTRL_C_EVENT\n SIGQUIT: CTRL_BREAK_EVENT\n SIGHUP: null # No Windows equivalent - use HTTP fallback\n SIGPIPE: null # No Windows equivalent - handled via exceptions\n SIGALRM: null # No Windows equivalent - use timers\n SIGUSR1: null # No Windows equivalent - use HTTP fallback\n SIGUSR2: null # No Windows equivalent - use HTTP fallback\n# Platform support matrix for helper library implementations\nplatform_support:\n - signal: SIGTERM\n linux: native\n macos: native\n freebsd: native\n windows: mapped # CTRL_CLOSE_EVENT\n notes: Fully supported across all platforms\n - signal: SIGINT\n linux: native\n macos: native\n freebsd: native\n windows: mapped # CTRL_C_EVENT\n notes: Fully supported across all platforms\n - signal: SIGHUP\n linux: native\n macos: native\n freebsd: native\n windows: unsupported\n fallback: http_admin_endpoint\n notes: On Windows, use HTTP POST /admin/signal with signal=HUP\n - signal: SIGQUIT\n linux: native\n macos: native\n freebsd: native\n windows: mapped # CTRL_BREAK_EVENT\n notes: Fully supported across all platforms\n - signal: SIGPIPE\n linux: native\n macos: native\n freebsd: native\n windows: unsupported\n fallback: exception_handling\n notes: On Windows, broken pipes generate exceptions instead of signals\n - signal: SIGALRM\n linux: native\n macos: native\n freebsd: native\n windows: unsupported\n fallback: timer_api\n notes: On Windows, use threading.Timer (Python) or setTimeout (TypeScript)\n - signal: SIGUSR1\n linux: native\n macos: native # signal 30\n freebsd: native # signal 30\n windows: unsupported\n fallback: http_admin_endpoint\n notes: Signal number varies by platform. On Windows, use HTTP POST /admin/signal with signal=USR1\n - signal: SIGUSR2\n linux: native\n macos: native # signal 31\n freebsd: native # signal 31\n windows: unsupported\n fallback: http_admin_endpoint\n notes: Signal number varies by platform. On Windows, use HTTP POST /admin/signal with signal=USR2\n - signal: SIGKILL\n linux: native\n macos: native\n freebsd: native\n windows: mapped\n notes: Cannot be caught or ignored. Windows uses TerminateProcess/TerminateJobObject.\n# Exit code mappings (128+N pattern per POSIX)\nexit_codes:\n SIGTERM: 143 # 128 + 15\n SIGINT: 130 # 128 + 2\n SIGHUP: 129 # 128 + 1\n SIGQUIT: 131 # 128 + 3\n SIGKILL: 137 # 128 + 9\n SIGPIPE: 141 # 128 + 13\n SIGALRM: 142 # 128 + 14\n SIGUSR1: 138 # 128 + 10\n SIGUSR2: 140 # 128 + 12\n note: Exit codes follow POSIX 128+N pattern where N is the signal number. These codes are cross-referenced in config/library/foundry/exit-codes.yaml.\n'
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// src/foundry/embedded-assets.ts
|
|
19
|
+
var registered = false;
|
|
20
|
+
function ensureFoundryAssetsRegistered() {
|
|
21
|
+
if (registered) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
registerEmbeddedAssets(manifest);
|
|
25
|
+
registered = true;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// src/foundry/signals/catalog.ts
|
|
29
|
+
var SIGNALS_LOGICAL_PATH = "config/crucible-ts/library/foundry/signals.yaml";
|
|
30
|
+
var SCHEMA_ID = "library/foundry/v1.0.0/signals";
|
|
31
|
+
async function loadCatalog() {
|
|
32
|
+
const catalogName = "signals";
|
|
33
|
+
try {
|
|
34
|
+
ensureFoundryAssetsRegistered();
|
|
35
|
+
const resolver = getAssetResolver();
|
|
36
|
+
let content;
|
|
37
|
+
try {
|
|
38
|
+
content = await resolver.read(SIGNALS_LOGICAL_PATH);
|
|
39
|
+
} catch {
|
|
40
|
+
throw FoundryCatalogError.missingCatalog(catalogName);
|
|
41
|
+
}
|
|
42
|
+
const data = parse(content);
|
|
43
|
+
const result = await validateDataBySchemaId(data, SCHEMA_ID);
|
|
44
|
+
if (!result.valid) {
|
|
45
|
+
const errorMessages = result.diagnostics.map((d) => `${d.pointer}: ${d.message}`).join("; ");
|
|
46
|
+
throw FoundryCatalogError.invalidSchema(
|
|
47
|
+
catalogName,
|
|
48
|
+
`Schema validation failed: ${errorMessages}`
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
return data;
|
|
52
|
+
} catch (error) {
|
|
53
|
+
if (error instanceof FoundryCatalogError) {
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
throw FoundryCatalogError.invalidSchema(
|
|
57
|
+
catalogName,
|
|
58
|
+
`Failed to load catalog: ${error.message}`,
|
|
59
|
+
error
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
var cachedCatalog = null;
|
|
64
|
+
async function getCatalog() {
|
|
65
|
+
if (!cachedCatalog) {
|
|
66
|
+
cachedCatalog = await loadCatalog();
|
|
67
|
+
}
|
|
68
|
+
return cachedCatalog;
|
|
69
|
+
}
|
|
70
|
+
async function getSignalsVersion() {
|
|
71
|
+
const catalog = await getCatalog();
|
|
72
|
+
return catalog.version;
|
|
73
|
+
}
|
|
74
|
+
async function listSignals() {
|
|
75
|
+
const catalog = await getCatalog();
|
|
76
|
+
return catalog.signals.map((signal) => ({ ...signal }));
|
|
77
|
+
}
|
|
78
|
+
async function getSignal(identifier) {
|
|
79
|
+
const catalog = await getCatalog();
|
|
80
|
+
const signal = catalog.signals.find((s) => s.id === identifier || s.name === identifier);
|
|
81
|
+
return signal ? { ...signal } : null;
|
|
82
|
+
}
|
|
83
|
+
async function listBehaviors() {
|
|
84
|
+
const catalog = await getCatalog();
|
|
85
|
+
return catalog.behaviors.map((behavior) => ({ ...behavior }));
|
|
86
|
+
}
|
|
87
|
+
async function getBehavior(id) {
|
|
88
|
+
const catalog = await getCatalog();
|
|
89
|
+
const behavior = catalog.behaviors.find((b) => b.id === id);
|
|
90
|
+
return behavior ? { ...behavior } : null;
|
|
91
|
+
}
|
|
92
|
+
async function getSignalCatalog() {
|
|
93
|
+
return await getCatalog();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// src/foundry/signals/capabilities.ts
|
|
97
|
+
function getPlatform() {
|
|
98
|
+
const platform = process.platform;
|
|
99
|
+
switch (platform) {
|
|
100
|
+
case "linux":
|
|
101
|
+
return "linux";
|
|
102
|
+
case "darwin":
|
|
103
|
+
return "darwin";
|
|
104
|
+
case "win32":
|
|
105
|
+
return "win32";
|
|
106
|
+
case "freebsd":
|
|
107
|
+
return "freebsd";
|
|
108
|
+
default:
|
|
109
|
+
return "unknown";
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function isPOSIX() {
|
|
113
|
+
const platform = getPlatform();
|
|
114
|
+
return platform === "linux" || platform === "darwin" || platform === "freebsd";
|
|
115
|
+
}
|
|
116
|
+
function isWindows() {
|
|
117
|
+
return getPlatform() === "win32";
|
|
118
|
+
}
|
|
119
|
+
async function supportsSignal(signalName) {
|
|
120
|
+
const signal = await getSignal(signalName);
|
|
121
|
+
if (!signal) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
if (isPOSIX()) {
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
if (isWindows()) {
|
|
128
|
+
return signal.windows_event !== null;
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
function supportsSignalExitCodes() {
|
|
133
|
+
return isPOSIX();
|
|
134
|
+
}
|
|
135
|
+
async function getPlatformCapabilities() {
|
|
136
|
+
const platform = getPlatform();
|
|
137
|
+
const isPosix = isPOSIX();
|
|
138
|
+
const isWin = isWindows();
|
|
139
|
+
const catalog = await getSignalCatalog();
|
|
140
|
+
const supported = [];
|
|
141
|
+
const unsupported = [];
|
|
142
|
+
const mapped = [];
|
|
143
|
+
for (const signal of catalog.signals) {
|
|
144
|
+
if (isPosix) {
|
|
145
|
+
supported.push(signal.name);
|
|
146
|
+
} else if (isWin) {
|
|
147
|
+
if (signal.windows_event !== null) {
|
|
148
|
+
supported.push(signal.name);
|
|
149
|
+
mapped.push(signal.name);
|
|
150
|
+
} else {
|
|
151
|
+
unsupported.push(signal.name);
|
|
152
|
+
}
|
|
153
|
+
} else {
|
|
154
|
+
unsupported.push(signal.name);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
platform,
|
|
159
|
+
isPOSIX: isPosix,
|
|
160
|
+
isWindows: isWin,
|
|
161
|
+
supportsNativeSignals: isPosix,
|
|
162
|
+
supportsSignalExitCodes: supportsSignalExitCodes(),
|
|
163
|
+
supportedSignals: supported,
|
|
164
|
+
unsupportedSignals: unsupported,
|
|
165
|
+
mappedSignals: mapped
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
async function getSignalNumber(signalName) {
|
|
169
|
+
const signal = await getSignal(signalName);
|
|
170
|
+
if (!signal) {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
const platform = getPlatform();
|
|
174
|
+
if (signal.platform_overrides) {
|
|
175
|
+
if (platform === "darwin" && signal.platform_overrides.darwin !== void 0) {
|
|
176
|
+
return signal.platform_overrides.darwin;
|
|
177
|
+
}
|
|
178
|
+
if (platform === "freebsd" && signal.platform_overrides.freebsd !== void 0) {
|
|
179
|
+
return signal.platform_overrides.freebsd;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return signal.unix_number;
|
|
183
|
+
}
|
|
184
|
+
async function getWindowsEvent(signalName) {
|
|
185
|
+
const signal = await getSignal(signalName);
|
|
186
|
+
if (!signal) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
return signal.windows_event;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export { ensureFoundryAssetsRegistered, getBehavior, getPlatform, getPlatformCapabilities, getSignal, getSignalCatalog, getSignalNumber, getSignalsVersion, getWindowsEvent, isPOSIX, isWindows, listBehaviors, listSignals, supportsSignal, supportsSignalExitCodes };
|
|
193
|
+
//# sourceMappingURL=chunk-24BAF63H.js.map
|
|
194
|
+
//# sourceMappingURL=chunk-24BAF63H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/assets/generated/foundry.generated.ts","../src/foundry/embedded-assets.ts","../src/foundry/signals/catalog.ts","../src/foundry/signals/capabilities.ts"],"names":["parseYaml"],"mappings":";;;;;;AAKO,IAAM,QAAA,GAAkC;AAAA,EAC7C,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO;AAAA,IACL,uDAAA,EAAyD,mvBAAA;AAAA,IACzD,uDAAA,EAAyD,2kIAAA;AAAA,IACzD,oDAAA,EAAsD,+kCAAA;AAAA,IACtD,kDAAA,EAAoD,wjNAAA;AAAA,IACpD,iDAAA,EAAmD;AAAA;AAEvD,CAAA;;;ACCA,IAAI,UAAA,GAAa,KAAA;AAGV,SAAS,6BAAA,GAAsC;AACpD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA;AAAA,EACF;AACA,EAAA,sBAAA,CAAuB,QAAe,CAAA;AACtC,EAAA,UAAA,GAAa,IAAA;AACf;;;ACTA,IAAM,oBAAA,GAAuB,iDAAA;AAG7B,IAAM,SAAA,GAAY,gCAAA;AAKlB,eAAe,WAAA,GAAsC;AACnD,EAAA,MAAM,WAAA,GAAc,SAAA;AAEpB,EAAA,IAAI;AACF,IAAA,6BAAA,EAA8B;AAC9B,IAAA,MAAM,WAAW,gBAAA,EAAiB;AAElC,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,CAAK,oBAAoB,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,mBAAA,CAAoB,eAAe,WAAW,CAAA;AAAA,IACtD;AAGA,IAAA,MAAM,IAAA,GAAOA,MAAU,OAAO,CAAA;AAG9B,IAAA,MAAM,MAAA,GAAS,MAAM,sBAAA,CAAuB,IAAA,EAAM,SAAS,CAAA;AAC3D,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,OAAO,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAC3F,MAAA,MAAM,mBAAA,CAAoB,aAAA;AAAA,QACxB,WAAA;AAAA,QACA,6BAA6B,aAAa,CAAA;AAAA,OAC5C;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,mBAAA,EAAqB;AACxC,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,MAAM,mBAAA,CAAoB,aAAA;AAAA,MACxB,WAAA;AAAA,MACA,CAAA,wBAAA,EAA4B,MAAgB,OAAO,CAAA,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF;AACF;AAGA,IAAI,aAAA,GAAsC,IAAA;AAK1C,eAAe,UAAA,GAAqC;AAClD,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,aAAA,GAAgB,MAAM,WAAA,EAAY;AAAA,EACpC;AACA,EAAA,OAAO,aAAA;AACT;AAKA,eAAsB,iBAAA,GAAqC;AACzD,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,EAAW;AACjC,EAAA,OAAO,OAAA,CAAQ,OAAA;AACjB;AAKA,eAAsB,WAAA,GAAqC;AACzD,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,EAAW;AACjC,EAAA,OAAO,OAAA,CAAQ,QAAQ,GAAA,CAAI,CAAC,YAAY,EAAE,GAAG,QAAO,CAAE,CAAA;AACxD;AAKA,eAAsB,UAAU,UAAA,EAAgD;AAC9E,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,EAAW;AACjC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,UAAA,IAAc,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA;AACvF,EAAA,OAAO,MAAA,GAAS,EAAE,GAAG,MAAA,EAAO,GAAI,IAAA;AAClC;AAKA,eAAsB,aAAA,GAAyC;AAC7D,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,EAAW;AACjC,EAAA,OAAO,OAAA,CAAQ,UAAU,GAAA,CAAI,CAAC,cAAc,EAAE,GAAG,UAAS,CAAE,CAAA;AAC9D;AAKA,eAAsB,YAAY,EAAA,EAA0C;AAC1E,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,EAAW;AACjC,EAAA,MAAM,QAAA,GAAW,QAAQ,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC1D,EAAA,OAAO,QAAA,GAAW,EAAE,GAAG,QAAA,EAAS,GAAI,IAAA;AACtC;AAKA,eAAsB,gBAAA,GAA2C;AAC/D,EAAA,OAAO,MAAM,UAAA,EAAW;AAC1B;;;AC5FO,SAAS,WAAA,GAAwB;AACtC,EAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AAEzB,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,OAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT;AACE,MAAA,OAAO,SAAA;AAAA;AAEb;AAKO,SAAS,OAAA,GAAmB;AACjC,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,OAAO,QAAA,KAAa,OAAA,IAAW,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,SAAA;AACvE;AAKO,SAAS,SAAA,GAAqB;AACnC,EAAA,OAAO,aAAY,KAAM,OAAA;AAC3B;AAYA,eAAsB,eAAe,UAAA,EAAsC;AACzE,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,UAAU,CAAA;AACzC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,SAAQ,EAAG;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAU,EAAG;AAEf,IAAA,OAAO,OAAO,aAAA,KAAkB,IAAA;AAAA,EAClC;AAGA,EAAA,OAAO,KAAA;AACT;AASO,SAAS,uBAAA,GAAmC;AAEjD,EAAA,OAAO,OAAA,EAAQ;AACjB;AAQA,eAAsB,uBAAA,GAAyD;AAC7E,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,UAAU,OAAA,EAAQ;AACxB,EAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,EAAA,MAAM,OAAA,GAAU,MAAM,gBAAA,EAAiB;AAEvC,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,KAAA,MAAW,MAAA,IAAU,QAAQ,OAAA,EAAS;AACpC,IAAA,IAAI,OAAA,EAAS;AAEX,MAAA,SAAA,CAAU,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,IAC5B,WAAW,KAAA,EAAO;AAChB,MAAA,IAAI,MAAA,CAAO,kBAAkB,IAAA,EAAM;AAEjC,QAAA,SAAA,CAAU,IAAA,CAAK,OAAO,IAAI,CAAA;AAC1B,QAAA,MAAA,CAAO,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,MACzB,CAAA,MAAO;AAEL,QAAA,WAAA,CAAY,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,MAC9B;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,WAAA,CAAY,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,OAAA,EAAS,OAAA;AAAA,IACT,SAAA,EAAW,KAAA;AAAA,IACX,qBAAA,EAAuB,OAAA;AAAA,IACvB,yBAAyB,uBAAA,EAAwB;AAAA,IACjD,gBAAA,EAAkB,SAAA;AAAA,IAClB,kBAAA,EAAoB,WAAA;AAAA,IACpB,aAAA,EAAe;AAAA,GACjB;AACF;AAWA,eAAsB,gBAAgB,UAAA,EAA4C;AAChF,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,UAAU,CAAA;AACzC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAW,WAAA,EAAY;AAG7B,EAAA,IAAI,OAAO,kBAAA,EAAoB;AAC7B,IAAA,IAAI,QAAA,KAAa,QAAA,IAAY,MAAA,CAAO,kBAAA,CAAmB,WAAW,MAAA,EAAW;AAC3E,MAAA,OAAO,OAAO,kBAAA,CAAmB,MAAA;AAAA,IACnC;AACA,IAAA,IAAI,QAAA,KAAa,SAAA,IAAa,MAAA,CAAO,kBAAA,CAAmB,YAAY,MAAA,EAAW;AAC7E,MAAA,OAAO,OAAO,kBAAA,CAAmB,OAAA;AAAA,IACnC;AAAA,EACF;AAGA,EAAA,OAAO,MAAA,CAAO,WAAA;AAChB;AAUA,eAAsB,gBAAgB,UAAA,EAA4C;AAChF,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,UAAU,CAAA;AACzC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,CAAO,aAAA;AAChB","file":"chunk-24BAF63H.js","sourcesContent":["// AUTO-GENERATED by scripts/embed-assets.ts. DO NOT EDIT.\n// Run `make embed-assets` to regenerate after `make sync-ssot`.\n// Domain: foundry (5 assets)\nimport type { EmbeddedAssetManifest } from \"../types.js\";\n\nexport const manifest: EmbeddedAssetManifest = {\n domain: \"foundry\",\n files: {\n \"config/crucible-ts/library/foundry/country-codes.yaml\": \"$schema: https://schemas.fulmenhq.dev/library/foundry/v1.0.0/country-codes.schema.json\\ndescription: Sample ISO 3166 country codes for helper-library lookups.\\nversion: v0.1.0\\ncountries:\\n - alpha2: US\\n alpha3: USA\\n numeric: '840'\\n name: United States of America\\n officialName: United States of America\\n - alpha2: CA\\n alpha3: CAN\\n numeric: '124'\\n name: Canada\\n officialName: Canada\\n - alpha2: JP\\n alpha3: JPN\\n numeric: '392'\\n name: Japan\\n officialName: Japan\\n - alpha2: DE\\n alpha3: DEU\\n numeric: '276'\\n name: Germany\\n officialName: Federal Republic of Germany\\n - alpha2: BR\\n alpha3: BRA\\n numeric: '076'\\n name: Brazil\\n officialName: Federative Republic of Brazil\\n\",\n \"config/crucible-ts/library/foundry/http-statuses.yaml\": \"$schema: https://schemas.fulmenhq.dev/library/foundry/v1.0.0/http-status-groups.schema.json\\ndescription: HTTP status code groups shared across helper libraries.\\nversion: v0.1.0\\ngroups:\\n - id: informational\\n name: Informational Responses\\n description: '1xx HTTP status codes indicating provisional responses.'\\n codes:\\n - value: 100\\n reason: Continue\\n - value: 101\\n reason: Switching Protocols\\n - value: 102\\n reason: Processing\\n - value: 103\\n reason: Early Hints\\n - id: success\\n name: Successful Responses\\n description: '2xx HTTP status codes indicating successful requests.'\\n codes:\\n - value: 200\\n reason: OK\\n - value: 201\\n reason: Created\\n - value: 202\\n reason: Accepted\\n - value: 203\\n reason: Non-Authoritative Information\\n - value: 204\\n reason: No Content\\n - value: 205\\n reason: Reset Content\\n - value: 206\\n reason: Partial Content\\n - value: 207\\n reason: Multi-Status\\n - value: 208\\n reason: Already Reported\\n - value: 226\\n reason: IM Used\\n - id: redirect\\n name: Redirection Responses\\n description: '3xx HTTP status codes indicating redirects.'\\n codes:\\n - value: 300\\n reason: Multiple Choices\\n - value: 301\\n reason: Moved Permanently\\n - value: 302\\n reason: Found\\n - value: 303\\n reason: See Other\\n - value: 304\\n reason: Not Modified\\n - value: 305\\n reason: Use Proxy\\n - value: 307\\n reason: Temporary Redirect\\n - value: 308\\n reason: Permanent Redirect\\n - id: client-error\\n name: Client Error Responses\\n description: '4xx HTTP status codes indicating client errors.'\\n codes:\\n - value: 400\\n reason: Bad Request\\n - value: 401\\n reason: Unauthorized\\n - value: 402\\n reason: Payment Required\\n - value: 403\\n reason: Forbidden\\n - value: 404\\n reason: Not Found\\n - value: 405\\n reason: Method Not Allowed\\n - value: 406\\n reason: Not Acceptable\\n - value: 407\\n reason: Proxy Authentication Required\\n - value: 408\\n reason: Request Timeout\\n - value: 409\\n reason: Conflict\\n - value: 410\\n reason: Gone\\n - value: 411\\n reason: Length Required\\n - value: 412\\n reason: Precondition Failed\\n - value: 413\\n reason: Content Too Large\\n - value: 414\\n reason: URI Too Long\\n - value: 415\\n reason: Unsupported Media Type\\n - value: 416\\n reason: Range Not Satisfiable\\n - value: 417\\n reason: Expectation Failed\\n - value: 418\\n reason: I'm a teapot\\n - value: 421\\n reason: Misdirected Request\\n - value: 422\\n reason: Unprocessable Content\\n - value: 423\\n reason: Locked\\n - value: 424\\n reason: Failed Dependency\\n - value: 425\\n reason: Too Early\\n - value: 426\\n reason: Upgrade Required\\n - value: 428\\n reason: Precondition Required\\n - value: 429\\n reason: Too Many Requests\\n - value: 431\\n reason: Request Header Fields Too Large\\n - value: 451\\n reason: Unavailable For Legal Reasons\\n - id: server-error\\n name: Server Error Responses\\n description: '5xx HTTP status codes indicating server errors.'\\n codes:\\n - value: 500\\n reason: Internal Server Error\\n - value: 501\\n reason: Not Implemented\\n - value: 502\\n reason: Bad Gateway\\n - value: 503\\n reason: Service Unavailable\\n - value: 504\\n reason: Gateway Timeout\\n - value: 505\\n reason: HTTP Version Not Supported\\n - value: 506\\n reason: Variant Also Negotiates\\n - value: 507\\n reason: Insufficient Storage\\n - value: 508\\n reason: Loop Detected\\n - value: 510\\n reason: Not Extended\\n - value: 511\\n reason: Network Authentication Required\\n\",\n \"config/crucible-ts/library/foundry/mime-types.yaml\": \"$schema: https://schemas.fulmenhq.dev/library/foundry/v1.0.0/mime-types.schema.json\\ndescription: Common MIME types that helper libraries should recognize.\\nversion: v0.1.0\\ntypes:\\n - id: json\\n mime: application/json\\n name: JSON\\n extensions: [json, map]\\n description: JavaScript Object Notation\\n - id: yaml\\n mime: application/yaml\\n name: YAML\\n extensions: [yaml, yml]\\n description: YAML Ain't Markup Language\\n - id: ndjson\\n mime: application/x-ndjson\\n name: NDJSON\\n extensions: [ndjson]\\n description: Newline-delimited JSON\\n - id: csv\\n mime: text/csv\\n name: CSV\\n extensions: [csv]\\n description: Comma-separated values\\n - id: xml\\n mime: application/xml\\n name: XML\\n extensions: [xml]\\n description: Extensible Markup Language\\n - id: protobuf\\n mime: application/x-protobuf\\n name: Protocol Buffers\\n extensions: [pb, proto]\\n description: Google Protocol Buffers binary format\\n - id: plain-text\\n mime: text/plain\\n name: Plain Text\\n extensions: [txt]\\n description: UTF-8 plain text\\n\",\n \"config/crucible-ts/library/foundry/patterns.yaml\": \"$schema: https://schemas.fulmenhq.dev/library/foundry/v1.0.0/patterns.schema.json\\ndescription: Canonical regex/glob/literal patterns shared across Fulmen helper libraries.\\nversion: v0.1.0\\npatterns:\\n - id: ansi-email\\n name: RFC 5322 Email\\n kind: regex\\n pattern: '^[\\\\p{Letter}\\\\p{Number}._%+-]+@[\\\\p{Letter}\\\\p{Number}.-]+\\\\.[\\\\p{Letter}]{2,}$'\\n flags:\\n python:\\n unicode: true\\n ignoreCase: true\\n go:\\n unicode: true\\n ignoreCase: true\\n typescript:\\n ignoreCase: true\\n rust:\\n unicode: true\\n ignoreCase: true\\n csharp:\\n unicode: true\\n ignoreCase: true\\n description: 'Internationalized email address with Unicode letters; case-insensitive.'\\n examples:\\n - 'user@example.com'\\n - '你好@例子.公司'\\n - id: slug\\n name: Slug (kebab/underscore)\\n kind: regex\\n pattern: '^[a-z0-9]+(?:[-_][a-z0-9]+)*$'\\n description: 'Lowercase slug with hyphen/underscore separators.'\\n examples:\\n - 'fulmen-hq'\\n - 'data_pipeline'\\n - id: path-segment\\n name: Path Segment\\n kind: regex\\n pattern: '^[a-z0-9]+(?:[/_-][a-z0-9]+)*$'\\n description: 'Lowercase path fragment allowing slash, underscore, hyphen separators.'\\n examples:\\n - 'foo/bar'\\n - 'docs_v1'\\n - id: identifier\\n name: Identifier (Alpha + underscore)\\n kind: regex\\n pattern: '^[A-Za-z][A-Za-z0-9_]*[A-Za-z0-9]$'\\n description: 'Camel/snake compatible identifier, starts with letter.'\\n examples:\\n - 'ConfigValue'\\n - 'config_value1'\\n - id: uri-scheme\\n name: URI Scheme (RFC 3986)\\n kind: regex\\n pattern: '^[a-z][a-z0-9+.-]*$'\\n description: 'Lowercase URI scheme (e.g., http, git+ssh).'\\n examples:\\n - 'https'\\n - 'git+ssh'\\n - id: logger-name\\n name: Logger Name\\n kind: regex\\n pattern: '^[A-Za-z][A-Za-z0-9_]*(?:\\\\.[A-Za-z][A-Za-z0-9_]*)*$'\\n description: 'Dot-separated logger names (e.g., package.module.component).'\\n examples:\\n - 'fulmen.logger'\\n - 'app.core.worker'\\n - id: env-prefix\\n name: Environment Prefix\\n kind: regex\\n pattern: '^[A-Z][A-Z0-9_]*_$'\\n description: 'Uppercase environment variable prefix ending with underscore.'\\n examples:\\n - 'FULMEN_'\\n - 'CRUCIBLE_'\\n - id: tag\\n name: Tag (ASCII)\\n kind: regex\\n pattern: '^[A-Za-z0-9][A-Za-z0-9_\\\\-\\\\s]*[A-Za-z0-9]$'\\n description: 'Label allowing spaces, underscores, hyphens; no leading/trailing separators.'\\n examples:\\n - 'stable release'\\n - 'beta-1'\\n - id: unicode-tag\\n name: Tag (Unicode)\\n kind: regex\\n pattern: '^[\\\\p{L}\\\\p{N}][\\\\p{L}\\\\p{N}_\\\\-\\\\s]*[\\\\p{L}\\\\p{N}]$'\\n flags:\\n python:\\n unicode: true\\n go:\\n unicode: true\\n rust:\\n unicode: true\\n csharp:\\n unicode: true\\n description: 'Unicode-aware tag allowing letters/numbers from any script.'\\n examples:\\n - '国际化 标签'\\n - 'データ-01'\\n - id: domain-name\\n name: Fully Qualified Domain Name\\n kind: regex\\n pattern: '^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\\\.)+[a-z]{2,63}$'\\n description: 'Lowercase ASCII domain labels per RFC 1035 (no wildcard).'\\n examples:\\n - 'example.com'\\n - 'api.fulmenhq.net'\\n - id: ipv6\\n name: IPv6 Address (Full/Compressed)\\n kind: regex\\n pattern: '^(?:[A-Fa-f0-9]{1,4}:){7}[A-Fa-f0-9]{1,4}$|^(?:[A-Fa-f0-9]{1,4}:){1,7}:$|^:(?::[A-Fa-f0-9]{1,4}){1,7}$|^(?:[A-Fa-f0-9]{1,4}:){1,6}:[A-Fa-f0-9]{1,4}$|^(?:[A-Fa-f0-9]{1,4}:){1,5}(?::[A-Fa-f0-9]{1,4}){1,2}$|^(?:[A-Fa-f0-9]{1,4}:){1,4}(?::[A-Fa-f0-9]{1,4}){1,3}$|^(?:[A-Fa-f0-9]{1,4}:){1,3}(?::[A-Fa-f0-9]{1,4}){1,4}$|^(?:[A-Fa-f0-9]{1,4}:){1,2}(?::[A-Fa-f0-9]{1,4}){1,5}$|^[A-Fa-f0-9]{1,4}:(?:(?::[A-Fa-f0-9]{1,4}){1,6})$|^:(?::[A-Fa-f0-9]{1,4}){1,7}$|^(?:[A-Fa-f0-9]{1,4}:){1,4}:(?:[A-Fa-f0-9]{1,4}:){1,2}[A-Fa-f0-9]{1,4}$'\\n description: 'IPv6 address with support for shorthand compression (RFC 4291).'\\n examples:\\n - '2001:0db8:85a3:0000:0000:8a2e:0370:7334'\\n - '2001:db8::1428:57ab'\\n - id: hex-lower\\n name: Lowercase Hex String\\n kind: regex\\n pattern: '^[0-9a-f]+$'\\n description: 'Lowercase hexadecimal characters (length validated by consumer).'\\n examples:\\n - 'deadbeef'\\n - '0123456789abcdef'\\n - id: base64\\n name: Base64 Encoded String\\n kind: regex\\n pattern: '^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$'\\n description: 'Standard Base64 encoding with padding.'\\n examples:\\n - 'SGVsbG8gd29ybGQ='\\n - id: jwt\\n name: JSON Web Token (compact)\\n kind: regex\\n pattern: '^[A-Za-z0-9-_]+\\\\.[A-Za-z0-9-_]+\\\\.[A-Za-z0-9-_]+$'\\n description: 'JWT compact serialization (header.payload.signature).'\\n examples:\\n - 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U'\\n - id: strict-iso-date\\n name: ISO Date (YYYY-MM-DD)\\n kind: regex\\n pattern: '^\\\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\\\d|3[01])$'\\n description: 'ISO 8601 calendar date with validated month/day ranges.'\\n examples:\\n - '2025-10-09'\\n - id: iso-timestamp-z\\n name: ISO Timestamp (UTC)\\n kind: regex\\n pattern: '^\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}(?:\\\\.\\\\d{1,6})?Z$'\\n description: 'UTC timestamp with optional fractional seconds.'\\n examples:\\n - '2025-10-09T14:15:16Z'\\n - '2025-10-09T14:15:16.123456Z'\\n - id: uuid-v4\\n name: UUID v4\\n kind: regex\\n pattern: '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$'\\n description: 'RFC 4122 version 4 UUID.'\\n examples:\\n - '123e4567-e89b-42d3-a456-426614174000'\\n - id: ulid\\n name: ULID\\n kind: regex\\n pattern: '^[0-9A-HJKMNP-TV-Z]{26}$'\\n description: 'Crockford-base32 ULID (26 chars, upper-case).'\\n examples:\\n - '01HCP5MZF1H84D0CW7V5T9FQ0P'\\n - id: semantic-version\\n name: Semantic Version\\n kind: regex\\n pattern: '^(0|[1-9]\\\\d*)\\\\.(0|[1-9]\\\\d*)\\\\.(0|[1-9]\\\\d*)(?:-[0-9A-Za-z-]+(?:\\\\.[0-9A-Za-z-]+)*)?(?:\\\\+[0-9A-Za-z-]+(?:\\\\.[0-9A-Za-z-]+)*)?$'\\n description: 'SemVer 2.0.0 specification-compliant version string.'\\n examples:\\n - '1.2.3'\\n - '1.2.3-beta.1+build.5'\\n - id: glob-any-json\\n name: Glob – JSON Files\\n kind: glob\\n pattern: '**/*.json'\\n description: 'Recursive glob matching all JSON files.'\\n - id: glob-any-yaml\\n name: Glob – YAML Files\\n kind: glob\\n pattern: '**/*.{yml,yaml}'\\n description: 'Recursive glob matching YAML files.'\\n\",\n \"config/crucible-ts/library/foundry/signals.yaml\": \"$schema: https://schemas.fulmenhq.dev/library/foundry/v1.0.0/signals.schema.json\\ndescription: Standard signal handling semantics for Fulmen ecosystem\\nversion: v1.0.0\\nsignals:\\n - id: term\\n name: SIGTERM\\n unix_number: 15\\n windows_event: CTRL_CLOSE_EVENT\\n description: Graceful termination signal\\n default_behavior: graceful_shutdown\\n exit_code: 143 # 128 + 15\\n timeout_seconds: 30\\n cleanup_actions:\\n - close_connections\\n - flush_buffers\\n - remove_pid_file\\n - log_shutdown\\n usage_notes: Standard termination signal sent by container orchestrators (Kubernetes, Docker). Applications should perform cleanup within timeout period before exiting.\\n - id: int\\n name: SIGINT\\n unix_number: 2\\n windows_event: CTRL_C_EVENT\\n description: User interrupt (Ctrl+C)\\n default_behavior: graceful_shutdown_with_double_tap\\n exit_code: 130 # 128 + 2\\n timeout_seconds: 5\\n double_tap_window_seconds: 2\\n double_tap_message: \\\"Press Ctrl+C again within 2s to force quit\\\"\\n double_tap_behavior: immediate_exit\\n double_tap_exit_code: 130\\n cleanup_actions:\\n - close_connections\\n - flush_buffers\\n - remove_pid_file\\n - log_interrupt\\n usage_notes: Interactive interrupt signal (Ctrl+C). First press initiates graceful shutdown, second press within 2s forces immediate exit for hung processes.\\n - id: hup\\n name: SIGHUP\\n unix_number: 1\\n windows_event: null\\n description: Hangup signal (config reload via restart)\\n default_behavior: reload_via_restart\\n exit_code: 129 # 128 + 1\\n reload_strategy: restart_based\\n validation_required: true\\n timeout_seconds: 30\\n cleanup_actions:\\n - validate_new_config_against_schema\\n - graceful_shutdown\\n - restart_with_new_config\\n - log_reload\\n usage_notes: Historically \\\"hangup\\\" (terminal disconnect). In Fulmen, triggers config reload via restart. MANDATORY schema validation before restart. On Windows, use HTTP /admin/signal endpoint as fallback.\\n windows_fallback:\\n fallback_behavior: http_admin_endpoint\\n log_level: INFO\\n log_message: \\\"SIGHUP unavailable on Windows - use HTTP endpoint for config reload\\\"\\n log_template: \\\"signal=${signal} platform=${platform} fallback=${fallback_behavior} message='${operation_hint}'\\\"\\n operation_hint: \\\"POST /admin/signal with signal=HUP\\\"\\n telemetry_event: fulmen.signal.unsupported\\n telemetry_tags:\\n signal: SIGHUP\\n platform: windows\\n fallback_behavior: http_admin_endpoint\\n - id: quit\\n name: SIGQUIT\\n unix_number: 3\\n windows_event: CTRL_BREAK_EVENT\\n description: Quit with core dump (immediate termination)\\n default_behavior: immediate_exit\\n exit_code: 131 # 128 + 3\\n timeout_seconds: 0\\n usage_notes: Immediate termination signal (Ctrl+\\\\\\\\ on Unix, Ctrl+Break on Windows). Does not perform cleanup. Use for emergency shutdown or debugging (core dumps).\\n - id: pipe\\n name: SIGPIPE\\n unix_number: 13\\n windows_event: null\\n description: Broken pipe (write to closed socket/pipe)\\n default_behavior: observe_only\\n exit_code: 141 # 128 + 13\\n usage_notes: Default POSIX behavior terminates process immediately. Fulmen default is observe_only (log at INFO level + exit gracefully with code 141). Applications may override to ignore SIGPIPE for network services that expect broken pipes. Long-running servers typically ignore; CLI tools typically exit.\\n windows_fallback:\\n fallback_behavior: exception_handling\\n log_level: INFO\\n log_message: \\\"SIGPIPE unavailable on Windows - broken pipes raise exceptions instead\\\"\\n log_template: \\\"signal=${signal} platform=${platform} fallback=${fallback_behavior} message='${operation_hint}'\\\"\\n operation_hint: \\\"Handle BrokenPipeError (Python), EPIPE (Go), EPIPE (C)\\\"\\n telemetry_event: fulmen.signal.unsupported\\n telemetry_tags:\\n signal: SIGPIPE\\n platform: windows\\n fallback_behavior: exception_handling\\n - id: alrm\\n name: SIGALRM\\n unix_number: 14\\n windows_event: null\\n description: Alarm timer expired (watchdog timeout)\\n default_behavior: immediate_exit\\n exit_code: 142 # 128 + 14\\n timeout_seconds: 0\\n usage_notes: Used by watchdog timers. Treat as timeout-induced exit unless application overrides. Watchdog pattern - call signal.alarm(N) to set timer, reset periodically with progress; if no reset within N seconds, SIGALRM fires and process exits. Out of scope for v1.0.0 module implementations.\\n windows_fallback:\\n fallback_behavior: timer_api\\n log_level: INFO\\n log_message: \\\"SIGALRM unavailable on Windows - use native timer APIs instead\\\"\\n log_template: \\\"signal=${signal} platform=${platform} fallback=${fallback_behavior} message='${operation_hint}'\\\"\\n operation_hint: \\\"Use threading.Timer (Python), time.AfterFunc (Go), setTimeout (TypeScript)\\\"\\n telemetry_event: fulmen.signal.unsupported\\n telemetry_tags:\\n signal: SIGALRM\\n platform: windows\\n fallback_behavior: timer_api\\n - id: usr1\\n name: SIGUSR1\\n unix_number: 10\\n platform_overrides:\\n darwin: 30\\n freebsd: 30\\n windows_event: null\\n description: User-defined signal 1\\n default_behavior: custom\\n exit_code: 138 # 128 + 10\\n usage_notes: Application-specific signal (e.g., reopen log files, dump statistics, toggle verbose logging). Helper libraries provide registration API; application provides custom handler.\\n windows_fallback:\\n fallback_behavior: http_admin_endpoint\\n log_level: INFO\\n log_message: \\\"SIGUSR1 unavailable on Windows - use HTTP endpoint for custom operations\\\"\\n log_template: \\\"signal=${signal} platform=${platform} fallback=${fallback_behavior} message='${operation_hint}'\\\"\\n operation_hint: \\\"POST /admin/signal with signal=USR1\\\"\\n telemetry_event: fulmen.signal.unsupported\\n telemetry_tags:\\n signal: SIGUSR1\\n platform: windows\\n fallback_behavior: http_admin_endpoint\\n - id: usr2\\n name: SIGUSR2\\n unix_number: 12\\n platform_overrides:\\n darwin: 31\\n freebsd: 31\\n windows_event: null\\n description: User-defined signal 2\\n default_behavior: custom\\n exit_code: 140 # 128 + 12\\n usage_notes: Application-specific signal (e.g., toggle debug mode, trigger profiling, rotate credentials). Helper libraries provide registration API; application provides custom handler.\\n windows_fallback:\\n fallback_behavior: http_admin_endpoint\\n log_level: INFO\\n log_message: \\\"SIGUSR2 unavailable on Windows - use HTTP endpoint for custom operations\\\"\\n log_template: \\\"signal=${signal} platform=${platform} fallback=${fallback_behavior} message='${operation_hint}'\\\"\\n operation_hint: \\\"POST /admin/signal with signal=USR2\\\"\\n telemetry_event: fulmen.signal.unsupported\\n telemetry_tags:\\n signal: SIGUSR2\\n platform: windows\\n fallback_behavior: http_admin_endpoint\\n - id: kill\\n name: SIGKILL\\n unix_number: 9\\n windows_event: null\\n description: Force immediate termination - cannot be caught, blocked, or ignored\\n default_behavior: immediate_exit\\n exit_code: 137 # 128 + 9\\n timeout_seconds: 0\\n cleanup_actions: []\\n usage_notes: |\\n SIGKILL terminates a process immediately without allowing cleanup.\\n Use only as a last resort after SIGTERM grace period expires. The process\\n has no opportunity to save state, close files, or release resources.\\n On Windows, use TerminateProcess() for single process or TerminateJobObject() for groups.\\nbehaviors:\\n - id: graceful_shutdown\\n name: Graceful Shutdown\\n description: Clean shutdown with timeout and cleanup chain\\n phases:\\n - name: notify\\n description: Log signal receipt with correlation ID\\n - name: stop_accepting\\n description: Stop accepting new work (close listeners, reject requests)\\n - name: drain\\n description: Complete in-flight operations within timeout\\n - name: cleanup\\n description: Run registered cleanup handlers in order\\n - name: exit\\n description: Exit with appropriate code (128+N pattern)\\n - id: graceful_shutdown_with_double_tap\\n name: Graceful Shutdown with Double-Tap\\n description: Graceful shutdown with force-quit option (Ctrl+C pattern)\\n phases:\\n - name: first_signal\\n description: First signal starts graceful shutdown and prints hint message\\n - name: notify\\n description: Log signal receipt with correlation ID\\n - name: stop_accepting\\n description: Stop accepting new work\\n - name: drain\\n description: Complete in-flight operations within timeout\\n - name: cleanup\\n description: Run registered cleanup handlers in order\\n - name: second_signal_check\\n description: If second signal within window, force immediate exit\\n - name: exit\\n description: Exit with appropriate code\\n - id: reload_via_restart\\n name: Configuration Reload via Restart\\n description: Reload configuration by validating and restarting process\\n phases:\\n - name: notify\\n description: Log reload request with correlation ID\\n - name: validate\\n description: Validate new configuration against Crucible schema (MANDATORY)\\n - name: reject_invalid\\n description: If invalid, log error and continue with current config (no restart)\\n - name: graceful_shutdown\\n description: If valid, initiate graceful shutdown\\n - name: exit\\n description: Exit with code 129 (SIGHUP) - process supervisor restarts\\n - name: restart\\n description: Process supervisor (systemd, K8s, etc.) restarts process with new config\\n - id: immediate_exit\\n name: Immediate Exit\\n description: Exit immediately without cleanup (emergency shutdown)\\n phases:\\n - name: notify\\n description: Log signal receipt (no correlation ID needed - too fast)\\n - name: exit\\n description: Exit immediately with appropriate code\\n - id: custom\\n name: Custom Handler\\n description: Application-specific behavior defined by handler registration\\n phases:\\n - name: delegate\\n description: Call application-provided handler function\\n - name: log_completion\\n description: Log custom handler completion (do not exit unless handler exits)\\n - id: observe_only\\n name: Observe Only\\n description: Log the signal and increment telemetry without exiting\\n phases:\\n - name: notify\\n description: Log signal receipt at INFO level\\n - name: telemetry\\n description: Increment signal counter in telemetry system\\n - name: continue\\n description: Continue execution (do not exit)\\nos_mappings:\\n unix:\\n SIGTERM: 15\\n SIGINT: 2\\n SIGHUP: 1\\n SIGQUIT: 3\\n SIGPIPE: 13\\n SIGALRM: 14\\n SIGUSR1: 10 # Linux standard\\n SIGUSR2: 12 # Linux standard\\n SIGKILL: 9 # Not catchable, documented for completeness\\n windows:\\n CTRL_C_EVENT: 0\\n CTRL_BREAK_EVENT: 1\\n CTRL_CLOSE_EVENT: 2\\n CTRL_LOGOFF_EVENT: 5\\n CTRL_SHUTDOWN_EVENT: 6\\n # Platform-specific signal number overrides\\n platform_overrides:\\n darwin: # macOS\\n SIGUSR1: 30\\n SIGUSR2: 31\\n freebsd:\\n SIGUSR1: 30\\n SIGUSR2: 31\\n # Mapping Unix signals to Windows console events\\n signal_to_event:\\n SIGTERM: CTRL_CLOSE_EVENT\\n SIGINT: CTRL_C_EVENT\\n SIGQUIT: CTRL_BREAK_EVENT\\n SIGHUP: null # No Windows equivalent - use HTTP fallback\\n SIGPIPE: null # No Windows equivalent - handled via exceptions\\n SIGALRM: null # No Windows equivalent - use timers\\n SIGUSR1: null # No Windows equivalent - use HTTP fallback\\n SIGUSR2: null # No Windows equivalent - use HTTP fallback\\n# Platform support matrix for helper library implementations\\nplatform_support:\\n - signal: SIGTERM\\n linux: native\\n macos: native\\n freebsd: native\\n windows: mapped # CTRL_CLOSE_EVENT\\n notes: Fully supported across all platforms\\n - signal: SIGINT\\n linux: native\\n macos: native\\n freebsd: native\\n windows: mapped # CTRL_C_EVENT\\n notes: Fully supported across all platforms\\n - signal: SIGHUP\\n linux: native\\n macos: native\\n freebsd: native\\n windows: unsupported\\n fallback: http_admin_endpoint\\n notes: On Windows, use HTTP POST /admin/signal with signal=HUP\\n - signal: SIGQUIT\\n linux: native\\n macos: native\\n freebsd: native\\n windows: mapped # CTRL_BREAK_EVENT\\n notes: Fully supported across all platforms\\n - signal: SIGPIPE\\n linux: native\\n macos: native\\n freebsd: native\\n windows: unsupported\\n fallback: exception_handling\\n notes: On Windows, broken pipes generate exceptions instead of signals\\n - signal: SIGALRM\\n linux: native\\n macos: native\\n freebsd: native\\n windows: unsupported\\n fallback: timer_api\\n notes: On Windows, use threading.Timer (Python) or setTimeout (TypeScript)\\n - signal: SIGUSR1\\n linux: native\\n macos: native # signal 30\\n freebsd: native # signal 30\\n windows: unsupported\\n fallback: http_admin_endpoint\\n notes: Signal number varies by platform. On Windows, use HTTP POST /admin/signal with signal=USR1\\n - signal: SIGUSR2\\n linux: native\\n macos: native # signal 31\\n freebsd: native # signal 31\\n windows: unsupported\\n fallback: http_admin_endpoint\\n notes: Signal number varies by platform. On Windows, use HTTP POST /admin/signal with signal=USR2\\n - signal: SIGKILL\\n linux: native\\n macos: native\\n freebsd: native\\n windows: mapped\\n notes: Cannot be caught or ignored. Windows uses TerminateProcess/TerminateJobObject.\\n# Exit code mappings (128+N pattern per POSIX)\\nexit_codes:\\n SIGTERM: 143 # 128 + 15\\n SIGINT: 130 # 128 + 2\\n SIGHUP: 129 # 128 + 1\\n SIGQUIT: 131 # 128 + 3\\n SIGKILL: 137 # 128 + 9\\n SIGPIPE: 141 # 128 + 13\\n SIGALRM: 142 # 128 + 14\\n SIGUSR1: 138 # 128 + 10\\n SIGUSR2: 140 # 128 + 12\\n note: Exit codes follow POSIX 128+N pattern where N is the signal number. These codes are cross-referenced in config/library/foundry/exit-codes.yaml.\\n\",\n },\n};\n\nexport default manifest;\n","/**\n * Static per-subpath embedded-asset registration for the foundry subpath (v0.4.0).\n *\n * Registers only the `foundry` domain (catalogs) by importing its per-domain\n * generated module directly (not `generated/index`). Note: the foundry subpath\n * still transitively reaches the schema corpus via `validateDataBySchemaId`; under\n * tsup `splitting:true` that corpus lives once in a shared chunk (deduped), so the\n * invariant is \"public entries stay lean; corpus lives once in shared chunks\" — not\n * \"foundry never references the schema corpus\". Unused in filesystem mode; required\n * for foundry catalog loading inside a `bun --compile` binary.\n */\n\nimport { manifest as foundryManifest } from \"../assets/generated/foundry.generated.js\";\nimport { registerEmbeddedAssets } from \"../assets/index.js\";\n\nlet registered = false;\n\n/** Register the foundry catalog domain (idempotent). */\nexport function ensureFoundryAssetsRegistered(): void {\n if (registered) {\n return;\n }\n registerEmbeddedAssets(foundryManifest);\n registered = true;\n}\n","/**\n * Signal Catalog Loader\n *\n * Loads and validates the signal handling catalog from Crucible SSOT assets\n * following the same pattern as other Foundry catalogs.\n */\n\nimport { parse as parseYaml } from \"yaml\";\nimport { getAssetResolver } from \"../../assets/index.js\";\nimport { validateDataBySchemaId } from \"../../schema/validator.js\";\nimport { ensureFoundryAssetsRegistered } from \"../embedded-assets.js\";\nimport { FoundryCatalogError } from \"../errors.js\";\nimport type { BehaviorInfo, SignalCatalog, SignalInfo } from \"./types.js\";\n\n// SSOT asset logical path (resolved via the AssetResolver — filesystem or embedded).\nconst SIGNALS_LOGICAL_PATH = \"config/crucible-ts/library/foundry/signals.yaml\";\n\n// Schema ID for signals catalog (from Crucible SSOT)\nconst SCHEMA_ID = \"library/foundry/v1.0.0/signals\";\n\n/**\n * Load and validate the Signal Catalog from SSOT (filesystem or embedded).\n */\nasync function loadCatalog(): Promise<SignalCatalog> {\n const catalogName = \"signals\";\n\n try {\n ensureFoundryAssetsRegistered();\n const resolver = getAssetResolver();\n\n let content: string;\n try {\n content = await resolver.read(SIGNALS_LOGICAL_PATH);\n } catch {\n throw FoundryCatalogError.missingCatalog(catalogName);\n }\n\n // Parse YAML content\n const data = parseYaml(content) as SignalCatalog;\n\n // Validate against JSON Schema from Crucible SSOT\n const result = await validateDataBySchemaId(data, SCHEMA_ID);\n if (!result.valid) {\n const errorMessages = result.diagnostics.map((d) => `${d.pointer}: ${d.message}`).join(\"; \");\n throw FoundryCatalogError.invalidSchema(\n catalogName,\n `Schema validation failed: ${errorMessages}`,\n );\n }\n\n return data;\n } catch (error) {\n if (error instanceof FoundryCatalogError) {\n throw error;\n }\n // Preserve the underlying cause (e.g. a registry/schema failure) for diagnostics.\n throw FoundryCatalogError.invalidSchema(\n catalogName,\n `Failed to load catalog: ${(error as Error).message}`,\n error as Error,\n );\n }\n}\n\n// Cached catalog instance\nlet cachedCatalog: SignalCatalog | null = null;\n\n/**\n * Get the signal catalog, loading it if necessary\n */\nasync function getCatalog(): Promise<SignalCatalog> {\n if (!cachedCatalog) {\n cachedCatalog = await loadCatalog();\n }\n return cachedCatalog;\n}\n\n/**\n * Get the signals catalog version\n */\nexport async function getSignalsVersion(): Promise<string> {\n const catalog = await getCatalog();\n return catalog.version;\n}\n\n/**\n * Get all signals\n */\nexport async function listSignals(): Promise<SignalInfo[]> {\n const catalog = await getCatalog();\n return catalog.signals.map((signal) => ({ ...signal }));\n}\n\n/**\n * Get a specific signal by ID or name\n */\nexport async function getSignal(identifier: string): Promise<SignalInfo | null> {\n const catalog = await getCatalog();\n const signal = catalog.signals.find((s) => s.id === identifier || s.name === identifier);\n return signal ? { ...signal } : null;\n}\n\n/**\n * Get all behaviors\n */\nexport async function listBehaviors(): Promise<BehaviorInfo[]> {\n const catalog = await getCatalog();\n return catalog.behaviors.map((behavior) => ({ ...behavior }));\n}\n\n/**\n * Get a specific behavior by ID\n */\nexport async function getBehavior(id: string): Promise<BehaviorInfo | null> {\n const catalog = await getCatalog();\n const behavior = catalog.behaviors.find((b) => b.id === id);\n return behavior ? { ...behavior } : null;\n}\n\n/**\n * Get the complete catalog (for advanced use cases)\n */\nexport async function getSignalCatalog(): Promise<SignalCatalog> {\n return await getCatalog();\n}\n","/**\n * Signal Capability Detection\n *\n * Platform-aware signal support detection driven by catalog metadata.\n * Ensures cross-language parity by querying windows_event/fallback fields\n * rather than hardcoding signal names.\n */\n\nimport { getSignal, getSignalCatalog } from \"./catalog.js\";\n\n/**\n * Platform types\n */\nexport type Platform = \"linux\" | \"darwin\" | \"win32\" | \"freebsd\" | \"unknown\";\n\n/**\n * Platform capabilities summary\n */\nexport interface PlatformCapabilities {\n platform: Platform;\n isPOSIX: boolean;\n isWindows: boolean;\n supportsNativeSignals: boolean;\n supportsSignalExitCodes: boolean;\n supportedSignals: string[];\n unsupportedSignals: string[];\n mappedSignals: string[]; // Windows console events\n}\n\n/**\n * Detect current platform\n */\nexport function getPlatform(): Platform {\n const platform = process.platform;\n\n switch (platform) {\n case \"linux\":\n return \"linux\";\n case \"darwin\":\n return \"darwin\";\n case \"win32\":\n return \"win32\";\n case \"freebsd\":\n return \"freebsd\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Check if current platform is POSIX-compliant\n */\nexport function isPOSIX(): boolean {\n const platform = getPlatform();\n return platform === \"linux\" || platform === \"darwin\" || platform === \"freebsd\";\n}\n\n/**\n * Check if current platform is Windows\n */\nexport function isWindows(): boolean {\n return getPlatform() === \"win32\";\n}\n\n/**\n * Check if a signal is supported on the current platform\n *\n * Uses catalog metadata (windows_event field) to determine support.\n * Returns true if:\n * - Platform is POSIX (all signals natively supported)\n * - Platform is Windows AND signal has non-null windows_event\n *\n * @param signalName - Signal name (e.g., \"SIGTERM\") or id (e.g., \"term\")\n */\nexport async function supportsSignal(signalName: string): Promise<boolean> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return false;\n }\n\n // POSIX platforms support all signals natively\n if (isPOSIX()) {\n return true;\n }\n\n // Windows: check if signal has a console event mapping\n if (isWindows()) {\n // Signal is supported if windows_event is non-null\n return signal.windows_event !== null;\n }\n\n // Unknown platform: conservative approach (assume unsupported)\n return false;\n}\n\n/**\n * Check if platform supports signal-based exit codes (128+N pattern)\n *\n * Windows doesn't propagate signal numbers via exit codes in the same way\n * as POSIX systems. This function helps applications decide whether to\n * rely on signal exit codes for process monitoring.\n */\nexport function supportsSignalExitCodes(): boolean {\n // Only POSIX systems reliably support 128+N exit code pattern\n return isPOSIX();\n}\n\n/**\n * Get comprehensive platform capabilities\n *\n * Queries catalog to build a complete picture of signal support.\n * Useful for capability reporting, documentation generation, and testing.\n */\nexport async function getPlatformCapabilities(): Promise<PlatformCapabilities> {\n const platform = getPlatform();\n const isPosix = isPOSIX();\n const isWin = isWindows();\n const catalog = await getSignalCatalog();\n\n const supported: string[] = [];\n const unsupported: string[] = [];\n const mapped: string[] = [];\n\n // Categorize signals based on platform\n for (const signal of catalog.signals) {\n if (isPosix) {\n // All signals supported on POSIX\n supported.push(signal.name);\n } else if (isWin) {\n if (signal.windows_event !== null) {\n // Signal has Windows console event mapping\n supported.push(signal.name);\n mapped.push(signal.name);\n } else {\n // No Windows support - requires fallback\n unsupported.push(signal.name);\n }\n } else {\n // Unknown platform - mark as unsupported\n unsupported.push(signal.name);\n }\n }\n\n return {\n platform,\n isPOSIX: isPosix,\n isWindows: isWin,\n supportsNativeSignals: isPosix,\n supportsSignalExitCodes: supportsSignalExitCodes(),\n supportedSignals: supported,\n unsupportedSignals: unsupported,\n mappedSignals: mapped,\n };\n}\n\n/**\n * Get the signal number for the current platform\n *\n * Handles platform-specific overrides (e.g., SIGUSR1/SIGUSR2 on macOS/FreeBSD).\n * Returns the appropriate signal number based on platform_overrides.\n *\n * @param signalName - Signal name (e.g., \"SIGTERM\") or id (e.g., \"term\")\n * @returns Signal number for current platform, or null if signal not found\n */\nexport async function getSignalNumber(signalName: string): Promise<number | null> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return null;\n }\n\n const platform = getPlatform();\n\n // Check for platform-specific override\n if (signal.platform_overrides) {\n if (platform === \"darwin\" && signal.platform_overrides.darwin !== undefined) {\n return signal.platform_overrides.darwin;\n }\n if (platform === \"freebsd\" && signal.platform_overrides.freebsd !== undefined) {\n return signal.platform_overrides.freebsd;\n }\n }\n\n // Return standard Unix number\n return signal.unix_number;\n}\n\n/**\n * Get the Windows console event name for a signal\n *\n * Returns the Windows console event that corresponds to a Unix signal,\n * or null if the signal is not supported on Windows.\n *\n * @param signalName - Signal name (e.g., \"SIGTERM\") or id (e.g., \"term\")\n */\nexport async function getWindowsEvent(signalName: string): Promise<string | null> {\n const signal = await getSignal(signalName);\n if (!signal) {\n return null;\n }\n\n return signal.windows_event;\n}\n"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// src/foundry/errors.ts
|
|
2
|
+
var FoundryCatalogError = class _FoundryCatalogError extends Error {
|
|
3
|
+
constructor(message, catalog, cause) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.catalog = catalog;
|
|
6
|
+
this.cause = cause;
|
|
7
|
+
this.name = "FoundryCatalogError";
|
|
8
|
+
if (Error.captureStackTrace) {
|
|
9
|
+
Error.captureStackTrace(this, _FoundryCatalogError);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
static invalidSchema(catalog, details, cause) {
|
|
13
|
+
return new _FoundryCatalogError(
|
|
14
|
+
`Invalid schema in ${catalog} catalog: ${details}`,
|
|
15
|
+
catalog,
|
|
16
|
+
cause
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
static missingCatalog(catalog) {
|
|
20
|
+
return new _FoundryCatalogError(`Catalog ${catalog} not found or could not be loaded`, catalog);
|
|
21
|
+
}
|
|
22
|
+
static invalidPattern(patternId, details) {
|
|
23
|
+
return new _FoundryCatalogError(`Invalid pattern ${patternId}: ${details}`, "patterns");
|
|
24
|
+
}
|
|
25
|
+
static compilationError(patternId, details, cause) {
|
|
26
|
+
return new _FoundryCatalogError(
|
|
27
|
+
`Failed to compile pattern ${patternId}: ${details}`,
|
|
28
|
+
"patterns",
|
|
29
|
+
cause
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export { FoundryCatalogError };
|
|
35
|
+
//# sourceMappingURL=chunk-3HISR2XI.js.map
|
|
36
|
+
//# sourceMappingURL=chunk-3HISR2XI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/foundry/errors.ts"],"names":[],"mappings":";AAMO,IAAM,mBAAA,GAAN,MAAM,oBAAA,SAA4B,KAAA,CAAM;AAAA,EAC7C,WAAA,CACE,OAAA,EACgB,OAAA,EACA,KAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHG,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAGZ,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,KAAA,CAAM,iBAAA,CAAkB,MAAM,oBAAmB,CAAA;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,OAAO,aAAA,CAAc,OAAA,EAAiB,OAAA,EAAiB,KAAA,EAAoC;AACzF,IAAA,OAAO,IAAI,oBAAA;AAAA,MACT,CAAA,kBAAA,EAAqB,OAAO,CAAA,UAAA,EAAa,OAAO,CAAA,CAAA;AAAA,MAChD,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,OAAO,eAAe,OAAA,EAAsC;AAC1D,IAAA,OAAO,IAAI,oBAAA,CAAoB,CAAA,QAAA,EAAW,OAAO,qCAAqC,OAAO,CAAA;AAAA,EAC/F;AAAA,EAEA,OAAO,cAAA,CAAe,SAAA,EAAmB,OAAA,EAAsC;AAC7E,IAAA,OAAO,IAAI,oBAAA,CAAoB,CAAA,gBAAA,EAAmB,SAAS,CAAA,EAAA,EAAK,OAAO,IAAI,UAAU,CAAA;AAAA,EACvF;AAAA,EAEA,OAAO,gBAAA,CAAiB,SAAA,EAAmB,OAAA,EAAiB,KAAA,EAAoC;AAC9F,IAAA,OAAO,IAAI,oBAAA;AAAA,MACT,CAAA,0BAAA,EAA6B,SAAS,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AAAA,MAClD,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF","file":"chunk-3HISR2XI.js","sourcesContent":["/**\n * Foundry module - Error handling\n *\n * Custom error classes for Foundry catalog operations with fail-fast validation.\n */\n\nexport class FoundryCatalogError extends Error {\n constructor(\n message: string,\n public readonly catalog?: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = \"FoundryCatalogError\";\n\n // Maintain proper stack trace for V8\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, FoundryCatalogError);\n }\n }\n\n static invalidSchema(catalog: string, details: string, cause?: Error): FoundryCatalogError {\n return new FoundryCatalogError(\n `Invalid schema in ${catalog} catalog: ${details}`,\n catalog,\n cause,\n );\n }\n\n static missingCatalog(catalog: string): FoundryCatalogError {\n return new FoundryCatalogError(`Catalog ${catalog} not found or could not be loaded`, catalog);\n }\n\n static invalidPattern(patternId: string, details: string): FoundryCatalogError {\n return new FoundryCatalogError(`Invalid pattern ${patternId}: ${details}`, \"patterns\");\n }\n\n static compilationError(patternId: string, details: string, cause?: Error): FoundryCatalogError {\n return new FoundryCatalogError(\n `Failed to compile pattern ${patternId}: ${details}`,\n \"patterns\",\n cause,\n );\n }\n}\n"]}
|