@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.
Files changed (123) hide show
  1. package/CHANGELOG.md +76 -1
  2. package/README.md +30 -1
  3. package/config/crucible-ts/taxonomy/metrics.yaml +1 -1
  4. package/dist/appidentity/index.js +9 -2209
  5. package/dist/appidentity/index.js.map +1 -1
  6. package/dist/assets/index.d.ts +184 -0
  7. package/dist/assets/index.js +4 -0
  8. package/dist/assets/index.js.map +1 -0
  9. package/dist/bin/prometheus-cli.js +15 -9139
  10. package/dist/bin/prometheus-cli.js.map +1 -1
  11. package/dist/bin/schema-cli.js +4 -6098
  12. package/dist/bin/schema-cli.js.map +1 -1
  13. package/dist/bin/signals-cli.js +15 -1910
  14. package/dist/bin/signals-cli.js.map +1 -1
  15. package/dist/chunk-24BAF63H.js +194 -0
  16. package/dist/chunk-24BAF63H.js.map +1 -0
  17. package/dist/chunk-3HISR2XI.js +36 -0
  18. package/dist/chunk-3HISR2XI.js.map +1 -0
  19. package/dist/chunk-56F2EEAG.js +328 -0
  20. package/dist/chunk-56F2EEAG.js.map +1 -0
  21. package/dist/chunk-5HZEJGZ5.js +725 -0
  22. package/dist/chunk-5HZEJGZ5.js.map +1 -0
  23. package/dist/chunk-7YWACZEJ.js +837 -0
  24. package/dist/chunk-7YWACZEJ.js.map +1 -0
  25. package/dist/chunk-BCO3FUUO.js +682 -0
  26. package/dist/chunk-BCO3FUUO.js.map +1 -0
  27. package/dist/chunk-GOTEQYAD.js +410 -0
  28. package/dist/chunk-GOTEQYAD.js.map +1 -0
  29. package/dist/chunk-HY6JQOFN.js +32 -0
  30. package/dist/chunk-HY6JQOFN.js.map +1 -0
  31. package/dist/chunk-LMNAUTW7.js +43 -0
  32. package/dist/chunk-LMNAUTW7.js.map +1 -0
  33. package/dist/chunk-LWAH2UG7.js +103 -0
  34. package/dist/chunk-LWAH2UG7.js.map +1 -0
  35. package/dist/chunk-OHE2AOH4.js +273 -0
  36. package/dist/chunk-OHE2AOH4.js.map +1 -0
  37. package/dist/chunk-P3DNOZOG.js +1488 -0
  38. package/dist/chunk-P3DNOZOG.js.map +1 -0
  39. package/dist/chunk-PQ6TKPUN.js +27 -0
  40. package/dist/chunk-PQ6TKPUN.js.map +1 -0
  41. package/dist/chunk-QCCN6POA.js +211 -0
  42. package/dist/chunk-QCCN6POA.js.map +1 -0
  43. package/dist/chunk-QGTNV4U2.js +985 -0
  44. package/dist/chunk-QGTNV4U2.js.map +1 -0
  45. package/dist/chunk-RSLFR4TO.js +631 -0
  46. package/dist/chunk-RSLFR4TO.js.map +1 -0
  47. package/dist/chunk-SNV5WG5V.js +9412 -0
  48. package/dist/chunk-SNV5WG5V.js.map +1 -0
  49. package/dist/chunk-UP2VWCW5.js +33 -0
  50. package/dist/chunk-UP2VWCW5.js.map +1 -0
  51. package/dist/chunk-VJIGX7MH.js +208 -0
  52. package/dist/chunk-VJIGX7MH.js.map +1 -0
  53. package/dist/chunk-WCCMRVZF.js +130 -0
  54. package/dist/chunk-WCCMRVZF.js.map +1 -0
  55. package/dist/chunk-WSMVLWLB.js +269 -0
  56. package/dist/chunk-WSMVLWLB.js.map +1 -0
  57. package/dist/config/index.js +6 -1220
  58. package/dist/config/index.js.map +1 -1
  59. package/dist/crucible/fulpack/index.js +2 -25
  60. package/dist/crucible/fulpack/index.js.map +1 -1
  61. package/dist/crucible/index.js +13 -1129
  62. package/dist/crucible/index.js.map +1 -1
  63. package/dist/docscribe/index.js +2 -680
  64. package/dist/docscribe/index.js.map +1 -1
  65. package/dist/errors/index.js +5 -1831
  66. package/dist/errors/index.js.map +1 -1
  67. package/dist/errors-D7KXV3QW.js +4 -0
  68. package/dist/errors-D7KXV3QW.js.map +1 -0
  69. package/dist/errors-R7ZODJXS.js +8 -0
  70. package/dist/errors-R7ZODJXS.js.map +1 -0
  71. package/dist/export-EA3RNQNS.js +6 -0
  72. package/dist/export-EA3RNQNS.js.map +1 -0
  73. package/dist/foundry/index.js +340 -3949
  74. package/dist/foundry/index.js.map +1 -1
  75. package/dist/foundry/similarity/index.js +3 -134
  76. package/dist/foundry/similarity/index.js.map +1 -1
  77. package/dist/fulencode/index.js +3 -319
  78. package/dist/fulencode/index.js.map +1 -1
  79. package/dist/fulhash/index.js +3 -611
  80. package/dist/fulhash/index.js.map +1 -1
  81. package/dist/fulpack/index.js +3 -1515
  82. package/dist/fulpack/index.js.map +1 -1
  83. package/dist/hash-YOJYVOWH.js +4 -0
  84. package/dist/hash-YOJYVOWH.js.map +1 -0
  85. package/dist/index.d.ts +1 -1
  86. package/dist/index.js +14 -4395
  87. package/dist/index.js.map +1 -1
  88. package/dist/loader-VP2ZIC4O.js +9 -0
  89. package/dist/loader-VP2ZIC4O.js.map +1 -0
  90. package/dist/logging/index.js +2 -723
  91. package/dist/logging/index.js.map +1 -1
  92. package/dist/pathfinder/index.js +18 -2341
  93. package/dist/pathfinder/index.js.map +1 -1
  94. package/dist/prom-client-PNEBGD3G.js +4801 -0
  95. package/dist/prom-client-PNEBGD3G.js.map +1 -0
  96. package/dist/reports/license-inventory.csv +1 -1
  97. package/dist/schema/index.d.ts +19 -6
  98. package/dist/schema/index.js +4 -6148
  99. package/dist/schema/index.js.map +1 -1
  100. package/dist/signals/index.js +8 -2767
  101. package/dist/signals/index.js.map +1 -1
  102. package/dist/similarity/index.js +3 -134
  103. package/dist/similarity/index.js.map +1 -1
  104. package/dist/telemetry/http/index.js +9 -930
  105. package/dist/telemetry/http/index.js.map +1 -1
  106. package/dist/telemetry/index.js +4 -1561
  107. package/dist/telemetry/index.js.map +1 -1
  108. package/dist/telemetry/prometheus/index.js +7 -8422
  109. package/dist/telemetry/prometheus/index.js.map +1 -1
  110. package/dist/validator-I3ASDVDB.js +6 -0
  111. package/dist/validator-I3ASDVDB.js.map +1 -0
  112. package/package.json +5 -1
  113. package/schemas/crucible-ts/library/module-manifest/v1.0.0/module-manifest.schema.json +1 -1
  114. package/schemas/crucible-ts/observability/logging/v1.0.0/definitions.schema.json +1 -1
  115. package/schemas/crucible-ts/observability/logging/v1.0.0/log-event.schema.json +13 -13
  116. package/schemas/crucible-ts/observability/logging/v1.0.0/logger-config.schema.json +2 -2
  117. package/schemas/crucible-ts/observability/logging/v1.0.0/logging-policy.schema.json +1 -1
  118. package/schemas/crucible-ts/observability/logging/v1.0.0/middleware-config.schema.json +2 -2
  119. package/schemas/crucible-ts/observability/logging/v1.0.0/severity-filter.schema.json +3 -3
  120. package/schemas/crucible-ts/upstream/3leaps/crucible/PROVENANCE.md +3 -3
  121. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/catalog/classifiers/README.md +1 -1
  122. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/classifiers-framework.md +1 -1
  123. package/schemas/crucible-ts/upstream/3leaps/crucible/docs/standards/data-sensitivity-classification.md +1 -1
