@mnemonica/otel 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +109 -0
  3. package/build/hooks/attach-hooks.d.ts +3 -0
  4. package/build/hooks/attach-hooks.d.ts.map +1 -0
  5. package/build/hooks/attach-hooks.js +52 -0
  6. package/build/index.d.ts +32 -0
  7. package/build/index.d.ts.map +1 -0
  8. package/build/index.js +32 -0
  9. package/build/providers/async-flow.provider.d.ts +40 -0
  10. package/build/providers/async-flow.provider.d.ts.map +1 -0
  11. package/build/providers/async-flow.provider.js +128 -0
  12. package/build/providers/dive-otel.provider.d.ts +51 -0
  13. package/build/providers/dive-otel.provider.d.ts.map +1 -0
  14. package/build/providers/dive-otel.provider.js +238 -0
  15. package/build/providers/mnemonica-otel.provider.d.ts +12 -0
  16. package/build/providers/mnemonica-otel.provider.d.ts.map +1 -0
  17. package/build/providers/mnemonica-otel.provider.js +113 -0
  18. package/build/request-scope.d.ts +41 -0
  19. package/build/request-scope.d.ts.map +1 -0
  20. package/build/request-scope.js +35 -0
  21. package/build/thunderstruck/feed-from-request.d.ts +21 -0
  22. package/build/thunderstruck/feed-from-request.d.ts.map +1 -0
  23. package/build/thunderstruck/feed-from-request.js +34 -0
  24. package/build/thunderstruck/pre-root.d.ts +67 -0
  25. package/build/thunderstruck/pre-root.d.ts.map +1 -0
  26. package/build/thunderstruck/pre-root.js +78 -0
  27. package/build/unblind.d.ts +46 -0
  28. package/build/unblind.d.ts.map +1 -0
  29. package/build/unblind.js +120 -0
  30. package/build/utils/dive-flow.d.ts +24 -0
  31. package/build/utils/dive-flow.d.ts.map +1 -0
  32. package/build/utils/dive-flow.js +33 -0
  33. package/build/utils/is-mnemonica-instance.d.ts +2 -0
  34. package/build/utils/is-mnemonica-instance.d.ts.map +1 -0
  35. package/build/utils/is-mnemonica-instance.js +9 -0
  36. package/build-cjs/hooks/attach-hooks.js +55 -0
  37. package/build-cjs/index.js +52 -0
  38. package/build-cjs/package.json +1 -0
  39. package/build-cjs/providers/async-flow.provider.js +132 -0
  40. package/build-cjs/providers/dive-otel.provider.js +242 -0
  41. package/build-cjs/providers/mnemonica-otel.provider.js +117 -0
  42. package/build-cjs/request-scope.js +38 -0
  43. package/build-cjs/thunderstruck/feed-from-request.js +37 -0
  44. package/build-cjs/thunderstruck/pre-root.js +83 -0
  45. package/build-cjs/unblind.js +127 -0
  46. package/build-cjs/utils/dive-flow.js +37 -0
  47. package/build-cjs/utils/is-mnemonica-instance.js +12 -0
  48. package/package.json +69 -0
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Thunderstruck pre-root correlation store (adapter side).
3
+ *
4
+ * The correlation key is OBJECT IDENTITY: the very body / query / params
5
+ * object the interceptor saw at the boundary is the same reference pipes and
6
+ * construct handlers receive later. A WeakMap<object, payloads> therefore
7
+ * correlates without AsyncLocalStorage and without races — concurrent
8
+ * requests can never read each other's payloads because each holds only its
9
+ * own objects.
10
+ *
11
+ * The payloads live INSIDE the WeakMap record: there is no other store and
12
+ * no release step. When the request objects are garbage-collected, the
13
+ * payloads go with them — retention is exactly the request's lifetime.
14
+ * Dive stays free of framework-specifics and of storage entirely: it is
15
+ * the tracing engine, not a warehouse.
16
+ *
17
+ * The optional `request` link (RawPreRootPayload.request) puts the raw
18
+ * request object inside its own record and stamps it as a key too, so
19
+ * getPreRoot(req) resolves from anywhere the request is reachable. The
20
+ * WeakMap's ephemeron semantics keep this value→key cycle collectable:
21
+ * retention stays exactly the request's lifetime.
22
+ */
23
+ export interface RawPreRootPayload {
24
+ method: string;
25
+ url: string;
26
+ params?: unknown;
27
+ query?: unknown;
28
+ body?: unknown;
29
+ headers?: unknown;
30
+ /**
31
+ * Optional link to the raw request object (storeRequest flag). When
32
+ * present it is stamped as a correlation key too, so getPreRoot(req)
33
+ * resolves — e.g. from an exception filter holding only the request.
34
+ */
35
+ request?: unknown;
36
+ }
37
+ export interface PreRootRecord {
38
+ raw: unknown;
39
+ validated?: unknown;
40
+ }
41
+ export interface PreRootData {
42
+ raw?: unknown;
43
+ validated?: unknown;
44
+ }
45
+ /**
46
+ * Stash the raw boundary payload and stamp every request-part object
47
+ * (params / query / body / headers / request) so later stages correlate
48
+ * by the object they already hold. Primitive bodies are not correlatable —
49
+ * they are still inside the raw payload, just not resolvable via
50
+ * getPreRoot.
51
+ */
52
+ export declare function feedPreRoot(raw: RawPreRootPayload): void;
53
+ /**
54
+ * Attach the validated DTO to the record of the boundary object it came
55
+ * from. Called by MnemonicaValidationPipe after class-validator passes.
56
+ * No-op when the object was never stamped (the interceptor is not active).
57
+ */
58
+ export declare function feedValidatedPreRoot(forValue: unknown, validated: unknown): void;
59
+ /**
60
+ * Resolve the pre-root payloads for a boundary object — the same body /
61
+ * query / params reference the interceptor stamped. Payloads live as long
62
+ * as the request objects do (WeakMap), so this resolves during construction
63
+ * AND afterwards — e.g. from an exception filter reporting which data
64
+ * caused the failure.
65
+ */
66
+ export declare function getPreRoot(value: unknown): PreRootData | undefined;
67
+ //# sourceMappingURL=pre-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-root.d.ts","sourceRoot":"","sources":["../../src/thunderstruck/pre-root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAI,MAAM,CAAC;IACjB,GAAG,EAAO,MAAM,CAAC;IACjB,MAAM,CAAC,EAAG,OAAO,CAAC;IAClB,KAAK,CAAC,EAAI,OAAO,CAAC;IAClB,IAAI,CAAC,EAAK,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAS,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC3B,GAAG,CAAC,EAAQ,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAQD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAE,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAOzD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CASjF;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAE,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAanE"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Thunderstruck pre-root correlation store (adapter side).
3
+ *
4
+ * The correlation key is OBJECT IDENTITY: the very body / query / params
5
+ * object the interceptor saw at the boundary is the same reference pipes and
6
+ * construct handlers receive later. A WeakMap<object, payloads> therefore
7
+ * correlates without AsyncLocalStorage and without races — concurrent
8
+ * requests can never read each other's payloads because each holds only its
9
+ * own objects.
10
+ *
11
+ * The payloads live INSIDE the WeakMap record: there is no other store and
12
+ * no release step. When the request objects are garbage-collected, the
13
+ * payloads go with them — retention is exactly the request's lifetime.
14
+ * Dive stays free of framework-specifics and of storage entirely: it is
15
+ * the tracing engine, not a warehouse.
16
+ *
17
+ * The optional `request` link (RawPreRootPayload.request) puts the raw
18
+ * request object inside its own record and stamps it as a key too, so
19
+ * getPreRoot(req) resolves from anywhere the request is reachable. The
20
+ * WeakMap's ephemeron semantics keep this value→key cycle collectable:
21
+ * retention stays exactly the request's lifetime.
22
+ */
23
+ function isObjectKey(value) {
24
+ return value !== null && (typeof value === 'object' || typeof value === 'function');
25
+ }
26
+ const preRootRecords = new WeakMap();
27
+ /**
28
+ * Stash the raw boundary payload and stamp every request-part object
29
+ * (params / query / body / headers / request) so later stages correlate
30
+ * by the object they already hold. Primitive bodies are not correlatable —
31
+ * they are still inside the raw payload, just not resolvable via
32
+ * getPreRoot.
33
+ */
34
+ export function feedPreRoot(raw) {
35
+ const record = { raw };
36
+ for (const part of [raw.params, raw.query, raw.body, raw.headers, raw.request]) {
37
+ if (isObjectKey(part)) {
38
+ preRootRecords.set(part, record);
39
+ }
40
+ }
41
+ }
42
+ /**
43
+ * Attach the validated DTO to the record of the boundary object it came
44
+ * from. Called by MnemonicaValidationPipe after class-validator passes.
45
+ * No-op when the object was never stamped (the interceptor is not active).
46
+ */
47
+ export function feedValidatedPreRoot(forValue, validated) {
48
+ if (!isObjectKey(forValue)) {
49
+ return;
50
+ }
51
+ const record = preRootRecords.get(forValue);
52
+ if (!record) {
53
+ return;
54
+ }
55
+ record.validated = validated;
56
+ }
57
+ /**
58
+ * Resolve the pre-root payloads for a boundary object — the same body /
59
+ * query / params reference the interceptor stamped. Payloads live as long
60
+ * as the request objects do (WeakMap), so this resolves during construction
61
+ * AND afterwards — e.g. from an exception filter reporting which data
62
+ * caused the failure.
63
+ */
64
+ export function getPreRoot(value) {
65
+ if (!isObjectKey(value)) {
66
+ return undefined;
67
+ }
68
+ const record = preRootRecords.get(value);
69
+ if (!record) {
70
+ return undefined;
71
+ }
72
+ const result = {
73
+ raw: record.raw,
74
+ validated: record.validated,
75
+ };
76
+ return result;
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlLXJvb3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGh1bmRlcnN0cnVjay9wcmUtcm9vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBMkJILFNBQVMsV0FBVyxDQUFFLEtBQWM7SUFDbkMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDO0FBQ3JGLENBQUM7QUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLE9BQU8sRUFBeUIsQ0FBQztBQUU1RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFFLEdBQXNCO0lBQ2xELE1BQU0sTUFBTSxHQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3RDLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2hGLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkIsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNGLENBQUM7QUFDRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBRSxRQUFpQixFQUFFLFNBQWtCO0lBQzFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPO0lBQ1IsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2IsT0FBTztJQUNSLENBQUM7SUFDRCxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUM5QixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBRSxLQUFjO0lBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDYixPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQWdCO1FBQzNCLEdBQUcsRUFBUyxNQUFNLENBQUMsR0FBRztRQUN0QixTQUFTLEVBQUcsTUFBTSxDQUFDLFNBQVM7S0FDNUIsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGh1bmRlcnN0cnVjayBwcmUtcm9vdCBjb3JyZWxhdGlvbiBzdG9yZSAoYWRhcHRlciBzaWRlKS5cbiAqXG4gKiBUaGUgY29ycmVsYXRpb24ga2V5IGlzIE9CSkVDVCBJREVOVElUWTogdGhlIHZlcnkgYm9keSAvIHF1ZXJ5IC8gcGFyYW1zXG4gKiBvYmplY3QgdGhlIGludGVyY2VwdG9yIHNhdyBhdCB0aGUgYm91bmRhcnkgaXMgdGhlIHNhbWUgcmVmZXJlbmNlIHBpcGVzIGFuZFxuICogY29uc3RydWN0IGhhbmRsZXJzIHJlY2VpdmUgbGF0ZXIuIEEgV2Vha01hcDxvYmplY3QsIHBheWxvYWRzPiB0aGVyZWZvcmVcbiAqIGNvcnJlbGF0ZXMgd2l0aG91dCBBc3luY0xvY2FsU3RvcmFnZSBhbmQgd2l0aG91dCByYWNlcyDigJQgY29uY3VycmVudFxuICogcmVxdWVzdHMgY2FuIG5ldmVyIHJlYWQgZWFjaCBvdGhlcidzIHBheWxvYWRzIGJlY2F1c2UgZWFjaCBob2xkcyBvbmx5IGl0c1xuICogb3duIG9iamVjdHMuXG4gKlxuICogVGhlIHBheWxvYWRzIGxpdmUgSU5TSURFIHRoZSBXZWFrTWFwIHJlY29yZDogdGhlcmUgaXMgbm8gb3RoZXIgc3RvcmUgYW5kXG4gKiBubyByZWxlYXNlIHN0ZXAuIFdoZW4gdGhlIHJlcXVlc3Qgb2JqZWN0cyBhcmUgZ2FyYmFnZS1jb2xsZWN0ZWQsIHRoZVxuICogcGF5bG9hZHMgZ28gd2l0aCB0aGVtIOKAlCByZXRlbnRpb24gaXMgZXhhY3RseSB0aGUgcmVxdWVzdCdzIGxpZmV0aW1lLlxuICogRGl2ZSBzdGF5cyBmcmVlIG9mIGZyYW1ld29yay1zcGVjaWZpY3MgYW5kIG9mIHN0b3JhZ2UgZW50aXJlbHk6IGl0IGlzXG4gKiB0aGUgdHJhY2luZyBlbmdpbmUsIG5vdCBhIHdhcmVob3VzZS5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYHJlcXVlc3RgIGxpbmsgKFJhd1ByZVJvb3RQYXlsb2FkLnJlcXVlc3QpIHB1dHMgdGhlIHJhd1xuICogcmVxdWVzdCBvYmplY3QgaW5zaWRlIGl0cyBvd24gcmVjb3JkIGFuZCBzdGFtcHMgaXQgYXMgYSBrZXkgdG9vLCBzb1xuICogZ2V0UHJlUm9vdChyZXEpIHJlc29sdmVzIGZyb20gYW55d2hlcmUgdGhlIHJlcXVlc3QgaXMgcmVhY2hhYmxlLiBUaGVcbiAqIFdlYWtNYXAncyBlcGhlbWVyb24gc2VtYW50aWNzIGtlZXAgdGhpcyB2YWx1ZeKGkmtleSBjeWNsZSBjb2xsZWN0YWJsZTpcbiAqIHJldGVudGlvbiBzdGF5cyBleGFjdGx5IHRoZSByZXF1ZXN0J3MgbGlmZXRpbWUuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBSYXdQcmVSb290UGF5bG9hZCB7XG5cdG1ldGhvZCAgOiBzdHJpbmc7XG5cdHVybCAgICAgOiBzdHJpbmc7XG5cdHBhcmFtcz8gOiB1bmtub3duO1xuXHRxdWVyeT8gIDogdW5rbm93bjtcblx0Ym9keT8gICA6IHVua25vd247XG5cdGhlYWRlcnM/OiB1bmtub3duO1xuXHQvKipcblx0ICogT3B0aW9uYWwgbGluayB0byB0aGUgcmF3IHJlcXVlc3Qgb2JqZWN0IChzdG9yZVJlcXVlc3QgZmxhZykuIFdoZW5cblx0ICogcHJlc2VudCBpdCBpcyBzdGFtcGVkIGFzIGEgY29ycmVsYXRpb24ga2V5IHRvbywgc28gZ2V0UHJlUm9vdChyZXEpXG5cdCAqIHJlc29sdmVzIOKAlCBlLmcuIGZyb20gYW4gZXhjZXB0aW9uIGZpbHRlciBob2xkaW5nIG9ubHkgdGhlIHJlcXVlc3QuXG5cdCAqL1xuXHRyZXF1ZXN0PzogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVSb290UmVjb3JkIHtcblx0cmF3ICAgICAgIDogdW5rbm93bjtcblx0dmFsaWRhdGVkPzogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcmVSb290RGF0YSB7XG5cdHJhdz8gICAgICA6IHVua25vd247XG5cdHZhbGlkYXRlZD86IHVua25vd247XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0S2V5ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCB7XG5cdHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpO1xufVxuXG5jb25zdCBwcmVSb290UmVjb3JkcyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgUHJlUm9vdFJlY29yZD4oKTtcblxuLyoqXG4gKiBTdGFzaCB0aGUgcmF3IGJvdW5kYXJ5IHBheWxvYWQgYW5kIHN0YW1wIGV2ZXJ5IHJlcXVlc3QtcGFydCBvYmplY3RcbiAqIChwYXJhbXMgLyBxdWVyeSAvIGJvZHkgLyBoZWFkZXJzIC8gcmVxdWVzdCkgc28gbGF0ZXIgc3RhZ2VzIGNvcnJlbGF0ZVxuICogYnkgdGhlIG9iamVjdCB0aGV5IGFscmVhZHkgaG9sZC4gUHJpbWl0aXZlIGJvZGllcyBhcmUgbm90IGNvcnJlbGF0YWJsZSDigJRcbiAqIHRoZXkgYXJlIHN0aWxsIGluc2lkZSB0aGUgcmF3IHBheWxvYWQsIGp1c3Qgbm90IHJlc29sdmFibGUgdmlhXG4gKiBnZXRQcmVSb290LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmVlZFByZVJvb3QgKHJhdzogUmF3UHJlUm9vdFBheWxvYWQpOiB2b2lkIHtcblx0Y29uc3QgcmVjb3JkOiBQcmVSb290UmVjb3JkID0geyByYXcgfTtcblx0Zm9yIChjb25zdCBwYXJ0IG9mIFtyYXcucGFyYW1zLCByYXcucXVlcnksIHJhdy5ib2R5LCByYXcuaGVhZGVycywgcmF3LnJlcXVlc3RdKSB7XG5cdFx0aWYgKGlzT2JqZWN0S2V5KHBhcnQpKSB7XG5cdFx0XHRwcmVSb290UmVjb3Jkcy5zZXQocGFydCwgcmVjb3JkKTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBBdHRhY2ggdGhlIHZhbGlkYXRlZCBEVE8gdG8gdGhlIHJlY29yZCBvZiB0aGUgYm91bmRhcnkgb2JqZWN0IGl0IGNhbWVcbiAqIGZyb20uIENhbGxlZCBieSBNbmVtb25pY2FWYWxpZGF0aW9uUGlwZSBhZnRlciBjbGFzcy12YWxpZGF0b3IgcGFzc2VzLlxuICogTm8tb3Agd2hlbiB0aGUgb2JqZWN0IHdhcyBuZXZlciBzdGFtcGVkICh0aGUgaW50ZXJjZXB0b3IgaXMgbm90IGFjdGl2ZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZWVkVmFsaWRhdGVkUHJlUm9vdCAoZm9yVmFsdWU6IHVua25vd24sIHZhbGlkYXRlZDogdW5rbm93bik6IHZvaWQge1xuXHRpZiAoIWlzT2JqZWN0S2V5KGZvclZhbHVlKSkge1xuXHRcdHJldHVybjtcblx0fVxuXHRjb25zdCByZWNvcmQgPSBwcmVSb290UmVjb3Jkcy5nZXQoZm9yVmFsdWUpO1xuXHRpZiAoIXJlY29yZCkge1xuXHRcdHJldHVybjtcblx0fVxuXHRyZWNvcmQudmFsaWRhdGVkID0gdmFsaWRhdGVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIHByZS1yb290IHBheWxvYWRzIGZvciBhIGJvdW5kYXJ5IG9iamVjdCDigJQgdGhlIHNhbWUgYm9keSAvXG4gKiBxdWVyeSAvIHBhcmFtcyByZWZlcmVuY2UgdGhlIGludGVyY2VwdG9yIHN0YW1wZWQuIFBheWxvYWRzIGxpdmUgYXMgbG9uZ1xuICogYXMgdGhlIHJlcXVlc3Qgb2JqZWN0cyBkbyAoV2Vha01hcCksIHNvIHRoaXMgcmVzb2x2ZXMgZHVyaW5nIGNvbnN0cnVjdGlvblxuICogQU5EIGFmdGVyd2FyZHMg4oCUIGUuZy4gZnJvbSBhbiBleGNlcHRpb24gZmlsdGVyIHJlcG9ydGluZyB3aGljaCBkYXRhXG4gKiBjYXVzZWQgdGhlIGZhaWx1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmVSb290ICh2YWx1ZTogdW5rbm93bik6IFByZVJvb3REYXRhIHwgdW5kZWZpbmVkIHtcblx0aWYgKCFpc09iamVjdEtleSh2YWx1ZSkpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdGNvbnN0IHJlY29yZCA9IHByZVJvb3RSZWNvcmRzLmdldCh2YWx1ZSk7XG5cdGlmICghcmVjb3JkKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXHRjb25zdCByZXN1bHQ6IFByZVJvb3REYXRhID0ge1xuXHRcdHJhdyAgICAgICA6IHJlY29yZC5yYXcsXG5cdFx0dmFsaWRhdGVkIDogcmVjb3JkLnZhbGlkYXRlZCxcblx0fTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
@@ -0,0 +1,46 @@
1
+ export interface UnblindReport {
2
+ kind: string;
3
+ message: string;
4
+ branch: string[];
5
+ erroredType: string | null;
6
+ erroredInstance: unknown;
7
+ attemptedArgs: unknown;
8
+ }
9
+ /**
10
+ * extract() that cannot throw inside an error path — non-mnemonica
11
+ * values degrade to their key list.
12
+ */
13
+ export declare function extractSafe(instance: object): unknown;
14
+ /**
15
+ * The attempted constructor args of a FAILED mnemonica construction ride
16
+ * the errored instance itself: the caught object IS the errored shell
17
+ * (probed 2026-09-03: caught === creationError's inheritedInstance,
18
+ * instanceof Error via the spliced prototype chain), and core's own
19
+ * getProps exposes { args, originalError, … } off the props WeakMap.
20
+ * Plain errors yield undefined; anything unexpected degrades, never
21
+ * throws inside a filter.
22
+ */
23
+ export declare function erroredArgsSafe(error: Error): unknown;
24
+ /**
25
+ * JSON.stringify that cannot throw inside an error path — circular or
26
+ * hostile values degrade to a marker instead of crashing the boundary
27
+ * (a throwing boundary is exactly the cascade this fights).
28
+ */
29
+ export declare function stringifySafe(value: unknown): string;
30
+ /**
31
+ * Build the unblinded report for a caught failure: the dive branch, the
32
+ * errored construction edge, the attempted constructor args, the actual
33
+ * message. Non-Error throws are reported truthfully as such, never
34
+ * dressed up as Errors.
35
+ */
36
+ export declare function buildUnblindReport(error: unknown): UnblindReport;
37
+ /**
38
+ * The unconditional half: an ERROR span with the recorded exception + the
39
+ * dive branch — inside the request's async context, so the ALS context
40
+ * manager parents it under the request span on its own — and the stdout
41
+ * marker line. A non-Error throw is recorded as an attribute:
42
+ * recordException on a circular object could break exporter
43
+ * serialization.
44
+ */
45
+ export declare function recordUnblindTelemetry(report: UnblindReport, error: unknown): void;
46
+ //# sourceMappingURL=unblind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unblind.d.ts","sourceRoot":"","sources":["../src/unblind.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAc,MAAM,CAAC;IACzB,OAAO,EAAW,MAAM,CAAC;IACzB,MAAM,EAAY,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAO,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,EAAG,OAAO,CAAC;IAC1B,aAAa,EAAK,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAStD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAQrD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAE,KAAK,EAAE,OAAO,GAAG,aAAa,CAqBjE;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAkBnF"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * The Unblinder core (2026-09-03, Viktor) — framework-free error-boundary
3
+ * reporting: build the report from dive's trace + core's getProps, then
4
+ * record the telemetry. The framework wrapper owns the body discipline
5
+ * (status code, the headers-sent check, expected-client-error passthrough);
6
+ * this core owns the report and the UNCONDITIONAL telemetry.
7
+ *
8
+ * CONTRACT: report.kind ('caught-unblinded'), the span name
9
+ * ('mnemonica.caught-exception') and the [unblind] stdout marker are
10
+ * pinned by downstream consumers (runbooks grep the marker; framework
11
+ * adapters pin the report shape). Keep them stable.
12
+ */
13
+ import { getFlow } from '@mnemonica/dive';
14
+ import { utils, getProps } from 'mnemonica';
15
+ import { trace, SpanStatusCode } from '@opentelemetry/api';
16
+ /**
17
+ * extract() that cannot throw inside an error path — non-mnemonica
18
+ * values degrade to their key list.
19
+ */
20
+ export function extractSafe(instance) {
21
+ try {
22
+ const result = utils.extract(instance);
23
+ return result;
24
+ }
25
+ catch {
26
+ const result = Object.keys(instance);
27
+ return result;
28
+ }
29
+ }
30
+ /**
31
+ * The attempted constructor args of a FAILED mnemonica construction ride
32
+ * the errored instance itself: the caught object IS the errored shell
33
+ * (probed 2026-09-03: caught === creationError's inheritedInstance,
34
+ * instanceof Error via the spliced prototype chain), and core's own
35
+ * getProps exposes { args, originalError, … } off the props WeakMap.
36
+ * Plain errors yield undefined; anything unexpected degrades, never
37
+ * throws inside a filter.
38
+ */
39
+ export function erroredArgsSafe(error) {
40
+ try {
41
+ const props = getProps(error);
42
+ const result = props?.args;
43
+ return result;
44
+ }
45
+ catch {
46
+ const result = undefined;
47
+ return result;
48
+ }
49
+ }
50
+ /**
51
+ * JSON.stringify that cannot throw inside an error path — circular or
52
+ * hostile values degrade to a marker instead of crashing the boundary
53
+ * (a throwing boundary is exactly the cascade this fights).
54
+ */
55
+ export function stringifySafe(value) {
56
+ try {
57
+ const result = JSON.stringify(value);
58
+ return result;
59
+ }
60
+ catch {
61
+ const result = '"[unserializable report payload]"';
62
+ return result;
63
+ }
64
+ }
65
+ /**
66
+ * Build the unblinded report for a caught failure: the dive branch, the
67
+ * errored construction edge, the attempted constructor args, the actual
68
+ * message. Non-Error throws are reported truthfully as such, never
69
+ * dressed up as Errors.
70
+ */
71
+ export function buildUnblindReport(error) {
72
+ const isError = error instanceof Error;
73
+ const message = isError ? error.message : `non-Error thrown (${typeof error})`;
74
+ const flow = isError ? getFlow(error) : [];
75
+ // The errored create edge attributes the construction's PARENT
76
+ // instance (probed 2026-09-03: edge.instance === existentInstance).
77
+ // The attempted constructor ARGS ride the caught error itself — it
78
+ // IS the errored shell, and getProps exposes its args (see
79
+ // erroredArgsSafe above).
80
+ const erroredEdge = [...flow].reverse().find((edge) => edge.kind === 'create' && edge.status === 'error');
81
+ const erroredInstance = erroredEdge?.instance;
82
+ const attemptedArgs = isError ? erroredArgsSafe(error) : undefined;
83
+ const report = {
84
+ kind: 'caught-unblinded',
85
+ message,
86
+ branch: flow.map((edge) => `${edge.kind}:${edge.name}`),
87
+ erroredType: erroredEdge?.name ?? null,
88
+ erroredInstance: erroredInstance ? extractSafe(erroredInstance) : null,
89
+ attemptedArgs: attemptedArgs ?? null,
90
+ };
91
+ return report;
92
+ }
93
+ /**
94
+ * The unconditional half: an ERROR span with the recorded exception + the
95
+ * dive branch — inside the request's async context, so the ALS context
96
+ * manager parents it under the request span on its own — and the stdout
97
+ * marker line. A non-Error throw is recorded as an attribute:
98
+ * recordException on a circular object could break exporter
99
+ * serialization.
100
+ */
101
+ export function recordUnblindTelemetry(report, error) {
102
+ const span = trace.getTracer('@mnemonica/otel').startSpan('mnemonica.caught-exception');
103
+ span.setAttribute('dive.branch', report.branch.join(' → '));
104
+ if (report.erroredType) {
105
+ span.setAttribute('mnemonica.errored_type', report.erroredType);
106
+ }
107
+ span.setStatus({ code: SpanStatusCode.ERROR, message: report.message });
108
+ if (error instanceof Error) {
109
+ span.recordException(error);
110
+ }
111
+ else {
112
+ span.setAttribute('exception.type', 'non-Error-throw');
113
+ }
114
+ span.end();
115
+ // The [unblind] prefix is a downstream contract — runbooks grep for
116
+ // exactly this marker.
117
+ // eslint-disable-next-line no-console
118
+ console.log(`[unblind] ${stringifySafe(report)}`);
119
+ }
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5ibGluZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91bmJsaW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFXM0Q7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBRSxRQUFnQjtJQUM1QyxJQUFJLENBQUM7UUFDSixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNSLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0FBQ0YsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBRSxLQUFZO0lBQzVDLElBQUksQ0FBQztRQUNKLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQW1DLENBQUM7UUFDaEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUFFLElBQUksQ0FBQztRQUMzQixPQUFPLE1BQU0sQ0FBQztJQUNmLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDekIsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0FBQ0YsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFFLEtBQWM7SUFDNUMsSUFBSSxDQUFDO1FBQ0osTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENB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QUMsYUFBYSxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBVbmJsaW5kZXIgY29yZSAoMjAyNi0wOS0wMywgVmlrdG9yKSDigJQgZnJhbWV3b3JrLWZyZWUgZXJyb3ItYm91bmRhcnlcbiAqIHJlcG9ydGluZzogYnVpbGQgdGhlIHJlcG9ydCBmcm9tIGRpdmUncyB0cmFjZSArIGNvcmUncyBnZXRQcm9wcywgdGhlblxuICogcmVjb3JkIHRoZSB0ZWxlbWV0cnkuIFRoZSBmcmFtZXdvcmsgd3JhcHBlciBvd25zIHRoZSBib2R5IGRpc2NpcGxpbmVcbiAqIChzdGF0dXMgY29kZSwgdGhlIGhlYWRlcnMtc2VudCBjaGVjaywgZXhwZWN0ZWQtY2xpZW50LWVycm9yIHBhc3N0aHJvdWdoKTtcbiAqIHRoaXMgY29yZSBvd25zIHRoZSByZXBvcnQgYW5kIHRoZSBVTkNPTkRJVElPTkFMIHRlbGVtZXRyeS5cbiAqXG4gKiBDT05UUkFDVDogcmVwb3J0LmtpbmQgKCdjYXVnaHQtdW5ibGluZGVkJyksIHRoZSBzcGFuIG5hbWVcbiAqICgnbW5lbW9uaWNhLmNhdWdodC1leGNlcHRpb24nKSBhbmQgdGhlIFt1bmJsaW5kXSBzdGRvdXQgbWFya2VyIGFyZVxuICogcGlubmVkIGJ5IGRvd25zdHJlYW0gY29uc3VtZXJzIChydW5ib29rcyBncmVwIHRoZSBtYXJrZXI7IGZyYW1ld29ya1xuICogYWRhcHRlcnMgcGluIHRoZSByZXBvcnQgc2hhcGUpLiBLZWVwIHRoZW0gc3RhYmxlLlxuICovXG5pbXBvcnQgeyBnZXRGbG93IH0gZnJvbSAnQG1uZW1vbmljYS9kaXZlJztcbmltcG9ydCB7IHV0aWxzLCBnZXRQcm9wcyB9IGZyb20gJ21uZW1vbmljYSc7XG5pbXBvcnQgeyB0cmFjZSwgU3BhblN0YXR1c0NvZGUgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGknO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVuYmxpbmRSZXBvcnQge1xuXHRraW5kICAgICAgICAgICAgOiBzdHJpbmc7XG5cdG1lc3NhZ2UgICAgICAgICA6IHN0cmluZztcblx0YnJhbmNoICAgICAgICAgIDogc3RyaW5nW107XG5cdGVycm9yZWRUeXBlICAgICA6IHN0cmluZyB8IG51bGw7XG5cdGVycm9yZWRJbnN0YW5jZSA6IHVua25vd247XG5cdGF0dGVtcHRlZEFyZ3MgICA6IHVua25vd247XG59XG5cbi8qKlxuICogZXh0cmFjdCgpIHRoYXQgY2Fubm90IHRocm93IGluc2lkZSBhbiBlcnJvciBwYXRoIOKAlCBub24tbW5lbW9uaWNhXG4gKiB2YWx1ZXMgZGVncmFkZSB0byB0aGVpciBrZXkgbGlzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTYWZlIChpbnN0YW5jZTogb2JqZWN0KTogdW5rbm93biB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gdXRpbHMuZXh0cmFjdChpbnN0YW5jZSk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSBjYXRjaCB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMoaW5zdGFuY2UpO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGUgYXR0ZW1wdGVkIGNvbnN0cnVjdG9yIGFyZ3Mgb2YgYSBGQUlMRUQgbW5lbW9uaWNhIGNvbnN0cnVjdGlvbiByaWRlXG4gKiB0aGUgZXJyb3JlZCBpbnN0YW5jZSBpdHNlbGY6IHRoZSBjYXVnaHQgb2JqZWN0IElTIHRoZSBlcnJvcmVkIHNoZWxsXG4gKiAocHJvYmVkIDIwMjYtMDktMDM6IGNhdWdodCA9PT0gY3JlYXRpb25FcnJvcidzIGluaGVyaXRlZEluc3RhbmNlLFxuICogaW5zdGFuY2VvZiBFcnJvciB2aWEgdGhlIHNwbGljZWQgcHJvdG90eXBlIGNoYWluKSwgYW5kIGNvcmUncyBvd25cbiAqIGdldFByb3BzIGV4cG9zZXMgeyBhcmdzLCBvcmlnaW5hbEVycm9yLCDigKYgfSBvZmYgdGhlIHByb3BzIFdlYWtNYXAuXG4gKiBQbGFpbiBlcnJvcnMgeWllbGQgdW5kZWZpbmVkOyBhbnl0aGluZyB1bmV4cGVjdGVkIGRlZ3JhZGVzLCBuZXZlclxuICogdGhyb3dzIGluc2lkZSBhIGZpbHRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yZWRBcmdzU2FmZSAoZXJyb3I6IEVycm9yKTogdW5rbm93biB7XG5cdHRyeSB7XG5cdFx0Y29uc3QgcHJvcHMgPSBnZXRQcm9wcyhlcnJvcikgYXMgeyBhcmdzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHJlc3VsdCA9IHByb3BzPy5hcmdzO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0gY2F0Y2gge1xuXHRcdGNvbnN0IHJlc3VsdCA9IHVuZGVmaW5lZDtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG5cbi8qKlxuICogSlNPTi5zdHJpbmdpZnkgdGhhdCBjYW5ub3QgdGhyb3cgaW5zaWRlIGFuIGVycm9yIHBhdGgg4oCUIGNpcmN1bGFyIG9yXG4gKiBob3N0aWxlIHZhbHVlcyBkZWdyYWRlIHRvIGEgbWFya2VyIGluc3RlYWQgb2YgY3Jhc2hpbmcgdGhlIGJvdW5kYXJ5XG4gKiAoYSB0aHJvd2luZyBib3VuZGFyeSBpcyBleGFjdGx5IHRoZSBjYXNjYWRlIHRoaXMgZmlnaHRzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeVNhZmUgKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcblx0dHJ5IHtcblx0XHRjb25zdCByZXN1bHQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSBjYXRjaCB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gJ1wiW3Vuc2VyaWFsaXphYmxlIHJlcG9ydCBwYXlsb2FkXVwiJztcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHVuYmxpbmRlZCByZXBvcnQgZm9yIGEgY2F1Z2h0IGZhaWx1cmU6IHRoZSBkaXZlIGJyYW5jaCwgdGhlXG4gKiBlcnJvcmVkIGNvbnN0cnVjdGlvbiBlZGdlLCB0aGUgYXR0ZW1wdGVkIGNvbnN0cnVjdG9yIGFyZ3MsIHRoZSBhY3R1YWxcbiAqIG1lc3NhZ2UuIE5vbi1FcnJvciB0aHJvd3MgYXJlIHJlcG9ydGVkIHRydXRoZnVsbHkgYXMgc3VjaCwgbmV2ZXJcbiAqIGRyZXNzZWQgdXAgYXMgRXJyb3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRVbmJsaW5kUmVwb3J0IChlcnJvcjogdW5rbm93bik6IFVuYmxpbmRSZXBvcnQge1xuXHRjb25zdCBpc0Vycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvcjtcblx0Y29uc3QgbWVzc2FnZSA9IGlzRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogYG5vbi1FcnJvciB0aHJvd24gKCR7dHlwZW9mIGVycm9yfSlgO1xuXHRjb25zdCBmbG93ID0gaXNFcnJvciA/IGdldEZsb3coZXJyb3IgYXMgRXJyb3IpIDogW107XG5cdC8vIFRoZSBlcnJvcmVkIGNyZWF0ZSBlZGdlIGF0dHJpYnV0ZXMgdGhlIGNvbnN0cnVjdGlvbidzIFBBUkVOVFxuXHQvLyBpbnN0YW5jZSAocHJvYmVkIDIwMjYtMDktMDM6IGVkZ2UuaW5zdGFuY2UgPT09IGV4aXN0ZW50SW5zdGFuY2UpLlxuXHQvLyBUaGUgYXR0ZW1wdGVkIGNvbnN0cnVjdG9yIEFSR1MgcmlkZSB0aGUgY2F1Z2h0IGVycm9yIGl0c2VsZiDigJQgaXRcblx0Ly8gSVMgdGhlIGVycm9yZWQgc2hlbGwsIGFuZCBnZXRQcm9wcyBleHBvc2VzIGl0cyBhcmdzIChzZWVcblx0Ly8gZXJyb3JlZEFyZ3NTYWZlIGFib3ZlKS5cblx0Y29uc3QgZXJyb3JlZEVkZ2UgPSBbLi4uZmxvd10ucmV2ZXJzZSgpLmZpbmQoKGVkZ2UpID0+IGVkZ2Uua2luZCA9PT0gJ2NyZWF0ZScgJiYgZWRnZS5zdGF0dXMgPT09ICdlcnJvcicpO1xuXHRjb25zdCBlcnJvcmVkSW5zdGFuY2UgPSBlcnJvcmVkRWRnZT8uaW5zdGFuY2U7XG5cdGNvbnN0IGF0dGVtcHRlZEFyZ3MgPSBpc0Vycm9yID8gZXJyb3JlZEFyZ3NTYWZlKGVycm9yIGFzIEVycm9yKSA6IHVuZGVmaW5lZDtcblx0Y29uc3QgcmVwb3J0OiBVbmJsaW5kUmVwb3J0ID0ge1xuXHRcdGtpbmQgICAgICAgICAgICA6ICdjYXVnaHQtdW5ibGluZGVkJyxcblx0XHRtZXNzYWdlLFxuXHRcdGJyYW5jaCAgICAgICAgICA6IGZsb3cubWFwKChlZGdlKSA9PiBgJHtlZGdlLmtpbmR9OiR7ZWRnZS5uYW1lfWApLFxuXHRcdGVycm9yZWRUeXBlICAgICA6IGVycm9yZWRFZGdlPy5uYW1lID8/IG51bGwsXG5cdFx0ZXJyb3JlZEluc3RhbmNlIDogZXJyb3JlZEluc3RhbmNlID8gZXh0cmFjdFNhZmUoZXJyb3JlZEluc3RhbmNlKSA6IG51bGwsXG5cdFx0YXR0ZW1wdGVkQXJncyAgIDogYXR0ZW1wdGVkQXJncyA/PyBudWxsLFxuXHR9O1xuXHRyZXR1cm4gcmVwb3J0O1xufVxuXG4vKipcbiAqIFRoZSB1bmNvbmRpdGlvbmFsIGhhbGY6IGFuIEVSUk9SIHNwYW4gd2l0aCB0aGUgcmVjb3JkZWQgZXhjZXB0aW9uICsgdGhlXG4gKiBkaXZlIGJyYW5jaCDigJQgaW5zaWRlIHRoZSByZXF1ZXN0J3MgYXN5bmMgY29udGV4dCwgc28gdGhlIEFMUyBjb250ZXh0XG4gKiBtYW5hZ2VyIHBhcmVudHMgaXQgdW5kZXIgdGhlIHJlcXVlc3Qgc3BhbiBvbiBpdHMgb3duIOKAlCBhbmQgdGhlIHN0ZG91dFxuICogbWFya2VyIGxpbmUuIEEgbm9uLUVycm9yIHRocm93IGlzIHJlY29yZGVkIGFzIGFuIGF0dHJpYnV0ZTpcbiAqIHJlY29yZEV4Y2VwdGlvbiBvbiBhIGNpcmN1bGFyIG9iamVjdCBjb3VsZCBicmVhayBleHBvcnRlclxuICogc2VyaWFsaXphdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZFVuYmxpbmRUZWxlbWV0cnkgKHJlcG9ydDogVW5ibGluZFJlcG9ydCwgZXJyb3I6IHVua25vd24pOiB2b2lkIHtcblx0Y29uc3Qgc3BhbiA9IHRyYWNlLmdldFRyYWNlcignQG1uZW1vbmljYS9vdGVsJykuc3RhcnRTcGFuKCdtbmVtb25pY2EuY2F1Z2h0LWV4Y2VwdGlvbicpO1xuXHRzcGFuLnNldEF0dHJpYnV0ZSgnZGl2ZS5icmFuY2gnLCByZXBvcnQuYnJhbmNoLmpvaW4oJyDihpIgJykpO1xuXHRpZiAocmVwb3J0LmVycm9yZWRUeXBlKSB7XG5cdFx0c3Bhbi5zZXRBdHRyaWJ1dGUoJ21uZW1vbmljYS5lcnJvcmVkX3R5cGUnLCByZXBvcnQuZXJyb3JlZFR5cGUpO1xuXHR9XG5cdHNwYW4uc2V0U3RhdHVzKHsgY29kZTogU3BhblN0YXR1c0NvZGUuRVJST1IsIG1lc3NhZ2U6IHJlcG9ydC5tZXNzYWdlIH0pO1xuXHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdHNwYW4ucmVjb3JkRXhjZXB0aW9uKGVycm9yKTtcblx0fSBlbHNlIHtcblx0XHRzcGFuLnNldEF0dHJpYnV0ZSgnZXhjZXB0aW9uLnR5cGUnLCAnbm9uLUVycm9yLXRocm93Jyk7XG5cdH1cblx0c3Bhbi5lbmQoKTtcblxuXHQvLyBUaGUgW3VuYmxpbmRdIHByZWZpeCBpcyBhIGRvd25zdHJlYW0gY29udHJhY3Qg4oCUIHJ1bmJvb2tzIGdyZXAgZm9yXG5cdC8vIGV4YWN0bHkgdGhpcyBtYXJrZXIuXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG5cdGNvbnNvbGUubG9nKGBbdW5ibGluZF0gJHtzdHJpbmdpZnlTYWZlKHJlcG9ydCl9YCk7XG59XG4iXX0=
@@ -0,0 +1,24 @@
1
+ import type { FlowEdge } from '@mnemonica/dive';
2
+ /**
3
+ * JSON-safe shape of a trace edge: the FlowEdge without the live instance
4
+ * reference (mnemonica instances don't survive serialization), duration
5
+ * normalized to null while unsettled.
6
+ */
7
+ export interface FormattedFlowEdge {
8
+ name: string;
9
+ kind: FlowEdge['kind'];
10
+ status: FlowEdge['status'];
11
+ duration: number | null;
12
+ }
13
+ /**
14
+ * Canonical edge → plain-JSON shaping for reports, filters and logs.
15
+ * Same target semantics as getFlow: Error | instance | current cursor.
16
+ */
17
+ export declare function formatFlow(target?: unknown): FormattedFlowEdge[];
18
+ /**
19
+ * The "who failed" fallback: the instance pinned to the error at its
20
+ * deepest wrapped boundary, or the current ambient context when the error
21
+ * never crossed one.
22
+ */
23
+ export declare function errorContext(error: Error): object | undefined;
24
+ //# sourceMappingURL=dive-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dive-flow.d.ts","sourceRoot":"","sources":["../../src/utils/dive-flow.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAO,MAAM,CAAC;IAClB,IAAI,EAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,EAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9B,QAAQ,EAAG,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAE,MAAM,CAAC,EAAE,OAAO,GAAG,iBAAiB,EAAE,CAWjE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAE,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAI9D"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Read-side helpers over @mnemonica/dive's trace — the two idioms error
3
+ * boundaries kept re-deriving by hand (four formatter copies and two
4
+ * fallback copies in finecut before these existed).
5
+ */
6
+ import { getFlow, getErrorInstance, current } from '@mnemonica/dive';
7
+ /**
8
+ * Canonical edge → plain-JSON shaping for reports, filters and logs.
9
+ * Same target semantics as getFlow: Error | instance | current cursor.
10
+ */
11
+ export function formatFlow(target) {
12
+ const result = getFlow(target).map((edge) => {
13
+ const formatted = {
14
+ name: edge.name,
15
+ kind: edge.kind,
16
+ status: edge.status,
17
+ duration: edge.duration ?? null,
18
+ };
19
+ return formatted;
20
+ });
21
+ return result;
22
+ }
23
+ /**
24
+ * The "who failed" fallback: the instance pinned to the error at its
25
+ * deepest wrapped boundary, or the current ambient context when the error
26
+ * never crossed one.
27
+ */
28
+ export function errorContext(error) {
29
+ const pinned = getErrorInstance(error);
30
+ const result = pinned ?? current();
31
+ return result;
32
+ }
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl2ZS1mbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2RpdmUtZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQWVyRTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFFLE1BQWdCO0lBQzNDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUMzQyxNQUFNLFNBQVMsR0FBc0I7WUFDcEMsSUFBSSxFQUFPLElBQUksQ0FBQyxJQUFJO1lBQ3BCLElBQUksRUFBTyxJQUFJLENBQUMsSUFBSTtZQUNwQixNQUFNLEVBQUssSUFBSSxDQUFDLE1BQU07WUFDdEIsUUFBUSxFQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSTtTQUNoQyxDQUFDO1FBQ0YsT0FBTyxTQUFTLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQztBQUNmLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBRSxLQUFZO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUNuQyxPQUFPLE1BQU0sQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlYWQtc2lkZSBoZWxwZXJzIG92ZXIgQG1uZW1vbmljYS9kaXZlJ3MgdHJhY2Ug4oCUIHRoZSB0d28gaWRpb21zIGVycm9yXG4gKiBib3VuZGFyaWVzIGtlcHQgcmUtZGVyaXZpbmcgYnkgaGFuZCAoZm91ciBmb3JtYXR0ZXIgY29waWVzIGFuZCB0d29cbiAqIGZhbGxiYWNrIGNvcGllcyBpbiBmaW5lY3V0IGJlZm9yZSB0aGVzZSBleGlzdGVkKS5cbiAqL1xuaW1wb3J0IHsgZ2V0RmxvdywgZ2V0RXJyb3JJbnN0YW5jZSwgY3VycmVudCB9IGZyb20gJ0BtbmVtb25pY2EvZGl2ZSc7XG5pbXBvcnQgdHlwZSB7IEZsb3dFZGdlIH0gZnJvbSAnQG1uZW1vbmljYS9kaXZlJztcblxuLyoqXG4gKiBKU09OLXNhZmUgc2hhcGUgb2YgYSB0cmFjZSBlZGdlOiB0aGUgRmxvd0VkZ2Ugd2l0aG91dCB0aGUgbGl2ZSBpbnN0YW5jZVxuICogcmVmZXJlbmNlIChtbmVtb25pY2EgaW5zdGFuY2VzIGRvbid0IHN1cnZpdmUgc2VyaWFsaXphdGlvbiksIGR1cmF0aW9uXG4gKiBub3JtYWxpemVkIHRvIG51bGwgd2hpbGUgdW5zZXR0bGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZEZsb3dFZGdlIHtcblx0bmFtZSAgICAgOiBzdHJpbmc7XG5cdGtpbmQgICAgIDogRmxvd0VkZ2VbJ2tpbmQnXTtcblx0c3RhdHVzICAgOiBGbG93RWRnZVsnc3RhdHVzJ107XG5cdGR1cmF0aW9uIDogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBDYW5vbmljYWwgZWRnZSDihpIgcGxhaW4tSlNPTiBzaGFwaW5nIGZvciByZXBvcnRzLCBmaWx0ZXJzIGFuZCBsb2dzLlxuICogU2FtZSB0YXJnZXQgc2VtYW50aWNzIGFzIGdldEZsb3c6IEVycm9yIHwgaW5zdGFuY2UgfCBjdXJyZW50IGN1cnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZsb3cgKHRhcmdldD86IHVua25vd24pOiBGb3JtYXR0ZWRGbG93RWRnZVtdIHtcblx0Y29uc3QgcmVzdWx0ID0gZ2V0Rmxvdyh0YXJnZXQpLm1hcCgoZWRnZSkgPT4ge1xuXHRcdGNvbnN0IGZvcm1hdHRlZDogRm9ybWF0dGVkRmxvd0VkZ2UgPSB7XG5cdFx0XHRuYW1lICAgICA6IGVkZ2UubmFtZSxcblx0XHRcdGtpbmQgICAgIDogZWRnZS5raW5kLFxuXHRcdFx0c3RhdHVzICAgOiBlZGdlLnN0YXR1cyxcblx0XHRcdGR1cmF0aW9uIDogZWRnZS5kdXJhdGlvbiA/PyBudWxsLFxuXHRcdH07XG5cdFx0cmV0dXJuIGZvcm1hdHRlZDtcblx0fSk7XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVGhlIFwid2hvIGZhaWxlZFwiIGZhbGxiYWNrOiB0aGUgaW5zdGFuY2UgcGlubmVkIHRvIHRoZSBlcnJvciBhdCBpdHNcbiAqIGRlZXBlc3Qgd3JhcHBlZCBib3VuZGFyeSwgb3IgdGhlIGN1cnJlbnQgYW1iaWVudCBjb250ZXh0IHdoZW4gdGhlIGVycm9yXG4gKiBuZXZlciBjcm9zc2VkIG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yQ29udGV4dCAoZXJyb3I6IEVycm9yKTogb2JqZWN0IHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgcGlubmVkID0gZ2V0RXJyb3JJbnN0YW5jZShlcnJvcik7XG5cdGNvbnN0IHJlc3VsdCA9IHBpbm5lZCA/PyBjdXJyZW50KCk7XG5cdHJldHVybiByZXN1bHQ7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export declare function isMnemonicaInstance(value: unknown): value is Record<string, unknown>;
2
+ //# sourceMappingURL=is-mnemonica-instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-mnemonica-instance.d.ts","sourceRoot":"","sources":["../../src/utils/is-mnemonica-instance.ts"],"names":[],"mappings":"AAMA,wBAAgB,mBAAmB,CAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAErF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Runtime type guard for mnemonica instances.
3
+ * Uses mnemonica's getProps() — no instanceof hacks, works across realms.
4
+ */
5
+ import { getProps } from 'mnemonica/module';
6
+ export function isMnemonicaInstance(value) {
7
+ return value != null && typeof value === 'object' && getProps(value) !== undefined;
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtbW5lbW9uaWNhLWluc3RhbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2lzLW1uZW1vbmljYS1pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsTUFBTSxVQUFVLG1CQUFtQixDQUFFLEtBQWM7SUFDbEQsT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQ3BGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJ1bnRpbWUgdHlwZSBndWFyZCBmb3IgbW5lbW9uaWNhIGluc3RhbmNlcy5cbiAqIFVzZXMgbW5lbW9uaWNhJ3MgZ2V0UHJvcHMoKSDigJQgbm8gaW5zdGFuY2VvZiBoYWNrcywgd29ya3MgYWNyb3NzIHJlYWxtcy5cbiAqL1xuaW1wb3J0IHsgZ2V0UHJvcHMgfSBmcm9tICdtbmVtb25pY2EvbW9kdWxlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW5lbW9uaWNhSW5zdGFuY2UgKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRyZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIGdldFByb3BzKHZhbHVlKSAhPT0gdW5kZWZpbmVkO1xufVxuIl19
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.attachHooks = attachHooks;
4
+ /**
5
+ * attachHooks — the mnemonica lifecycle wiring for @mnemonica/dive.
6
+ *
7
+ * This lived inside dive itself until dive became engine-only: dive imports
8
+ * nothing but node:crypto and exposes primitives (wrap, recordCreation, …);
9
+ * the knowledge of mnemonica's hook contract — hook names, hooksOpts fields,
10
+ * and what a ROOT construction is — belongs here at adapter level.
11
+ *
12
+ * preCreation → enter the parent (existentInstance) context BEFORE the
13
+ * constructor runs, and wrap any function arguments so
14
+ * callbacks handed to the constructor carry that context.
15
+ * postCreation → record the instance's 'create' edge via recordCreation,
16
+ * then wrap the instance's methods.
17
+ * creationError→ record a failed 'create' edge (status: 'error') under the
18
+ * surviving parent and pin the error to it: the failure is
19
+ * recoverable off the error object itself.
20
+ */
21
+ const dive_1 = require("@mnemonica/dive");
22
+ function attachHooks(collection) {
23
+ collection.registerHook('preCreation', (hookData) => {
24
+ const parent = hookData.existentInstance;
25
+ if (parent) {
26
+ (0, dive_1.enterContext)(parent);
27
+ }
28
+ const args = hookData.args;
29
+ if (Array.isArray(args)) {
30
+ for (let i = 0; i < args.length; i++) {
31
+ const arg = args[i];
32
+ if (typeof arg === 'function' && !(0, dive_1.isWrappedFunction)(arg)) {
33
+ args[i] = (0, dive_1.wrapConstructorArg)(arg, parent);
34
+ }
35
+ }
36
+ }
37
+ });
38
+ collection.registerHook('postCreation', (hookData) => {
39
+ const instance = hookData.inheritedInstance;
40
+ if (!instance) {
41
+ return;
42
+ }
43
+ if (Array.isArray(hookData.args)) {
44
+ for (const arg of hookData.args) {
45
+ (0, dive_1.upgradeConstructorArg)(arg, instance);
46
+ }
47
+ }
48
+ (0, dive_1.recordCreation)(hookData.TypeName || 'anonymous', instance, hookData.existentInstance);
49
+ (0, dive_1.wrapInstanceMethods)(instance);
50
+ });
51
+ collection.registerHook('creationError', (hookData) => {
52
+ (0, dive_1.recordCreationError)(hookData.TypeName || 'anonymous', hookData.inheritedInstance, hookData.existentInstance);
53
+ });
54
+ }
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNoLWhvb2tzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzL2F0dGFjaC1ob29rcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTRCQSxrQ0FzQ0M7QUFsRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCwwQ0FReUI7QUFHekIsU0FBZ0IsV0FBVyxDQUFFLFVBQTJCO0lBQ3ZELFVBQVUsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDbkQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1FBQ3pDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWixJQUFBLG1CQUFZLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDM0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixJQUFJLE9BQU8sR0FBRyxLQUFLLFVBQVUsSUFBSSxDQUFDLElBQUEsd0JBQWlCLEVBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUEseUJBQWtCLEVBQUMsR0FBbUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDM0UsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDO0lBQ0YsQ0FBQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQ3BELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztRQUM1QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDZixPQUFPO1FBQ1IsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxLQUFLLE1BQU0sR0FBRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDakMsSUFBQSw0QkFBcUIsRUFBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNGLENBQUM7UUFDRCxJQUFBLHFCQUFjLEVBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RGLElBQUEsMEJBQW1CLEVBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQ3JELElBQUEsMEJBQW1CLEVBQ2xCLFFBQVEsQ0FBQyxRQUFRLElBQUksV0FBVyxFQUNoQyxRQUFRLENBQUMsaUJBQWlCLEVBQzFCLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FDekIsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0YWNoSG9va3Mg4oCUIHRoZSBtbmVtb25pY2EgbGlmZWN5Y2xlIHdpcmluZyBmb3IgQG1uZW1vbmljYS9kaXZlLlxuICpcbiAqIFRoaXMgbGl2ZWQgaW5zaWRlIGRpdmUgaXRzZWxmIHVudGlsIGRpdmUgYmVjYW1lIGVuZ2luZS1vbmx5OiBkaXZlIGltcG9ydHNcbiAqIG5vdGhpbmcgYnV0IG5vZGU6Y3J5cHRvIGFuZCBleHBvc2VzIHByaW1pdGl2ZXMgKHdyYXAsIHJlY29yZENyZWF0aW9uLCDigKYpO1xuICogdGhlIGtub3dsZWRnZSBvZiBtbmVtb25pY2EncyBob29rIGNvbnRyYWN0IOKAlCBob29rIG5hbWVzLCBob29rc09wdHMgZmllbGRzLFxuICogYW5kIHdoYXQgYSBST09UIGNvbnN0cnVjdGlvbiBpcyDigJQgYmVsb25ncyBoZXJlIGF0IGFkYXB0ZXIgbGV2ZWwuXG4gKlxuICogcHJlQ3JlYXRpb24gIOKGkiBlbnRlciB0aGUgcGFyZW50IChleGlzdGVudEluc3RhbmNlKSBjb250ZXh0IEJFRk9SRSB0aGVcbiAqICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yIHJ1bnMsIGFuZCB3cmFwIGFueSBmdW5jdGlvbiBhcmd1bWVudHMgc29cbiAqICAgICAgICAgICAgICAgIGNhbGxiYWNrcyBoYW5kZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGNhcnJ5IHRoYXQgY29udGV4dC5cbiAqIHBvc3RDcmVhdGlvbiDihpIgcmVjb3JkIHRoZSBpbnN0YW5jZSdzICdjcmVhdGUnIGVkZ2UgdmlhIHJlY29yZENyZWF0aW9uLFxuICogICAgICAgICAgICAgICAgdGhlbiB3cmFwIHRoZSBpbnN0YW5jZSdzIG1ldGhvZHMuXG4gKiBjcmVhdGlvbkVycm9y4oaSIHJlY29yZCBhIGZhaWxlZCAnY3JlYXRlJyBlZGdlIChzdGF0dXM6ICdlcnJvcicpIHVuZGVyIHRoZVxuICogICAgICAgICAgICAgICAgc3Vydml2aW5nIHBhcmVudCBhbmQgcGluIHRoZSBlcnJvciB0byBpdDogdGhlIGZhaWx1cmUgaXNcbiAqICAgICAgICAgICAgICAgIHJlY292ZXJhYmxlIG9mZiB0aGUgZXJyb3Igb2JqZWN0IGl0c2VsZi5cbiAqL1xuaW1wb3J0IHtcblx0ZW50ZXJDb250ZXh0LFxuXHR3cmFwQ29uc3RydWN0b3JBcmcsXG5cdHVwZ3JhZGVDb25zdHJ1Y3RvckFyZyxcblx0d3JhcEluc3RhbmNlTWV0aG9kcyxcblx0cmVjb3JkQ3JlYXRpb24sXG5cdHJlY29yZENyZWF0aW9uRXJyb3IsXG5cdGlzV3JhcHBlZEZ1bmN0aW9uLFxufSBmcm9tICdAbW5lbW9uaWNhL2RpdmUnO1xuaW1wb3J0IHR5cGUgeyBUeXBlc0NvbGxlY3Rpb24gfSBmcm9tICdtbmVtb25pY2EvbW9kdWxlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaEhvb2tzIChjb2xsZWN0aW9uOiBUeXBlc0NvbGxlY3Rpb24pOiB2b2lkIHtcblx0Y29sbGVjdGlvbi5yZWdpc3Rlckhvb2soJ3ByZUNyZWF0aW9uJywgKGhvb2tEYXRhKSA9PiB7XG5cdFx0Y29uc3QgcGFyZW50ID0gaG9va0RhdGEuZXhpc3RlbnRJbnN0YW5jZTtcblx0XHRpZiAocGFyZW50KSB7XG5cdFx0XHRlbnRlckNvbnRleHQocGFyZW50KTtcblx0XHR9XG5cdFx0Y29uc3QgYXJncyA9IGhvb2tEYXRhLmFyZ3M7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoYXJncykpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBhcmcgPSBhcmdzW2ldO1xuXHRcdFx0XHRpZiAodHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNXcmFwcGVkRnVuY3Rpb24oYXJnKSkge1xuXHRcdFx0XHRcdGFyZ3NbaV0gPSB3cmFwQ29uc3RydWN0b3JBcmcoYXJnIGFzICguLi5hOiB1bmtub3duW10pID0+IHVua25vd24sIHBhcmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdGNvbGxlY3Rpb24ucmVnaXN0ZXJIb29rKCdwb3N0Q3JlYXRpb24nLCAoaG9va0RhdGEpID0+IHtcblx0XHRjb25zdCBpbnN0YW5jZSA9IGhvb2tEYXRhLmluaGVyaXRlZEluc3RhbmNlO1xuXHRcdGlmICghaW5zdGFuY2UpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkoaG9va0RhdGEuYXJncykpIHtcblx0XHRcdGZvciAoY29uc3QgYXJnIG9mIGhvb2tEYXRhLmFyZ3MpIHtcblx0XHRcdFx0dXBncmFkZUNvbnN0cnVjdG9yQXJnKGFyZywgaW5zdGFuY2UpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZWNvcmRDcmVhdGlvbihob29rRGF0YS5UeXBlTmFtZSB8fCAnYW5vbnltb3VzJywgaW5zdGFuY2UsIGhvb2tEYXRhLmV4aXN0ZW50SW5zdGFuY2UpO1xuXHRcdHdyYXBJbnN0YW5jZU1ldGhvZHMoaW5zdGFuY2UpO1xuXHR9KTtcblxuXHRjb2xsZWN0aW9uLnJlZ2lzdGVySG9vaygnY3JlYXRpb25FcnJvcicsIChob29rRGF0YSkgPT4ge1xuXHRcdHJlY29yZENyZWF0aW9uRXJyb3IoXG5cdFx0XHRob29rRGF0YS5UeXBlTmFtZSB8fCAnYW5vbnltb3VzJyxcblx0XHRcdGhvb2tEYXRhLmluaGVyaXRlZEluc3RhbmNlLFxuXHRcdFx0aG9va0RhdGEuZXhpc3RlbnRJbnN0YW5jZVxuXHRcdCk7XG5cdH0pO1xufVxuIl19
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * @mnemonica/otel — the framework-free Node.js core of the mnemonica
4
+ * observability stack.
5
+ *
6
+ * Everything here works in ANY Node.js runtime (Express, Fastify, raw
7
+ * http, queue consumers, CLI); framework wiring lives in dedicated
8
+ * adapter packages built on these primitives.
9
+ *
10
+ * Provides:
11
+ * - attachHooks() — mnemonica lifecycle → dive edge wiring
12
+ * - MnemonicaOtelProvider — OTel spans for constructions
13
+ * - DiveOtelProvider — OTel spans for every dive-wrapped call
14
+ * - AsyncFlowProvider — ALS backbone attributing unwrapped async hops
15
+ * - runInRequestScope() — one request span + triple async scope
16
+ * - feedPreRoot()/feedValidatedPreRoot()/getPreRoot() — thunderstruck
17
+ * pre-root forensics store (identity-correlated, request-lifetime)
18
+ * - feedPreRootFromRequest() — boundary helper over any HTTP request
19
+ * - buildUnblindReport()/recordUnblindTelemetry() — the Unblinder core
20
+ * - isMnemonicaInstance() — realm-safe type guard
21
+ * - formatFlow()/errorContext() — read-side helpers over dive's trace
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.errorContext = exports.formatFlow = exports.isMnemonicaInstance = exports.stringifySafe = exports.erroredArgsSafe = exports.extractSafe = exports.recordUnblindTelemetry = exports.buildUnblindReport = exports.feedPreRootFromRequest = exports.getPreRoot = exports.feedValidatedPreRoot = exports.feedPreRoot = exports.runInRequestScope = exports.AsyncFlowProvider = exports.DiveOtelProvider = exports.MnemonicaOtelProvider = exports.attachHooks = void 0;
25
+ var attach_hooks_js_1 = require("./hooks/attach-hooks.js");
26
+ Object.defineProperty(exports, "attachHooks", { enumerable: true, get: function () { return attach_hooks_js_1.attachHooks; } });
27
+ var mnemonica_otel_provider_js_1 = require("./providers/mnemonica-otel.provider.js");
28
+ Object.defineProperty(exports, "MnemonicaOtelProvider", { enumerable: true, get: function () { return mnemonica_otel_provider_js_1.MnemonicaOtelProvider; } });
29
+ var dive_otel_provider_js_1 = require("./providers/dive-otel.provider.js");
30
+ Object.defineProperty(exports, "DiveOtelProvider", { enumerable: true, get: function () { return dive_otel_provider_js_1.DiveOtelProvider; } });
31
+ var async_flow_provider_js_1 = require("./providers/async-flow.provider.js");
32
+ Object.defineProperty(exports, "AsyncFlowProvider", { enumerable: true, get: function () { return async_flow_provider_js_1.AsyncFlowProvider; } });
33
+ var request_scope_js_1 = require("./request-scope.js");
34
+ Object.defineProperty(exports, "runInRequestScope", { enumerable: true, get: function () { return request_scope_js_1.runInRequestScope; } });
35
+ var pre_root_js_1 = require("./thunderstruck/pre-root.js");
36
+ Object.defineProperty(exports, "feedPreRoot", { enumerable: true, get: function () { return pre_root_js_1.feedPreRoot; } });
37
+ Object.defineProperty(exports, "feedValidatedPreRoot", { enumerable: true, get: function () { return pre_root_js_1.feedValidatedPreRoot; } });
38
+ Object.defineProperty(exports, "getPreRoot", { enumerable: true, get: function () { return pre_root_js_1.getPreRoot; } });
39
+ var feed_from_request_js_1 = require("./thunderstruck/feed-from-request.js");
40
+ Object.defineProperty(exports, "feedPreRootFromRequest", { enumerable: true, get: function () { return feed_from_request_js_1.feedPreRootFromRequest; } });
41
+ var unblind_js_1 = require("./unblind.js");
42
+ Object.defineProperty(exports, "buildUnblindReport", { enumerable: true, get: function () { return unblind_js_1.buildUnblindReport; } });
43
+ Object.defineProperty(exports, "recordUnblindTelemetry", { enumerable: true, get: function () { return unblind_js_1.recordUnblindTelemetry; } });
44
+ Object.defineProperty(exports, "extractSafe", { enumerable: true, get: function () { return unblind_js_1.extractSafe; } });
45
+ Object.defineProperty(exports, "erroredArgsSafe", { enumerable: true, get: function () { return unblind_js_1.erroredArgsSafe; } });
46
+ Object.defineProperty(exports, "stringifySafe", { enumerable: true, get: function () { return unblind_js_1.stringifySafe; } });
47
+ var is_mnemonica_instance_js_1 = require("./utils/is-mnemonica-instance.js");
48
+ Object.defineProperty(exports, "isMnemonicaInstance", { enumerable: true, get: function () { return is_mnemonica_instance_js_1.isMnemonicaInstance; } });
49
+ var dive_flow_js_1 = require("./utils/dive-flow.js");
50
+ Object.defineProperty(exports, "formatFlow", { enumerable: true, get: function () { return dive_flow_js_1.formatFlow; } });
51
+ Object.defineProperty(exports, "errorContext", { enumerable: true, get: function () { return dive_flow_js_1.errorContext; } });
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7O0FBRUgsMkRBQXNEO0FBQTdDLDhHQUFBLFdBQVcsT0FBQTtBQUNwQixxRkFBK0U7QUFBdEUsbUlBQUEscUJBQXFCLE9BQUE7QUFDOUIsMkVBQXFFO0FBQTVELHlIQUFBLGdCQUFnQixPQUFBO0FBQ3pCLDZFQUEwRztBQUFqRywySEFBQSxpQkFBaUIsT0FBQTtBQUMxQix1REFBMkg7QUFBbEgscUhBQUEsaUJBQWlCLE9BQUE7QUFDMUIsMkRBT3FDO0FBTnBDLDBHQUFBLFdBQVcsT0FBQTtBQUNYLG1IQUFBLG9CQUFvQixPQUFBO0FBQ3BCLHlHQUFBLFVBQVUsT0FBQTtBQUtYLDZFQUF5SDtBQUFoSCw4SEFBQSxzQkFBc0IsT0FBQTtBQUMvQiwyQ0FPc0I7QUFOckIsZ0hBQUEsa0JBQWtCLE9BQUE7QUFDbEIsb0hBQUEsc0JBQXNCLE9BQUE7QUFDdEIseUdBQUEsV0FBVyxPQUFBO0FBQ1gsNkdBQUEsZUFBZSxPQUFBO0FBQ2YsMkdBQUEsYUFBYSxPQUFBO0FBR2QsNkVBQXVFO0FBQTlELCtIQUFBLG1CQUFtQixPQUFBO0FBQzVCLHFEQUF3RjtBQUEvRSwwR0FBQSxVQUFVLE9BQUE7QUFBRSw0R0FBQSxZQUFZLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtbmVtb25pY2Evb3RlbCDigJQgdGhlIGZyYW1ld29yay1mcmVlIE5vZGUuanMgY29yZSBvZiB0aGUgbW5lbW9uaWNhXG4gKiBvYnNlcnZhYmlsaXR5IHN0YWNrLlxuICpcbiAqIEV2ZXJ5dGhpbmcgaGVyZSB3b3JrcyBpbiBBTlkgTm9kZS5qcyBydW50aW1lIChFeHByZXNzLCBGYXN0aWZ5LCByYXdcbiAqIGh0dHAsIHF1ZXVlIGNvbnN1bWVycywgQ0xJKTsgZnJhbWV3b3JrIHdpcmluZyBsaXZlcyBpbiBkZWRpY2F0ZWRcbiAqIGFkYXB0ZXIgcGFja2FnZXMgYnVpbHQgb24gdGhlc2UgcHJpbWl0aXZlcy5cbiAqXG4gKiBQcm92aWRlczpcbiAqICAgLSBhdHRhY2hIb29rcygpIOKAlCBtbmVtb25pY2EgbGlmZWN5Y2xlIOKGkiBkaXZlIGVkZ2Ugd2lyaW5nXG4gKiAgIC0gTW5lbW9uaWNhT3RlbFByb3ZpZGVyIOKAlCBPVGVsIHNwYW5zIGZvciBjb25zdHJ1Y3Rpb25zXG4gKiAgIC0gRGl2ZU90ZWxQcm92aWRlciDigJQgT1RlbCBzcGFucyBmb3IgZXZlcnkgZGl2ZS13cmFwcGVkIGNhbGxcbiAqICAgLSBBc3luY0Zsb3dQcm92aWRlciDigJQgQUxTIGJhY2tib25lIGF0dHJpYnV0aW5nIHVud3JhcHBlZCBhc3luYyBob3BzXG4gKiAgIC0gcnVuSW5SZXF1ZXN0U2NvcGUoKSDigJQgb25lIHJlcXVlc3Qgc3BhbiArIHRyaXBsZSBhc3luYyBzY29wZVxuICogICAtIGZlZWRQcmVSb290KCkvZmVlZFZhbGlkYXRlZFByZVJvb3QoKS9nZXRQcmVSb290KCkg4oCUIHRodW5kZXJzdHJ1Y2tcbiAqICAgICBwcmUtcm9vdCBmb3JlbnNpY3Mgc3RvcmUgKGlkZW50aXR5LWNvcnJlbGF0ZWQsIHJlcXVlc3QtbGlmZXRpbWUpXG4gKiAgIC0gZmVlZFByZVJvb3RGcm9tUmVxdWVzdCgpIOKAlCBib3VuZGFyeSBoZWxwZXIgb3ZlciBhbnkgSFRUUCByZXF1ZXN0XG4gKiAgIC0gYnVpbGRVbmJsaW5kUmVwb3J0KCkvcmVjb3JkVW5ibGluZFRlbGVtZXRyeSgpIOKAlCB0aGUgVW5ibGluZGVyIGNvcmVcbiAqICAgLSBpc01uZW1vbmljYUluc3RhbmNlKCkg4oCUIHJlYWxtLXNhZmUgdHlwZSBndWFyZFxuICogICAtIGZvcm1hdEZsb3coKS9lcnJvckNvbnRleHQoKSDigJQgcmVhZC1zaWRlIGhlbHBlcnMgb3ZlciBkaXZlJ3MgdHJhY2VcbiAqL1xuXG5leHBvcnQgeyBhdHRhY2hIb29rcyB9IGZyb20gJy4vaG9va3MvYXR0YWNoLWhvb2tzLmpzJztcbmV4cG9ydCB7IE1uZW1vbmljYU90ZWxQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXJzL21uZW1vbmljYS1vdGVsLnByb3ZpZGVyLmpzJztcbmV4cG9ydCB7IERpdmVPdGVsUHJvdmlkZXIgfSBmcm9tICcuL3Byb3ZpZGVycy9kaXZlLW90ZWwucHJvdmlkZXIuanMnO1xuZXhwb3J0IHsgQXN5bmNGbG93UHJvdmlkZXIsIHR5cGUgRmxvd0ZyYW1lLCB0eXBlIENyYXNoQ29udGV4dCB9IGZyb20gJy4vcHJvdmlkZXJzL2FzeW5jLWZsb3cucHJvdmlkZXIuanMnO1xuZXhwb3J0IHsgcnVuSW5SZXF1ZXN0U2NvcGUsIHR5cGUgSHR0cFJlcXVlc3RMaWtlLCB0eXBlIEh0dHBSZXNwb25zZUxpa2UsIHR5cGUgUmVxdWVzdFNjb3BlRGVwcyB9IGZyb20gJy4vcmVxdWVzdC1zY29wZS5qcyc7XG5leHBvcnQge1xuXHRmZWVkUHJlUm9vdCxcblx0ZmVlZFZhbGlkYXRlZFByZVJvb3QsXG5cdGdldFByZVJvb3QsXG5cdHR5cGUgUmF3UHJlUm9vdFBheWxvYWQsXG5cdHR5cGUgUHJlUm9vdFJlY29yZCxcblx0dHlwZSBQcmVSb290RGF0YSxcbn0gZnJvbSAnLi90aHVuZGVyc3RydWNrL3ByZS1yb290LmpzJztcbmV4cG9ydCB7IGZlZWRQcmVSb290RnJvbVJlcXVlc3QsIHR5cGUgUmVxdWVzdExpa2UsIHR5cGUgRmVlZFByZVJvb3RPcHRpb25zIH0gZnJvbSAnLi90aHVuZGVyc3RydWNrL2ZlZWQtZnJvbS1yZXF1ZXN0LmpzJztcbmV4cG9ydCB7XG5cdGJ1aWxkVW5ibGluZFJlcG9ydCxcblx0cmVjb3JkVW5ibGluZFRlbGVtZXRyeSxcblx0ZXh0cmFjdFNhZmUsXG5cdGVycm9yZWRBcmdzU2FmZSxcblx0c3RyaW5naWZ5U2FmZSxcblx0dHlwZSBVbmJsaW5kUmVwb3J0LFxufSBmcm9tICcuL3VuYmxpbmQuanMnO1xuZXhwb3J0IHsgaXNNbmVtb25pY2FJbnN0YW5jZSB9IGZyb20gJy4vdXRpbHMvaXMtbW5lbW9uaWNhLWluc3RhbmNlLmpzJztcbmV4cG9ydCB7IGZvcm1hdEZsb3csIGVycm9yQ29udGV4dCwgdHlwZSBGb3JtYXR0ZWRGbG93RWRnZSB9IGZyb20gJy4vdXRpbHMvZGl2ZS1mbG93LmpzJztcbiJdfQ==
@@ -0,0 +1 @@
1
+ {"type":"commonjs"}