@pristine-ts/observability 2.0.16

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 (179) hide show
  1. package/LICENSE +201 -0
  2. package/dist/lib/cjs/interfaces/interfaces.js +19 -0
  3. package/dist/lib/cjs/interfaces/interfaces.js.map +1 -0
  4. package/dist/lib/cjs/interfaces/serialized-span.interface.js +3 -0
  5. package/dist/lib/cjs/interfaces/serialized-span.interface.js.map +1 -0
  6. package/dist/lib/cjs/interfaces/serialized-trace.interface.js +3 -0
  7. package/dist/lib/cjs/interfaces/serialized-trace.interface.js.map +1 -0
  8. package/dist/lib/cjs/loggers/loggers.js +18 -0
  9. package/dist/lib/cjs/loggers/loggers.js.map +1 -0
  10. package/dist/lib/cjs/loggers/observability.logger.js +73 -0
  11. package/dist/lib/cjs/loggers/observability.logger.js.map +1 -0
  12. package/dist/lib/cjs/models/models.js +18 -0
  13. package/dist/lib/cjs/models/models.js.map +1 -0
  14. package/dist/lib/cjs/models/request-summary.model.js +19 -0
  15. package/dist/lib/cjs/models/request-summary.model.js.map +1 -0
  16. package/dist/lib/cjs/models/run-metadata.model.js +18 -0
  17. package/dist/lib/cjs/models/run-metadata.model.js.map +1 -0
  18. package/dist/lib/cjs/observability-configuration.js +49 -0
  19. package/dist/lib/cjs/observability-configuration.js.map +1 -0
  20. package/dist/lib/cjs/observability.configuration-keys.js +21 -0
  21. package/dist/lib/cjs/observability.configuration-keys.js.map +1 -0
  22. package/dist/lib/cjs/observability.module.js +98 -0
  23. package/dist/lib/cjs/observability.module.js.map +1 -0
  24. package/dist/lib/cjs/observability.module.keyname.js +5 -0
  25. package/dist/lib/cjs/observability.module.keyname.js.map +1 -0
  26. package/dist/lib/cjs/paths/observability-paths.js +78 -0
  27. package/dist/lib/cjs/paths/observability-paths.js.map +1 -0
  28. package/dist/lib/cjs/paths/paths.js +18 -0
  29. package/dist/lib/cjs/paths/paths.js.map +1 -0
  30. package/dist/lib/cjs/serializers/serialized-span.interface.js +3 -0
  31. package/dist/lib/cjs/serializers/serialized-span.interface.js.map +1 -0
  32. package/dist/lib/cjs/serializers/serialized-trace.interface.js +3 -0
  33. package/dist/lib/cjs/serializers/serialized-trace.interface.js.map +1 -0
  34. package/dist/lib/cjs/serializers/serializers.js +19 -0
  35. package/dist/lib/cjs/serializers/serializers.js.map +1 -0
  36. package/dist/lib/cjs/serializers/span-deserializer.js +26 -0
  37. package/dist/lib/cjs/serializers/span-deserializer.js.map +1 -0
  38. package/dist/lib/cjs/serializers/trace-deserializer.js +24 -0
  39. package/dist/lib/cjs/serializers/trace-deserializer.js.map +1 -0
  40. package/dist/lib/cjs/store/log-store.js +249 -0
  41. package/dist/lib/cjs/store/log-store.js.map +1 -0
  42. package/dist/lib/cjs/store/log-tailer.js +110 -0
  43. package/dist/lib/cjs/store/log-tailer.js.map +1 -0
  44. package/dist/lib/cjs/store/observability-paths.js +78 -0
  45. package/dist/lib/cjs/store/observability-paths.js.map +1 -0
  46. package/dist/lib/cjs/store/observability-run-manager.js +346 -0
  47. package/dist/lib/cjs/store/observability-run-manager.js.map +1 -0
  48. package/dist/lib/cjs/store/observability-store-reader.js +174 -0
  49. package/dist/lib/cjs/store/observability-store-reader.js.map +1 -0
  50. package/dist/lib/cjs/store/serializers/serialized-span.interface.js +3 -0
  51. package/dist/lib/cjs/store/serializers/serialized-span.interface.js.map +1 -0
  52. package/dist/lib/cjs/store/serializers/serialized-trace.interface.js +3 -0
  53. package/dist/lib/cjs/store/serializers/serialized-trace.interface.js.map +1 -0
  54. package/dist/lib/cjs/store/serializers/span-deserializer.js +26 -0
  55. package/dist/lib/cjs/store/serializers/span-deserializer.js.map +1 -0
  56. package/dist/lib/cjs/store/serializers/trace-deserializer.js +24 -0
  57. package/dist/lib/cjs/store/serializers/trace-deserializer.js.map +1 -0
  58. package/dist/lib/cjs/store/store.js +19 -0
  59. package/dist/lib/cjs/store/store.js.map +1 -0
  60. package/dist/lib/cjs/store/trace-deserializer.js +41 -0
  61. package/dist/lib/cjs/store/trace-deserializer.js.map +1 -0
  62. package/dist/lib/cjs/store/trace-store.js +281 -0
  63. package/dist/lib/cjs/store/trace-store.js.map +1 -0
  64. package/dist/lib/cjs/tailers/log-tailer.js +110 -0
  65. package/dist/lib/cjs/tailers/log-tailer.js.map +1 -0
  66. package/dist/lib/cjs/tailers/tailers.js +18 -0
  67. package/dist/lib/cjs/tailers/tailers.js.map +1 -0
  68. package/dist/lib/cjs/tracers/observability.tracer.js +65 -0
  69. package/dist/lib/cjs/tracers/observability.tracer.js.map +1 -0
  70. package/dist/lib/cjs/tracers/tracers.js +18 -0
  71. package/dist/lib/cjs/tracers/tracers.js.map +1 -0
  72. package/dist/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  73. package/dist/lib/esm/interfaces/interfaces.js +3 -0
  74. package/dist/lib/esm/interfaces/interfaces.js.map +1 -0
  75. package/dist/lib/esm/interfaces/serialized-span.interface.js +2 -0
  76. package/dist/lib/esm/interfaces/serialized-span.interface.js.map +1 -0
  77. package/dist/lib/esm/interfaces/serialized-trace.interface.js +2 -0
  78. package/dist/lib/esm/interfaces/serialized-trace.interface.js.map +1 -0
  79. package/dist/lib/esm/loggers/loggers.js +2 -0
  80. package/dist/lib/esm/loggers/loggers.js.map +1 -0
  81. package/dist/lib/esm/loggers/observability.logger.js +70 -0
  82. package/dist/lib/esm/loggers/observability.logger.js.map +1 -0
  83. package/dist/lib/esm/models/models.js +2 -0
  84. package/dist/lib/esm/models/models.js.map +1 -0
  85. package/dist/lib/esm/models/request-summary.model.js +15 -0
  86. package/dist/lib/esm/models/request-summary.model.js.map +1 -0
  87. package/dist/lib/esm/models/run-metadata.model.js +14 -0
  88. package/dist/lib/esm/models/run-metadata.model.js.map +1 -0
  89. package/dist/lib/esm/observability-configuration.js +46 -0
  90. package/dist/lib/esm/observability-configuration.js.map +1 -0
  91. package/dist/lib/esm/observability.configuration-keys.js +18 -0
  92. package/dist/lib/esm/observability.configuration-keys.js.map +1 -0
  93. package/dist/lib/esm/observability.module.js +81 -0
  94. package/dist/lib/esm/observability.module.js.map +1 -0
  95. package/dist/lib/esm/observability.module.keyname.js +2 -0
  96. package/dist/lib/esm/observability.module.keyname.js.map +1 -0
  97. package/dist/lib/esm/paths/observability-paths.js +41 -0
  98. package/dist/lib/esm/paths/observability-paths.js.map +1 -0
  99. package/dist/lib/esm/paths/paths.js +2 -0
  100. package/dist/lib/esm/paths/paths.js.map +1 -0
  101. package/dist/lib/esm/serializers/serialized-span.interface.js +2 -0
  102. package/dist/lib/esm/serializers/serialized-span.interface.js.map +1 -0
  103. package/dist/lib/esm/serializers/serialized-trace.interface.js +2 -0
  104. package/dist/lib/esm/serializers/serialized-trace.interface.js.map +1 -0
  105. package/dist/lib/esm/serializers/serializers.js +3 -0
  106. package/dist/lib/esm/serializers/serializers.js.map +1 -0
  107. package/dist/lib/esm/serializers/span-deserializer.js +22 -0
  108. package/dist/lib/esm/serializers/span-deserializer.js.map +1 -0
  109. package/dist/lib/esm/serializers/trace-deserializer.js +20 -0
  110. package/dist/lib/esm/serializers/trace-deserializer.js.map +1 -0
  111. package/dist/lib/esm/store/log-store.js +213 -0
  112. package/dist/lib/esm/store/log-store.js.map +1 -0
  113. package/dist/lib/esm/store/log-tailer.js +73 -0
  114. package/dist/lib/esm/store/log-tailer.js.map +1 -0
  115. package/dist/lib/esm/store/observability-paths.js +41 -0
  116. package/dist/lib/esm/store/observability-paths.js.map +1 -0
  117. package/dist/lib/esm/store/observability-run-manager.js +310 -0
  118. package/dist/lib/esm/store/observability-run-manager.js.map +1 -0
  119. package/dist/lib/esm/store/observability-store-reader.js +138 -0
  120. package/dist/lib/esm/store/observability-store-reader.js.map +1 -0
  121. package/dist/lib/esm/store/serializers/serialized-span.interface.js +2 -0
  122. package/dist/lib/esm/store/serializers/serialized-span.interface.js.map +1 -0
  123. package/dist/lib/esm/store/serializers/serialized-trace.interface.js +2 -0
  124. package/dist/lib/esm/store/serializers/serialized-trace.interface.js.map +1 -0
  125. package/dist/lib/esm/store/serializers/span-deserializer.js +22 -0
  126. package/dist/lib/esm/store/serializers/span-deserializer.js.map +1 -0
  127. package/dist/lib/esm/store/serializers/trace-deserializer.js +20 -0
  128. package/dist/lib/esm/store/serializers/trace-deserializer.js.map +1 -0
  129. package/dist/lib/esm/store/store.js +3 -0
  130. package/dist/lib/esm/store/store.js.map +1 -0
  131. package/dist/lib/esm/store/trace-deserializer.js +37 -0
  132. package/dist/lib/esm/store/trace-deserializer.js.map +1 -0
  133. package/dist/lib/esm/store/trace-store.js +245 -0
  134. package/dist/lib/esm/store/trace-store.js.map +1 -0
  135. package/dist/lib/esm/tailers/log-tailer.js +73 -0
  136. package/dist/lib/esm/tailers/log-tailer.js.map +1 -0
  137. package/dist/lib/esm/tailers/tailers.js +2 -0
  138. package/dist/lib/esm/tailers/tailers.js.map +1 -0
  139. package/dist/lib/esm/tracers/observability.tracer.js +62 -0
  140. package/dist/lib/esm/tracers/observability.tracer.js.map +1 -0
  141. package/dist/lib/esm/tracers/tracers.js +2 -0
  142. package/dist/lib/esm/tracers/tracers.js.map +1 -0
  143. package/dist/lib/esm/tsconfig.tsbuildinfo +1 -0
  144. package/dist/types/interfaces/interfaces.d.ts +2 -0
  145. package/dist/types/interfaces/serialized-span.interface.d.ts +14 -0
  146. package/dist/types/interfaces/serialized-trace.interface.d.ts +14 -0
  147. package/dist/types/loggers/loggers.d.ts +1 -0
  148. package/dist/types/loggers/observability.logger.d.ts +20 -0
  149. package/dist/types/models/models.d.ts +1 -0
  150. package/dist/types/models/request-summary.model.d.ts +52 -0
  151. package/dist/types/models/run-metadata.model.d.ts +28 -0
  152. package/dist/types/observability-configuration.d.ts +32 -0
  153. package/dist/types/observability.configuration-keys.d.ts +32 -0
  154. package/dist/types/observability.module.d.ts +28 -0
  155. package/dist/types/observability.module.keyname.d.ts +1 -0
  156. package/dist/types/paths/observability-paths.d.ts +30 -0
  157. package/dist/types/paths/paths.d.ts +1 -0
  158. package/dist/types/serializers/serialized-span.interface.d.ts +14 -0
  159. package/dist/types/serializers/serialized-trace.interface.d.ts +14 -0
  160. package/dist/types/serializers/serializers.d.ts +2 -0
  161. package/dist/types/serializers/span-deserializer.d.ts +11 -0
  162. package/dist/types/serializers/trace-deserializer.d.ts +9 -0
  163. package/dist/types/store/log-store.d.ts +79 -0
  164. package/dist/types/store/log-tailer.d.ts +27 -0
  165. package/dist/types/store/observability-paths.d.ts +30 -0
  166. package/dist/types/store/observability-run-manager.d.ts +96 -0
  167. package/dist/types/store/observability-store-reader.d.ts +55 -0
  168. package/dist/types/store/serializers/serialized-span.interface.d.ts +14 -0
  169. package/dist/types/store/serializers/serialized-trace.interface.d.ts +14 -0
  170. package/dist/types/store/serializers/span-deserializer.d.ts +11 -0
  171. package/dist/types/store/serializers/trace-deserializer.d.ts +9 -0
  172. package/dist/types/store/store.d.ts +2 -0
  173. package/dist/types/store/trace-deserializer.d.ts +41 -0
  174. package/dist/types/store/trace-store.d.ts +88 -0
  175. package/dist/types/tailers/log-tailer.d.ts +27 -0
  176. package/dist/types/tailers/tailers.d.ts +1 -0
  177. package/dist/types/tracers/observability.tracer.d.ts +16 -0
  178. package/dist/types/tracers/tracers.d.ts +1 -0
  179. package/package.json +60 -0
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ObservabilityPaths = void 0;
37
+ const path = __importStar(require("path"));
38
+ /**
39
+ * Resolves every path inside the observability store from the configured store directory.
40
+ * Pure and stateless past construction — instantiate once with the configured directory
41
+ * and reuse.
42
+ *
43
+ * Layout:
44
+ * ```
45
+ * <root>/
46
+ * <instanceId>/logs.jsonl
47
+ * <instanceId>/requests.jsonl
48
+ * <instanceId>/traces/<traceId>.json
49
+ * ```
50
+ *
51
+ * Each `<instanceId>` is one pristine process lifetime (= the kernel instantiation id).
52
+ * No metadata sidecars, no `latest.json` pointer — directory `mtime` answers "which is
53
+ * most recent."
54
+ */
55
+ class ObservabilityPaths {
56
+ constructor(configuredDirectory) {
57
+ this.root = path.isAbsolute(configuredDirectory)
58
+ ? configuredDirectory
59
+ : path.resolve(process.cwd(), configuredDirectory);
60
+ }
61
+ instanceDirectory(instanceId) {
62
+ return path.join(this.root, instanceId);
63
+ }
64
+ logsFile(instanceId) {
65
+ return path.join(this.instanceDirectory(instanceId), "logs.jsonl");
66
+ }
67
+ requestsFile(instanceId) {
68
+ return path.join(this.instanceDirectory(instanceId), "requests.jsonl");
69
+ }
70
+ tracesDirectory(instanceId) {
71
+ return path.join(this.instanceDirectory(instanceId), "traces");
72
+ }
73
+ traceFile(instanceId, traceId) {
74
+ return path.join(this.tracesDirectory(instanceId), `${traceId}.json`);
75
+ }
76
+ }
77
+ exports.ObservabilityPaths = ObservabilityPaths;
78
+ //# sourceMappingURL=observability-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observability-paths.js","sourceRoot":"","sources":["../../../../src/paths/observability-paths.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAE7B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,kBAAkB;IAO7B,YAAY,mBAA2B;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC;YAC9C,CAAC,CAAC,mBAAmB;YACrB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC;IACvD,CAAC;IAED,iBAAiB,CAAC,UAAkB;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,QAAQ,CAAC,UAAkB;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;IACrE,CAAC;IAED,YAAY,CAAC,UAAkB;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACzE,CAAC;IAED,eAAe,CAAC,UAAkB;QAChC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;IAED,SAAS,CAAC,UAAkB,EAAE,OAAe;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;IACxE,CAAC;CACF;AAhCD,gDAgCC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./observability-paths"), exports);
18
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../../src/paths/paths.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=serialized-span.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialized-span.interface.js","sourceRoot":"","sources":["../../../../src/serializers/serialized-span.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=serialized-trace.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialized-trace.interface.js","sourceRoot":"","sources":["../../../../src/serializers/serialized-trace.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./span-deserializer"), exports);
18
+ __exportStar(require("./trace-deserializer"), exports);
19
+ //# sourceMappingURL=serializers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializers.js","sourceRoot":"","sources":["../../../../src/serializers/serializers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,uDAAqC"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SpanDeserializer = void 0;
4
+ const common_1 = require("@pristine-ts/common");
5
+ /**
6
+ * Rebuilds a `Span` (with its full child tree) from the stored plain object. Used by
7
+ * `TraceDeserializer` for the trace's root span and recursively for every descendant —
8
+ * so `traceRenderer.renderTree`/`renderFlat`, which call instance methods like
9
+ * `getDuration()`, work unchanged on stored traces.
10
+ */
11
+ class SpanDeserializer {
12
+ static deserialize(serialized, trace) {
13
+ var _a, _b;
14
+ const span = new common_1.Span(serialized.keyname, serialized.id, (_a = serialized.context) !== null && _a !== void 0 ? _a : {});
15
+ span.trace = trace;
16
+ span.startDate = serialized.startDate;
17
+ span.endDate = serialized.endDate;
18
+ span.inProgress = serialized.endDate === undefined;
19
+ for (const child of (_b = serialized.children) !== null && _b !== void 0 ? _b : []) {
20
+ span.addChild(SpanDeserializer.deserialize(child, trace));
21
+ }
22
+ return span;
23
+ }
24
+ }
25
+ exports.SpanDeserializer = SpanDeserializer;
26
+ //# sourceMappingURL=span-deserializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-deserializer.js","sourceRoot":"","sources":["../../../../src/serializers/span-deserializer.ts"],"names":[],"mappings":";;;AAAA,gDAAgD;AAGhD;;;;;GAKG;AACH,MAAa,gBAAgB;IAC3B,MAAM,CAAC,WAAW,CAAC,UAA0B,EAAE,KAAY;;QACzD,MAAM,IAAI,GAAG,IAAI,aAAI,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,MAAA,UAAU,CAAC,OAAO,mCAAI,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,OAAO,KAAK,SAAS,CAAC;QAEnD,KAAK,MAAM,KAAK,IAAI,MAAA,UAAU,CAAC,QAAQ,mCAAI,EAAE,EAAE,CAAC;YAC9C,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAdD,4CAcC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TraceDeserializer = void 0;
4
+ const common_1 = require("@pristine-ts/common");
5
+ const span_deserializer_1 = require("./span-deserializer");
6
+ /**
7
+ * Rehydrates a stored trace JSON (the shape written by `ObservabilityTracer`) back into
8
+ * a `Trace` instance, with its full span tree rebuilt via `SpanDeserializer`.
9
+ */
10
+ class TraceDeserializer {
11
+ static deserialize(serialized) {
12
+ var _a;
13
+ const trace = new common_1.Trace(serialized.id, (_a = serialized.context) !== null && _a !== void 0 ? _a : {});
14
+ trace.startDate = serialized.startDate;
15
+ trace.endDate = serialized.endDate;
16
+ trace.hasEnded = serialized.endDate !== undefined;
17
+ if (serialized.rootSpan !== undefined) {
18
+ trace.rootSpan = span_deserializer_1.SpanDeserializer.deserialize(serialized.rootSpan, trace);
19
+ }
20
+ return trace;
21
+ }
22
+ }
23
+ exports.TraceDeserializer = TraceDeserializer;
24
+ //# sourceMappingURL=trace-deserializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-deserializer.js","sourceRoot":"","sources":["../../../../src/serializers/trace-deserializer.ts"],"names":[],"mappings":";;;AAAA,gDAA0C;AAE1C,2DAAqD;AAErD;;;GAGG;AACH,MAAa,iBAAiB;IAC5B,MAAM,CAAC,WAAW,CAAC,UAA2B;;QAC5C,MAAM,KAAK,GAAG,IAAI,cAAK,CAAC,UAAU,CAAC,EAAE,EAAE,MAAA,UAAU,CAAC,OAAO,mCAAI,EAAE,CAAC,CAAC;QACjE,KAAK,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;QACvC,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QACnC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC,OAAO,KAAK,SAAS,CAAC;QAElD,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACtC,KAAK,CAAC,QAAQ,GAAG,oCAAgB,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAbD,8CAaC"}
@@ -0,0 +1,249 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
45
+ return function (target, key) { decorator(target, key, paramIndex); }
46
+ };
47
+ var LogStore_1;
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.LogStore = void 0;
50
+ const fs = __importStar(require("fs"));
51
+ const tsyringe_1 = require("tsyringe");
52
+ const common_1 = require("@pristine-ts/common");
53
+ const observability_module_keyname_1 = require("../observability.module.keyname");
54
+ const observability_configuration_keys_1 = require("../observability.configuration-keys");
55
+ const observability_paths_1 = require("../paths/observability-paths");
56
+ const log_tailer_1 = require("../tailers/log-tailer");
57
+ /**
58
+ * The read/write layer for captured logs. The `ObservabilityLogger` (a `Logger`-tagged
59
+ * transport) calls `append` on every log it sees. The CLI's `logs` command calls `read`
60
+ * / `tail` — addressed by event/trace/request id, never by a partition selector.
61
+ *
62
+ * Internally, each pristine process writes to its own per-process directory (keyed by
63
+ * the kernel instantiation id) so concurrent processes never race on the same file.
64
+ * That partition is invisible to callers: `read` walks every directory newest-first and
65
+ * concatenates; `tail` follows the most-recently-written directory.
66
+ *
67
+ * Singleton so both the writer (logger) and any reader resolved during the same
68
+ * process see the same in-memory state.
69
+ */
70
+ let LogStore = LogStore_1 = class LogStore {
71
+ constructor(enabled, directory, retainedInstances, partitionId) {
72
+ this.enabled = enabled;
73
+ this.retainedInstances = retainedInstances;
74
+ this.partitionId = partitionId;
75
+ this.directoryEnsured = false;
76
+ this.pruned = false;
77
+ this.paths = new observability_paths_1.ObservabilityPaths(directory);
78
+ }
79
+ /**
80
+ * Whether capture is on. The `LoggerInterface` contract surfaces this through the
81
+ * adapter so `LogHandler` can skip dispatch entirely for disabled stores.
82
+ */
83
+ isCaptureEnabled() {
84
+ return this.enabled;
85
+ }
86
+ /**
87
+ * Appends one log entry to the current process's `logs.jsonl`. No-op when
88
+ * observability is disabled.
89
+ *
90
+ * The on-disk shape is the JSON-serialized `LogModel` itself — `severity` stays a
91
+ * numeric `SeverityEnum`, `date` becomes an ISO string — so the `logs` command can
92
+ * round-trip through `PrettyLogFormatter`. Stringification is cycle-safe because
93
+ * `log.extra` routinely holds `Span`/`Trace` objects whose `parentSpan` ↔ `children`
94
+ * back-references would otherwise blow up a naive serializer.
95
+ */
96
+ append(log) {
97
+ if (this.enabled === false) {
98
+ return;
99
+ }
100
+ this.ensurePartitionDirectory();
101
+ const line = LogStore_1.safeStringify(log) + "\n";
102
+ fs.appendFileSync(this.paths.logsFile(this.partitionId), line);
103
+ }
104
+ /**
105
+ * Every captured log entry across every partition, in write order within each
106
+ * partition and partitions concatenated newest-first. When `id` is provided, only
107
+ * entries whose `traceId` / `eventId` / `requestId` match are returned — useful for
108
+ * `pristine logs <id>`.
109
+ */
110
+ read(id) {
111
+ const entries = [];
112
+ for (const partition of this.partitionsNewestFirst()) {
113
+ for (const entry of this.readJsonl(this.paths.logsFile(partition))) {
114
+ if (id === undefined || LogStore_1.entryMatchesId(entry, id)) {
115
+ entries.push(entry);
116
+ }
117
+ }
118
+ }
119
+ return entries;
120
+ }
121
+ /**
122
+ * Follows the most-recently-written partition's `logs.jsonl`, emitting each newly-
123
+ * appended line until the returned handle's `stop()` is called. When `id` is
124
+ * provided, only matching entries surface. Returns a no-op handle when the store
125
+ * has no partitions yet.
126
+ */
127
+ tail(id, onLine) {
128
+ const partition = this.latestPartition();
129
+ if (partition === undefined) {
130
+ return { stop: () => undefined };
131
+ }
132
+ const tailer = new log_tailer_1.LogTailer(this.paths.logsFile(partition));
133
+ tailer.follow(line => {
134
+ if (id === undefined) {
135
+ onLine(line);
136
+ return;
137
+ }
138
+ try {
139
+ if (LogStore_1.entryMatchesId(JSON.parse(line), id)) {
140
+ onLine(line);
141
+ }
142
+ }
143
+ catch (_a) {
144
+ // Skip malformed lines rather than aborting the follow.
145
+ }
146
+ });
147
+ return { stop: () => tailer.stop() };
148
+ }
149
+ ensurePartitionDirectory() {
150
+ if (this.directoryEnsured) {
151
+ return;
152
+ }
153
+ fs.mkdirSync(this.paths.instanceDirectory(this.partitionId), { recursive: true });
154
+ this.directoryEnsured = true;
155
+ this.pruneOldPartitions();
156
+ }
157
+ /**
158
+ * Drops partition directories beyond the retained limit, ordered by `mtime`. Once
159
+ * per process — additional appends are zero-cost. Best-effort: a failure to prune
160
+ * never blocks a write.
161
+ */
162
+ pruneOldPartitions() {
163
+ if (this.pruned) {
164
+ return;
165
+ }
166
+ this.pruned = true;
167
+ try {
168
+ const ordered = this.partitionsNewestFirst();
169
+ for (const stale of ordered.slice(Math.max(this.retainedInstances, 1))) {
170
+ fs.rmSync(this.paths.instanceDirectory(stale), { recursive: true, force: true });
171
+ }
172
+ }
173
+ catch (_a) {
174
+ // Best-effort.
175
+ }
176
+ }
177
+ partitionsNewestFirst() {
178
+ try {
179
+ return fs.readdirSync(this.paths.root, { withFileTypes: true })
180
+ .filter(entry => entry.isDirectory())
181
+ .map(entry => ({ name: entry.name, mtime: this.directoryMtime(entry.name) }))
182
+ .sort((a, b) => b.mtime - a.mtime)
183
+ .map(entry => entry.name);
184
+ }
185
+ catch (_a) {
186
+ return [];
187
+ }
188
+ }
189
+ latestPartition() {
190
+ return this.partitionsNewestFirst()[0];
191
+ }
192
+ directoryMtime(name) {
193
+ try {
194
+ return fs.statSync(this.paths.instanceDirectory(name)).mtimeMs;
195
+ }
196
+ catch (_a) {
197
+ return 0;
198
+ }
199
+ }
200
+ readJsonl(filePath) {
201
+ try {
202
+ return fs.readFileSync(filePath, "utf8")
203
+ .split("\n")
204
+ .filter(line => line.trim().length > 0)
205
+ .map(line => JSON.parse(line));
206
+ }
207
+ catch (_a) {
208
+ return [];
209
+ }
210
+ }
211
+ /**
212
+ * True when any of the entry's correlation fields match the requested id.
213
+ * `requestId` is checked too even though `LogModel` doesn't define it as a field
214
+ * today — JSON deserialization is permissive, so a custom mapper that does set it
215
+ * will round-trip and match.
216
+ */
217
+ static entryMatchesId(entry, id) {
218
+ return entry.traceId === id || entry.eventId === id || entry.requestId === id;
219
+ }
220
+ /**
221
+ * `JSON.stringify` with a cycle guard — an object seen earlier in the walk is rendered
222
+ * as `"[Circular]"` rather than recursed into. Faithful at any depth, and immune to the
223
+ * `Span.parentSpan` ↔ `Span.children` cycles common in `log.extra`.
224
+ */
225
+ static safeStringify(value) {
226
+ const seen = new WeakSet();
227
+ return JSON.stringify(value, (_key, val) => {
228
+ if (typeof val === "object" && val !== null) {
229
+ if (seen.has(val)) {
230
+ return "[Circular]";
231
+ }
232
+ seen.add(val);
233
+ }
234
+ return val;
235
+ });
236
+ }
237
+ };
238
+ exports.LogStore = LogStore;
239
+ exports.LogStore = LogStore = LogStore_1 = __decorate([
240
+ (0, common_1.moduleScoped)(observability_module_keyname_1.ObservabilityModuleKeyname),
241
+ (0, tsyringe_1.singleton)(),
242
+ (0, tsyringe_1.injectable)(),
243
+ __param(0, (0, common_1.injectConfig)(observability_configuration_keys_1.ObservabilityConfigurationKeys.Enabled)),
244
+ __param(1, (0, common_1.injectConfig)(observability_configuration_keys_1.ObservabilityConfigurationKeys.Directory)),
245
+ __param(2, (0, common_1.injectConfig)(observability_configuration_keys_1.ObservabilityConfigurationKeys.RetainedInstances)),
246
+ __param(3, (0, tsyringe_1.inject)(common_1.InternalContainerParameterEnum.KernelInstantiationId)),
247
+ __metadata("design:paramtypes", [Boolean, String, Number, String])
248
+ ], LogStore);
249
+ //# sourceMappingURL=log-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-store.js","sourceRoot":"","sources":["../../../../src/store/log-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.LogTailer = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * Follows a growing `.jsonl` file and emits each newly-appended complete line. The
41
+ * `logs --follow` command and the REPL use this for a `tail -f`-style live view.
42
+ *
43
+ * Watches the file's parent directory (watching a not-yet-created file directly is
44
+ * unreliable across platforms) and reads the byte delta on each change. Partial trailing
45
+ * lines are buffered until their terminating newline arrives.
46
+ *
47
+ * Not a DI service — a plain utility. Instantiate, `follow()`, and `stop()` when done.
48
+ */
49
+ class LogTailer {
50
+ constructor(filePath) {
51
+ this.filePath = filePath;
52
+ this.offset = 0;
53
+ this.buffer = "";
54
+ }
55
+ /**
56
+ * Starts following. Existing content is skipped — only lines appended after this call
57
+ * are emitted. Call `stop()` to release the watch.
58
+ */
59
+ follow(onLine) {
60
+ this.offset = fs.existsSync(this.filePath) ? fs.statSync(this.filePath).size : 0;
61
+ const directory = path.dirname(this.filePath);
62
+ const filename = path.basename(this.filePath);
63
+ this.watcher = fs.watch(directory, (_eventType, changed) => {
64
+ if (changed !== null && changed !== filename) {
65
+ return;
66
+ }
67
+ this.drain(onLine);
68
+ });
69
+ }
70
+ /**
71
+ * Stops following and releases the filesystem watch.
72
+ */
73
+ stop() {
74
+ var _a;
75
+ (_a = this.watcher) === null || _a === void 0 ? void 0 : _a.close();
76
+ this.watcher = undefined;
77
+ }
78
+ drain(onLine) {
79
+ var _a;
80
+ if (fs.existsSync(this.filePath) === false) {
81
+ return;
82
+ }
83
+ const size = fs.statSync(this.filePath).size;
84
+ if (size <= this.offset) {
85
+ // Truncated or unchanged — reset to the new end so we don't replay stale bytes.
86
+ this.offset = size;
87
+ return;
88
+ }
89
+ const fd = fs.openSync(this.filePath, "r");
90
+ try {
91
+ const length = size - this.offset;
92
+ const chunk = Buffer.alloc(length);
93
+ fs.readSync(fd, chunk, 0, length, this.offset);
94
+ this.offset = size;
95
+ this.buffer += chunk.toString("utf8");
96
+ }
97
+ finally {
98
+ fs.closeSync(fd);
99
+ }
100
+ const lines = this.buffer.split("\n");
101
+ this.buffer = (_a = lines.pop()) !== null && _a !== void 0 ? _a : "";
102
+ for (const line of lines) {
103
+ if (line.length > 0) {
104
+ onLine(line);
105
+ }
106
+ }
107
+ }
108
+ }
109
+ exports.LogTailer = LogTailer;
110
+ //# sourceMappingURL=log-tailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-tailer.js","sourceRoot":"","sources":["../../../../src/store/log-tailer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAE7B;;;;;;;;;GASG;AACH,MAAa,SAAS;IAKpB,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;QAHrC,WAAM,GAAG,CAAC,CAAC;QACX,WAAM,GAAG,EAAE,CAAC;IAGpB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,MAA8B;QACnC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE9C,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE;YACzD,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC7C,OAAO;YACT,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI;;QACF,MAAA,IAAI,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,MAA8B;;QAC1C,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;QAC7C,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACxB,gFAAgF;YAChF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;YAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,MAAA,KAAK,CAAC,GAAG,EAAE,mCAAI,EAAE,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAjED,8BAiEC"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ObservabilityPaths = void 0;
37
+ const path = __importStar(require("path"));
38
+ /**
39
+ * Resolves every path inside the observability store from the configured store directory.
40
+ * Pure and stateless past construction — instantiate once with the configured directory
41
+ * and reuse.
42
+ *
43
+ * Layout:
44
+ * ```
45
+ * <root>/
46
+ * <instanceId>/logs.jsonl
47
+ * <instanceId>/requests.jsonl
48
+ * <instanceId>/traces/<traceId>.json
49
+ * ```
50
+ *
51
+ * Each `<instanceId>` is one pristine process lifetime (= the kernel instantiation id).
52
+ * No metadata sidecars, no `latest.json` pointer — directory `mtime` answers "which is
53
+ * most recent."
54
+ */
55
+ class ObservabilityPaths {
56
+ constructor(configuredDirectory) {
57
+ this.root = path.isAbsolute(configuredDirectory)
58
+ ? configuredDirectory
59
+ : path.resolve(process.cwd(), configuredDirectory);
60
+ }
61
+ instanceDirectory(instanceId) {
62
+ return path.join(this.root, instanceId);
63
+ }
64
+ logsFile(instanceId) {
65
+ return path.join(this.instanceDirectory(instanceId), "logs.jsonl");
66
+ }
67
+ requestsFile(instanceId) {
68
+ return path.join(this.instanceDirectory(instanceId), "requests.jsonl");
69
+ }
70
+ tracesDirectory(instanceId) {
71
+ return path.join(this.instanceDirectory(instanceId), "traces");
72
+ }
73
+ traceFile(instanceId, traceId) {
74
+ return path.join(this.tracesDirectory(instanceId), `${traceId}.json`);
75
+ }
76
+ }
77
+ exports.ObservabilityPaths = ObservabilityPaths;
78
+ //# sourceMappingURL=observability-paths.js.map