@@ -0,0 +1,33 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
6
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
7
+ }) : x)(function(x) {
8
+ if (typeof require !== "undefined") return require.apply(this, arguments);
9
+ throw Error('Dynamic require of "' + x + '" is not supported');
10
+ });
11
+ var __esm = (fn, res) => function __init() {
12
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
13
+ };
14
+ var __commonJS = (cb, mod) => function __require2() {
15
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
16
+ };
17
+ var __export = (target, all) => {
18
+ for (var name in all)
19
+ __defProp(target, name, { get: all[name], enumerable: true });
20
+ };
21
+ var __copyProps = (to, from, except, desc) => {
22
+ if (from && typeof from === "object" || typeof from === "function") {
23
+ for (let key of __getOwnPropNames(from))
24
+ if (!__hasOwnProp.call(to, key) && key !== except)
25
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
26
+ }
27
+ return to;
28
+ };
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+
31
+ export { __commonJS, __esm, __export, __require, __toCommonJS };
32
+ //# sourceMappingURL=chunk-UP2VWCW5.js.map
33
+ //# sourceMappingURL=chunk-UP2VWCW5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-UP2VWCW5.js"}
@@ -0,0 +1,208 @@
1
+ import { AppIdentityError } from './chunk-WCCMRVZF.js';
2
+ import { validateDataBySchemaId } from './chunk-SNV5WG5V.js';
3
+ import { readFile, access } from 'fs/promises';
4
+ import { parse } from 'yaml';
5
+ import { join, dirname } from 'path';
6
+
7
+ // src/appidentity/cache.ts
8
+ var cachedIdentity = null;
9
+ function getCachedIdentity() {
10
+ return cachedIdentity;
11
+ }
12
+ function setCachedIdentity(identity) {
13
+ cachedIdentity = identity;
14
+ }
15
+ function clearIdentityCache() {
16
+ cachedIdentity = null;
17
+ }
18
+
19
+ // src/appidentity/constants.ts
20
+ var APP_IDENTITY_FILENAME = "app.yaml";
21
+ var APP_IDENTITY_DIR = ".fulmen";
22
+ var APP_IDENTITY_ENV_VAR = "FULMEN_APP_IDENTITY_PATH";
23
+ var APP_IDENTITY_SCHEMA_ID = "config/repository/app-identity/v1.0.0/app-identity";
24
+ var MAX_ANCESTOR_SEARCH_DEPTH = 20;
25
+ async function discoverIdentityPath(options) {
26
+ if (options?.path) {
27
+ const exists = await fileExists(options.path);
28
+ if (!exists) {
29
+ throw AppIdentityError.notFound([options.path]);
30
+ }
31
+ return { path: options.path, source: "explicit" };
32
+ }
33
+ const envPath = process.env[APP_IDENTITY_ENV_VAR];
34
+ if (envPath) {
35
+ const exists = await fileExists(envPath);
36
+ if (!exists) {
37
+ throw AppIdentityError.envOverrideMissing(envPath);
38
+ }
39
+ return { path: envPath, source: "env" };
40
+ }
41
+ const startDir = options?.startDir || process.cwd();
42
+ const result = await searchAncestors(startDir);
43
+ if (result) {
44
+ return { path: result, source: "ancestor" };
45
+ }
46
+ return null;
47
+ }
48
+ async function searchAncestors(startDir) {
49
+ let currentDir = startDir;
50
+ const searchedPaths = [];
51
+ for (let i = 0; i < MAX_ANCESTOR_SEARCH_DEPTH; i++) {
52
+ const candidatePath = join(currentDir, APP_IDENTITY_DIR, APP_IDENTITY_FILENAME);
53
+ searchedPaths.push(candidatePath);
54
+ if (await fileExists(candidatePath)) {
55
+ return candidatePath;
56
+ }
57
+ const parentDir = dirname(currentDir);
58
+ if (parentDir === currentDir) {
59
+ throw AppIdentityError.notFound(searchedPaths);
60
+ }
61
+ currentDir = parentDir;
62
+ }
63
+ throw AppIdentityError.notFound(searchedPaths);
64
+ }
65
+ async function fileExists(path) {
66
+ try {
67
+ await access(path);
68
+ return true;
69
+ } catch {
70
+ return false;
71
+ }
72
+ }
73
+ var embeddedIdentity = null;
74
+ var isRegistered = false;
75
+ function deepFreeze(obj) {
76
+ Object.freeze(obj);
77
+ Object.getOwnPropertyNames(obj).forEach((prop) => {
78
+ const value = obj[prop];
79
+ if (value !== null && (typeof value === "object" || typeof value === "function") && !Object.isFrozen(value)) {
80
+ deepFreeze(value);
81
+ }
82
+ });
83
+ return obj;
84
+ }
85
+ async function registerEmbeddedIdentity(data, options) {
86
+ if (isRegistered) {
87
+ throw AppIdentityError.alreadyRegistered();
88
+ }
89
+ const skipValidation = options?.skipValidation ?? false;
90
+ let identity;
91
+ if (typeof data === "string") {
92
+ let parsed;
93
+ try {
94
+ parsed = parse(data);
95
+ } catch (error) {
96
+ throw AppIdentityError.embeddedParseFailed(
97
+ error instanceof Error ? error : new Error(String(error))
98
+ );
99
+ }
100
+ if (!skipValidation) {
101
+ const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);
102
+ if (!result.valid) {
103
+ throw AppIdentityError.embeddedValidationFailed(result.diagnostics);
104
+ }
105
+ }
106
+ identity = parsed;
107
+ } else {
108
+ if (!skipValidation) {
109
+ const result = await validateDataBySchemaId(data, APP_IDENTITY_SCHEMA_ID);
110
+ if (!result.valid) {
111
+ throw AppIdentityError.embeddedValidationFailed(result.diagnostics);
112
+ }
113
+ }
114
+ identity = data;
115
+ }
116
+ embeddedIdentity = deepFreeze(structuredClone(identity));
117
+ isRegistered = true;
118
+ }
119
+ function hasEmbeddedIdentity() {
120
+ return isRegistered;
121
+ }
122
+ function getEmbeddedIdentity() {
123
+ return embeddedIdentity;
124
+ }
125
+ function clearEmbeddedIdentity() {
126
+ embeddedIdentity = null;
127
+ isRegistered = false;
128
+ }
129
+
130
+ // src/appidentity/loader.ts
131
+ function deepFreeze2(obj) {
132
+ Object.freeze(obj);
133
+ Object.getOwnPropertyNames(obj).forEach((prop) => {
134
+ const value = obj[prop];
135
+ if (value !== null && (typeof value === "object" || typeof value === "function") && !Object.isFrozen(value)) {
136
+ deepFreeze2(value);
137
+ }
138
+ });
139
+ return obj;
140
+ }
141
+ async function loadIdentity(options) {
142
+ if (options?.identity) {
143
+ return deepFreeze2(structuredClone(options.identity));
144
+ }
145
+ if (!options?.skipCache) {
146
+ const cached = getCachedIdentity();
147
+ if (cached) {
148
+ return cached;
149
+ }
150
+ }
151
+ let discovery;
152
+ try {
153
+ discovery = await discoverIdentityPath({
154
+ path: options?.path,
155
+ startDir: options?.startDir
156
+ });
157
+ } catch (error) {
158
+ const hasExplicitPath = Boolean(options?.path);
159
+ const hasEnvOverride = Boolean(process.env[APP_IDENTITY_ENV_VAR]);
160
+ if (!hasExplicitPath && !hasEnvOverride && error instanceof AppIdentityError) {
161
+ const embedded = getEmbeddedIdentity();
162
+ if (embedded) {
163
+ setCachedIdentity(embedded);
164
+ return embedded;
165
+ }
166
+ }
167
+ throw error;
168
+ }
169
+ if (!discovery) {
170
+ const embedded = getEmbeddedIdentity();
171
+ if (embedded) {
172
+ setCachedIdentity(embedded);
173
+ return embedded;
174
+ }
175
+ throw AppIdentityError.notFound([]);
176
+ }
177
+ let content;
178
+ try {
179
+ content = await readFile(discovery.path, "utf-8");
180
+ } catch (error) {
181
+ throw AppIdentityError.readFailed(
182
+ discovery.path,
183
+ error instanceof Error ? error : new Error(String(error))
184
+ );
185
+ }
186
+ let parsed;
187
+ try {
188
+ parsed = parse(content);
189
+ } catch (error) {
190
+ throw AppIdentityError.parseFailed(
191
+ discovery.path,
192
+ error instanceof Error ? error : new Error(String(error))
193
+ );
194
+ }
195
+ if (!options?.skipValidation) {
196
+ const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);
197
+ if (!result.valid) {
198
+ throw AppIdentityError.validationFailed(discovery.path, result.diagnostics);
199
+ }
200
+ }
201
+ const identity = deepFreeze2(structuredClone(parsed));
202
+ setCachedIdentity(identity);
203
+ return identity;
204
+ }
205
+
206
+ export { APP_IDENTITY_DIR, APP_IDENTITY_ENV_VAR, APP_IDENTITY_FILENAME, APP_IDENTITY_SCHEMA_ID, MAX_ANCESTOR_SEARCH_DEPTH, clearEmbeddedIdentity, clearIdentityCache, getCachedIdentity, getEmbeddedIdentity, hasEmbeddedIdentity, loadIdentity, registerEmbeddedIdentity };
207
+ //# sourceMappingURL=chunk-VJIGX7MH.js.map
208
+ //# sourceMappingURL=chunk-VJIGX7MH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/appidentity/cache.ts","../src/appidentity/constants.ts","../src/appidentity/discovery.ts","../src/appidentity/embedded.ts","../src/appidentity/loader.ts"],"names":["parseYAML","deepFreeze"],"mappings":"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","file":"chunk-VJIGX7MH.js","sourcesContent":["/**\n * Application Identity Cache\n *\n * Process-level caching for identity objects with immutability guarantees\n */\n\nimport type { Identity } from \"./types.js\";\n\n/**\n * Process-level cache storage\n * null = not cached, Identity = cached value\n */\nlet cachedIdentity: Identity | null = null;\n\n/**\n * Get cached identity if available\n *\n * @returns Cached identity or null if not cached\n */\nexport function getCachedIdentity(): Identity | null {\n return cachedIdentity;\n}\n\n/**\n * Set cached identity\n *\n * Identity object should already be frozen before caching\n *\n * @param identity - Identity to cache (must be frozen)\n */\nexport function setCachedIdentity(identity: Identity): void {\n cachedIdentity = identity;\n}\n\n/**\n * Clear the identity cache\n *\n * Useful for testing or when identity needs to be reloaded\n */\nexport function clearIdentityCache(): void {\n cachedIdentity = null;\n}\n","/**\n * Application Identity Constants\n *\n * Centralized configuration for identity discovery and validation\n */\n\n/**\n * Filename for identity document\n */\nexport const APP_IDENTITY_FILENAME = \"app.yaml\";\n\n/**\n * Directory containing identity file\n */\nexport const APP_IDENTITY_DIR = \".fulmen\";\n\n/**\n * Environment variable for explicit path override\n */\nexport const APP_IDENTITY_ENV_VAR = \"FULMEN_APP_IDENTITY_PATH\";\n\n/**\n * Schema ID for validation\n */\nexport const APP_IDENTITY_SCHEMA_ID = \"config/repository/app-identity/v1.0.0/app-identity\";\n\n/**\n * Maximum depth for ancestor directory search\n * Prevents infinite loops and excessive filesystem traversal\n */\nexport const MAX_ANCESTOR_SEARCH_DEPTH = 20;\n","/**\n * Application Identity Discovery\n *\n * Implements the Crucible discovery precedence algorithm:\n * 1. Explicit path parameter (highest priority)\n * 2. Environment variable override (FULMEN_APP_IDENTITY_PATH)\n * 3. Ancestor search from CWD upward\n */\n\nimport { access } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport {\n APP_IDENTITY_DIR,\n APP_IDENTITY_ENV_VAR,\n APP_IDENTITY_FILENAME,\n MAX_ANCESTOR_SEARCH_DEPTH,\n} from \"./constants.js\";\nimport { AppIdentityError } from \"./errors.js\";\n\n/**\n * Discovery result with path and source\n */\nexport interface DiscoveryResult {\n readonly path: string;\n readonly source: \"explicit\" | \"env\" | \"ancestor\" | \"test\";\n}\n\n/**\n * Options for identity discovery\n */\nexport interface DiscoveryOptions {\n /**\n * Explicit path override (highest priority)\n */\n readonly path?: string;\n\n /**\n * Starting directory for ancestor search\n * Defaults to process.cwd()\n */\n readonly startDir?: string;\n}\n\n/**\n * Discover application identity file using Crucible precedence algorithm\n *\n * Discovery order:\n * 1. Explicit path parameter (throws if not found)\n * 2. FULMEN_APP_IDENTITY_PATH env var (throws if set but not found)\n * 3. Ancestor search from startDir (throws if not found after max depth)\n *\n * @param options - Discovery options\n * @returns Discovery result with path and source\n * @throws {AppIdentityError} If identity file not found or inaccessible\n */\nexport async function discoverIdentityPath(\n options?: DiscoveryOptions,\n): Promise<DiscoveryResult | null> {\n // 1. Explicit path parameter (highest priority)\n if (options?.path) {\n const exists = await fileExists(options.path);\n if (!exists) {\n throw AppIdentityError.notFound([options.path]);\n }\n return { path: options.path, source: \"explicit\" };\n }\n\n // 2. Environment variable override\n const envPath = process.env[APP_IDENTITY_ENV_VAR];\n if (envPath) {\n const exists = await fileExists(envPath);\n if (!exists) {\n throw AppIdentityError.envOverrideMissing(envPath);\n }\n return { path: envPath, source: \"env\" };\n }\n\n // 3. Ancestor search from startDir\n const startDir = options?.startDir || process.cwd();\n const result = await searchAncestors(startDir);\n if (result) {\n return { path: result, source: \"ancestor\" };\n }\n\n return null;\n}\n\n/**\n * Search ancestor directories for identity file\n *\n * Walks upward from startDir to filesystem root, looking for .fulmen/app.yaml\n * Stops at MAX_ANCESTOR_SEARCH_DEPTH or filesystem root\n *\n * @param startDir - Directory to start search from\n * @returns Path to identity file if found, null otherwise\n * @throws {AppIdentityError} If max depth reached or filesystem root reached without finding file\n */\nasync function searchAncestors(startDir: string): Promise<string | null> {\n let currentDir = startDir;\n const searchedPaths: string[] = [];\n\n for (let i = 0; i < MAX_ANCESTOR_SEARCH_DEPTH; i++) {\n const candidatePath = join(currentDir, APP_IDENTITY_DIR, APP_IDENTITY_FILENAME);\n searchedPaths.push(candidatePath);\n\n if (await fileExists(candidatePath)) {\n return candidatePath;\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n // Reached filesystem root\n throw AppIdentityError.notFound(searchedPaths);\n }\n currentDir = parentDir;\n }\n\n // Max depth reached\n throw AppIdentityError.notFound(searchedPaths);\n}\n\n/**\n * Check if a file exists and is accessible\n *\n * @param path - Path to check\n * @returns true if file exists and is readable, false otherwise\n */\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Embedded Identity Registration\n *\n * Provides a mechanism to register embedded identity at application startup\n * for standalone binary/package support. This allows applications to work\n * without requiring .fulmen/app.yaml to be discoverable on the filesystem.\n *\n * Discovery precedence (with embedded fallback):\n * 1. Explicit path parameter\n * 2. FULMEN_APP_IDENTITY_PATH environment variable\n * 3. Ancestor search from CWD\n * 4. Embedded identity fallback (this module)\n */\n\nimport { parse as parseYAML } from \"yaml\";\nimport { validateDataBySchemaId } from \"../schema/index.js\";\nimport { APP_IDENTITY_SCHEMA_ID } from \"./constants.js\";\nimport { AppIdentityError } from \"./errors.js\";\nimport type { Identity, RegisterEmbeddedIdentityOptions } from \"./types.js\";\n\n/**\n * Process-level storage for embedded identity\n * Uses first-wins semantics - once registered, cannot be replaced\n */\nlet embeddedIdentity: Identity | null = null;\nlet isRegistered = false;\n\n/**\n * Deep freeze an object and all its nested properties\n */\nfunction deepFreeze<T>(obj: T): T {\n Object.freeze(obj);\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n // biome-ignore lint/suspicious/noExplicitAny: Required for recursive property access\n const value = (obj as any)[prop];\n if (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n !Object.isFrozen(value)\n ) {\n deepFreeze(value);\n }\n });\n return obj;\n}\n\n/**\n * Register embedded identity YAML that serves as fallback when\n * runtime discovery cannot find an external app.yaml.\n *\n * Semantics:\n * - First registration wins (subsequent calls throw error)\n * - Validates against schema on registration (unless `skipValidation`)\n * - Stores as immutable process-level fallback\n *\n * @param data - YAML string or pre-parsed Identity object\n * @param options - Optional registration options (see {@link RegisterEmbeddedIdentityOptions})\n * @throws {AppIdentityError} If already registered or validation fails\n *\n * @example\n * ```typescript\n * // From npm package entry point\n * import { registerEmbeddedIdentity } from \"@fulmenhq/tsfulmen/appidentity\";\n * import { readFileSync } from \"node:fs\";\n * import { fileURLToPath } from \"node:url\";\n * import { dirname, join } from \"node:path\";\n *\n * const __filename = fileURLToPath(import.meta.url);\n * const __dirname = dirname(__filename);\n * const embeddedPath = join(__dirname, \"..\", \".fulmen\", \"app.yaml\");\n *\n * try {\n * const yaml = readFileSync(embeddedPath, \"utf-8\");\n * registerEmbeddedIdentity(yaml);\n * } catch {\n * // Embedded identity not available - discovery will use filesystem\n * }\n * ```\n *\n * @example\n * ```typescript\n * // In a `bun --compile` single-file binary, the FS-backed schema registry\n * // is unavailable. Register a build-time-embedded, CI-validated identity\n * // without re-validating against the (absent) schema registry:\n * import embeddedYaml from \"./app-identity.embedded.js\"; // inlined at build\n * registerEmbeddedIdentity(embeddedYaml, { skipValidation: true });\n * ```\n */\nexport async function registerEmbeddedIdentity(\n data: string | Identity,\n options?: RegisterEmbeddedIdentityOptions,\n): Promise<void> {\n // First-wins semantics\n if (isRegistered) {\n throw AppIdentityError.alreadyRegistered();\n }\n\n const skipValidation = options?.skipValidation ?? false;\n let identity: Identity;\n\n if (typeof data === \"string\") {\n // Parse YAML\n let parsed: unknown;\n try {\n parsed = parseYAML(data);\n } catch (error) {\n throw AppIdentityError.embeddedParseFailed(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Validate against schema (unless skipValidation)\n if (!skipValidation) {\n const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);\n if (!result.valid) {\n throw AppIdentityError.embeddedValidationFailed(result.diagnostics);\n }\n }\n\n identity = parsed as Identity;\n } else {\n // Pre-parsed object - still validate (unless skipValidation)\n if (!skipValidation) {\n const result = await validateDataBySchemaId(data, APP_IDENTITY_SCHEMA_ID);\n if (!result.valid) {\n throw AppIdentityError.embeddedValidationFailed(result.diagnostics);\n }\n }\n identity = data;\n }\n\n // Deep freeze and store\n embeddedIdentity = deepFreeze(structuredClone(identity)) as Identity;\n isRegistered = true;\n}\n\n/**\n * Check if embedded identity has been registered\n *\n * @returns true if registerEmbeddedIdentity() has been called successfully\n */\nexport function hasEmbeddedIdentity(): boolean {\n return isRegistered;\n}\n\n/**\n * Get the registered embedded identity\n *\n * @returns Frozen identity object or null if not registered\n */\nexport function getEmbeddedIdentity(): Identity | null {\n return embeddedIdentity;\n}\n\n/**\n * Clear embedded identity registration\n *\n * WARNING: For testing only. In production, embedded identity should be\n * set once at startup and never cleared.\n */\nexport function clearEmbeddedIdentity(): void {\n embeddedIdentity = null;\n isRegistered = false;\n}\n","/**\n * Application Identity Loader\n *\n * Main loading logic with YAML parsing, schema validation, and caching\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { parse as parseYAML } from \"yaml\";\nimport { validateDataBySchemaId } from \"../schema/index.js\";\nimport { clearIdentityCache, getCachedIdentity, setCachedIdentity } from \"./cache.js\";\nimport { APP_IDENTITY_ENV_VAR, APP_IDENTITY_SCHEMA_ID } from \"./constants.js\";\nimport { discoverIdentityPath } from \"./discovery.js\";\nimport { getEmbeddedIdentity } from \"./embedded.js\";\nimport { AppIdentityError } from \"./errors.js\";\nimport type { Identity, LoadIdentityOptions } from \"./types.js\";\n\n/**\n * Deep freeze an object and all its nested properties\n *\n * Recursively freezes an object and all nested objects/functions to ensure\n * complete immutability. This prevents accidental mutations of identity data.\n *\n * Note: Uses `any` type assertion (line 28) to access arbitrary properties\n * during recursive traversal. This is necessary because TypeScript's generic\n * constraint system cannot express \"any object with indexable properties\"\n * without losing the return type safety. The `any` is scoped to a single\n * line and protected by runtime guards.\n *\n * @param obj - Object to freeze\n * @returns Frozen object (same type as input)\n */\nfunction deepFreeze<T>(obj: T): T {\n // Freeze the object itself\n Object.freeze(obj);\n\n // Recursively freeze all properties\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n // biome-ignore lint/suspicious/noExplicitAny: Required for recursive property access - see function docs\n const value = (obj as any)[prop];\n if (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n !Object.isFrozen(value)\n ) {\n deepFreeze(value);\n }\n });\n\n return obj;\n}\n\n/**\n * Load application identity from .fulmen/app.yaml\n *\n * Discovery order:\n * 1. Test injection (options.identity) - bypasses all discovery and caching\n * 2. Explicit path (options.path)\n * 3. Environment variable (FULMEN_APP_IDENTITY_PATH)\n * 4. Ancestor search from startDir or CWD\n * 5. Embedded identity fallback (if registered via registerEmbeddedIdentity)\n *\n * Results are cached after first successful load unless skipCache is true.\n * Test injections are never cached.\n *\n * @param options - Load options\n * @returns Frozen, immutable identity object\n * @throws {AppIdentityError} If identity not found, invalid, or unreadable\n */\nexport async function loadIdentity(options?: LoadIdentityOptions): Promise<Identity> {\n // Test injection (never caches)\n if (options?.identity) {\n return deepFreeze(structuredClone(options.identity)) as Identity;\n }\n\n // Check cache unless skipCache\n if (!options?.skipCache) {\n const cached = getCachedIdentity();\n if (cached) {\n return cached;\n }\n }\n\n // Discover file - may throw AppIdentityError.notFound or return null\n let discovery: Awaited<ReturnType<typeof discoverIdentityPath>>;\n try {\n discovery = await discoverIdentityPath({\n path: options?.path,\n startDir: options?.startDir,\n });\n } catch (error) {\n // Discovery failed (e.g., reached filesystem root without finding identity)\n // Embedded fallback MUST NOT override explicit path or env override semantics.\n const hasExplicitPath = Boolean(options?.path);\n const hasEnvOverride = Boolean(process.env[APP_IDENTITY_ENV_VAR]);\n\n if (!hasExplicitPath && !hasEnvOverride && error instanceof AppIdentityError) {\n const embedded = getEmbeddedIdentity();\n if (embedded) {\n // Cache the embedded identity for subsequent calls\n setCachedIdentity(embedded);\n return embedded;\n }\n }\n\n throw error;\n }\n\n // If discovery returned null (no env var, no explicit path, and ancestor search returned null)\n if (!discovery) {\n const embedded = getEmbeddedIdentity();\n if (embedded) {\n // Cache the embedded identity for subsequent calls\n setCachedIdentity(embedded);\n return embedded;\n }\n throw AppIdentityError.notFound([]);\n }\n\n // Read file\n let content: string;\n try {\n content = await readFile(discovery.path, \"utf-8\");\n } catch (error) {\n throw AppIdentityError.readFailed(\n discovery.path,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Parse YAML\n let parsed: unknown;\n try {\n parsed = parseYAML(content);\n } catch (error) {\n throw AppIdentityError.parseFailed(\n discovery.path,\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n\n // Validate against schema (unless skipValidation)\n if (!options?.skipValidation) {\n const result = await validateDataBySchemaId(parsed, APP_IDENTITY_SCHEMA_ID);\n\n if (!result.valid) {\n throw AppIdentityError.validationFailed(discovery.path, result.diagnostics);\n }\n }\n\n // Deep freeze for immutability\n const identity = deepFreeze(structuredClone(parsed)) as Identity;\n\n // Cache result\n setCachedIdentity(identity);\n\n return identity;\n}\n\n/**\n * Get cached identity without triggering load\n *\n * @returns Cached identity or null if not cached\n */\n/**\n * Clear the identity cache\n *\n * Useful for testing or when identity needs to be reloaded\n */\nexport { clearIdentityCache, getCachedIdentity };\n"]}
@@ -0,0 +1,130 @@
1
+ import { FulmenError } from './chunk-GOTEQYAD.js';
2
+
3
+ // src/appidentity/errors.ts
4
+ var AppIdentityError = class _AppIdentityError extends FulmenError {
5
+ identityPath;
6
+ constructor(message, identityPath, cause) {
7
+ let errorData;
8
+ if (cause) {
9
+ errorData = FulmenError.fromError(cause, {
10
+ code: "APP_IDENTITY_ERROR",
11
+ severity: "high",
12
+ context: { identityPath }
13
+ }).data;
14
+ } else {
15
+ errorData = {
16
+ code: "APP_IDENTITY_ERROR",
17
+ message,
18
+ severity: "high",
19
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
20
+ context: { identityPath }
21
+ };
22
+ }
23
+ super(errorData);
24
+ this.name = "AppIdentityError";
25
+ this.identityPath = identityPath;
26
+ if (Error.captureStackTrace) {
27
+ Error.captureStackTrace(this, _AppIdentityError);
28
+ }
29
+ }
30
+ /**
31
+ * Create error for identity not found
32
+ */
33
+ static notFound(searchedPaths) {
34
+ const message = `App identity not found
35
+ Searched paths:
36
+ ${searchedPaths.map((p) => ` - ${p}`).join("\n")}`;
37
+ return new _AppIdentityError(message);
38
+ }
39
+ /**
40
+ * Create error for schema validation failure
41
+ */
42
+ static validationFailed(path, diagnostics) {
43
+ const errorCount = diagnostics.filter((d) => d.severity === "ERROR").length;
44
+ const warningCount = diagnostics.filter((d) => d.severity === "WARN").length;
45
+ let message = `Invalid app identity: ${path}
46
+ `;
47
+ message += `Validation errors: ${errorCount} error(s), ${warningCount} warning(s)
48
+ `;
49
+ const displayDiagnostics = diagnostics.slice(0, 3);
50
+ for (const diag of displayDiagnostics) {
51
+ message += ` - ${diag.message}`;
52
+ if (diag.pointer) {
53
+ message += ` at ${diag.pointer}`;
54
+ }
55
+ message += "\n";
56
+ }
57
+ if (diagnostics.length > 3) {
58
+ message += ` ... and ${diagnostics.length - 3} more
59
+ `;
60
+ }
61
+ return new _AppIdentityError(message, path);
62
+ }
63
+ /**
64
+ * Create error for environment variable override pointing to missing file
65
+ */
66
+ static envOverrideMissing(envPath) {
67
+ const message = `FULMEN_APP_IDENTITY_PATH points to missing file: ${envPath}
68
+ `;
69
+ return new _AppIdentityError(message, envPath);
70
+ }
71
+ /**
72
+ * Create error for YAML parsing failure
73
+ */
74
+ static parseFailed(path, cause) {
75
+ const message = `Failed to parse identity file: ${path}
76
+ ${cause.message}`;
77
+ return new _AppIdentityError(message, path, cause);
78
+ }
79
+ /**
80
+ * Create error for file read failure
81
+ */
82
+ static readFailed(path, cause) {
83
+ const message = `Failed to read identity file: ${path}
84
+ ${cause.message}`;
85
+ return new _AppIdentityError(message, path, cause);
86
+ }
87
+ /**
88
+ * Create error for embedded identity already registered
89
+ *
90
+ * Uses first-wins semantics - once registered, cannot be replaced
91
+ */
92
+ static alreadyRegistered() {
93
+ const message = "Embedded identity already registered. Registration uses first-wins semantics and cannot be replaced.";
94
+ return new _AppIdentityError(message);
95
+ }
96
+ /**
97
+ * Create error for embedded identity YAML parsing failure
98
+ */
99
+ static embeddedParseFailed(cause) {
100
+ const message = `Failed to parse embedded identity YAML: ${cause.message}`;
101
+ return new _AppIdentityError(message, void 0, cause);
102
+ }
103
+ /**
104
+ * Create error for embedded identity schema validation failure
105
+ */
106
+ static embeddedValidationFailed(diagnostics) {
107
+ const errorCount = diagnostics.filter((d) => d.severity === "ERROR").length;
108
+ const warningCount = diagnostics.filter((d) => d.severity === "WARN").length;
109
+ let message = "Invalid embedded identity\n";
110
+ message += `Validation errors: ${errorCount} error(s), ${warningCount} warning(s)
111
+ `;
112
+ const displayDiagnostics = diagnostics.slice(0, 3);
113
+ for (const diag of displayDiagnostics) {
114
+ message += ` - ${diag.message}`;
115
+ if (diag.pointer) {
116
+ message += ` at ${diag.pointer}`;
117
+ }
118
+ message += "\n";
119
+ }
120
+ if (diagnostics.length > 3) {
121
+ message += ` ... and ${diagnostics.length - 3} more
122
+ `;
123
+ }
124
+ return new _AppIdentityError(message);
125
+ }
126
+ };
127
+
128
+ export { AppIdentityError };
129
+ //# sourceMappingURL=chunk-WCCMRVZF.js.map
130
+ //# sourceMappingURL=chunk-WCCMRVZF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/appidentity/errors.ts"],"names":[],"mappings":"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","file":"chunk-WCCMRVZF.js","sourcesContent":["/**\n * Application Identity Errors\n *\n * Module-specific error classes for identity operations\n */\n\nimport { FulmenError, type FulmenErrorData } from \"../errors/index.js\";\nimport type { SchemaValidationDiagnostic } from \"../schema/types.js\";\n\n/**\n * Base error class for app identity operations\n */\nexport class AppIdentityError extends FulmenError {\n public readonly identityPath?: string;\n\n constructor(message: string, identityPath?: string, cause?: Error) {\n // Build FulmenErrorData\n let errorData: FulmenErrorData;\n\n if (cause) {\n errorData = FulmenError.fromError(cause, {\n code: \"APP_IDENTITY_ERROR\",\n severity: \"high\",\n context: { identityPath },\n }).data;\n } else {\n errorData = {\n code: \"APP_IDENTITY_ERROR\",\n message,\n severity: \"high\",\n timestamp: new Date().toISOString(),\n context: { identityPath },\n };\n }\n\n super(errorData);\n this.name = \"AppIdentityError\";\n this.identityPath = identityPath;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AppIdentityError);\n }\n }\n\n /**\n * Create error for identity not found\n */\n static notFound(searchedPaths: string[]): AppIdentityError {\n const message = `App identity not found\\nSearched paths:\\n${searchedPaths.map((p) => ` - ${p}`).join(\"\\n\")}`;\n return new AppIdentityError(message);\n }\n\n /**\n * Create error for schema validation failure\n */\n static validationFailed(\n path: string,\n diagnostics: SchemaValidationDiagnostic[],\n ): AppIdentityError {\n const errorCount = diagnostics.filter((d) => d.severity === \"ERROR\").length;\n const warningCount = diagnostics.filter((d) => d.severity === \"WARN\").length;\n\n let message = `Invalid app identity: ${path}\\n`;\n message += `Validation errors: ${errorCount} error(s), ${warningCount} warning(s)\\n`;\n\n // Include first few diagnostics\n const displayDiagnostics = diagnostics.slice(0, 3);\n for (const diag of displayDiagnostics) {\n message += ` - ${diag.message}`;\n if (diag.pointer) {\n message += ` at ${diag.pointer}`;\n }\n message += \"\\n\";\n }\n\n if (diagnostics.length > 3) {\n message += ` ... and ${diagnostics.length - 3} more\\n`;\n }\n\n return new AppIdentityError(message, path);\n }\n\n /**\n * Create error for environment variable override pointing to missing file\n */\n static envOverrideMissing(envPath: string): AppIdentityError {\n const message = `FULMEN_APP_IDENTITY_PATH points to missing file: ${envPath}\\n`;\n return new AppIdentityError(message, envPath);\n }\n\n /**\n * Create error for YAML parsing failure\n */\n static parseFailed(path: string, cause: Error): AppIdentityError {\n const message = `Failed to parse identity file: ${path}\\n${cause.message}`;\n return new AppIdentityError(message, path, cause);\n }\n\n /**\n * Create error for file read failure\n */\n static readFailed(path: string, cause: Error): AppIdentityError {\n const message = `Failed to read identity file: ${path}\\n${cause.message}`;\n return new AppIdentityError(message, path, cause);\n }\n\n /**\n * Create error for embedded identity already registered\n *\n * Uses first-wins semantics - once registered, cannot be replaced\n */\n static alreadyRegistered(): AppIdentityError {\n const message =\n \"Embedded identity already registered. \" +\n \"Registration uses first-wins semantics and cannot be replaced.\";\n return new AppIdentityError(message);\n }\n\n /**\n * Create error for embedded identity YAML parsing failure\n */\n static embeddedParseFailed(cause: Error): AppIdentityError {\n const message = `Failed to parse embedded identity YAML: ${cause.message}`;\n return new AppIdentityError(message, undefined, cause);\n }\n\n /**\n * Create error for embedded identity schema validation failure\n */\n static embeddedValidationFailed(diagnostics: SchemaValidationDiagnostic[]): AppIdentityError {\n const errorCount = diagnostics.filter((d) => d.severity === \"ERROR\").length;\n const warningCount = diagnostics.filter((d) => d.severity === \"WARN\").length;\n\n let message = \"Invalid embedded identity\\n\";\n message += `Validation errors: ${errorCount} error(s), ${warningCount} warning(s)\\n`;\n\n const displayDiagnostics = diagnostics.slice(0, 3);\n for (const diag of displayDiagnostics) {\n message += ` - ${diag.message}`;\n if (diag.pointer) {\n message += ` at ${diag.pointer}`;\n }\n message += \"\\n\";\n }\n\n if (diagnostics.length > 3) {\n message += ` ... and ${diagnostics.length - 3} more\\n`;\n }\n\n return new AppIdentityError(message);\n }\n}\n"]}