@principal-ai/subsystems-core 0.29.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 (614) hide show
  1. package/README.md +124 -0
  2. package/dist/ConfigurationLoader.d.ts +76 -0
  3. package/dist/ConfigurationLoader.d.ts.map +1 -0
  4. package/dist/ConfigurationLoader.js +148 -0
  5. package/dist/ConfigurationLoader.js.map +1 -0
  6. package/dist/ConfigurationValidator.d.ts +31 -0
  7. package/dist/ConfigurationValidator.d.ts.map +1 -0
  8. package/dist/ConfigurationValidator.js +239 -0
  9. package/dist/ConfigurationValidator.js.map +1 -0
  10. package/dist/EventProcessor.d.ts +49 -0
  11. package/dist/EventProcessor.d.ts.map +1 -0
  12. package/dist/EventProcessor.js +220 -0
  13. package/dist/EventProcessor.js.map +1 -0
  14. package/dist/EventRecorderService.d.ts +305 -0
  15. package/dist/EventRecorderService.d.ts.map +1 -0
  16. package/dist/EventRecorderService.js +467 -0
  17. package/dist/EventRecorderService.js.map +1 -0
  18. package/dist/LibraryLoader.d.ts +65 -0
  19. package/dist/LibraryLoader.d.ts.map +1 -0
  20. package/dist/LibraryLoader.js +197 -0
  21. package/dist/LibraryLoader.js.map +1 -0
  22. package/dist/PathBasedEventProcessor.d.ts +77 -0
  23. package/dist/PathBasedEventProcessor.d.ts.map +1 -0
  24. package/dist/PathBasedEventProcessor.js +136 -0
  25. package/dist/PathBasedEventProcessor.js.map +1 -0
  26. package/dist/SessionManager.d.ts +194 -0
  27. package/dist/SessionManager.d.ts.map +1 -0
  28. package/dist/SessionManager.js +302 -0
  29. package/dist/SessionManager.js.map +1 -0
  30. package/dist/ValidationEngine.d.ts +31 -0
  31. package/dist/ValidationEngine.d.ts.map +1 -0
  32. package/dist/ValidationEngine.js +162 -0
  33. package/dist/ValidationEngine.js.map +1 -0
  34. package/dist/agent-sessions/fixture.d.ts +80 -0
  35. package/dist/agent-sessions/fixture.d.ts.map +1 -0
  36. package/dist/agent-sessions/fixture.js +130 -0
  37. package/dist/agent-sessions/fixture.js.map +1 -0
  38. package/dist/agent-sessions/index.d.ts +3 -0
  39. package/dist/agent-sessions/index.d.ts.map +1 -0
  40. package/dist/agent-sessions/index.js +6 -0
  41. package/dist/agent-sessions/index.js.map +1 -0
  42. package/dist/auxiliary/AuxiliaryManifestValidator.d.ts +41 -0
  43. package/dist/auxiliary/AuxiliaryManifestValidator.d.ts.map +1 -0
  44. package/dist/auxiliary/AuxiliaryManifestValidator.js +100 -0
  45. package/dist/auxiliary/AuxiliaryManifestValidator.js.map +1 -0
  46. package/dist/auxiliary/index.d.ts +9 -0
  47. package/dist/auxiliary/index.d.ts.map +1 -0
  48. package/dist/auxiliary/index.js +14 -0
  49. package/dist/auxiliary/index.js.map +1 -0
  50. package/dist/auxiliary/validateAreaScopeDisjoint.d.ts +24 -0
  51. package/dist/auxiliary/validateAreaScopeDisjoint.d.ts.map +1 -0
  52. package/dist/auxiliary/validateAreaScopeDisjoint.js +61 -0
  53. package/dist/auxiliary/validateAreaScopeDisjoint.js.map +1 -0
  54. package/dist/cli/codegen.d.ts +41 -0
  55. package/dist/cli/codegen.d.ts.map +1 -0
  56. package/dist/cli/codegen.js +257 -0
  57. package/dist/cli/codegen.js.map +1 -0
  58. package/dist/codegen/type-generator.d.ts +123 -0
  59. package/dist/codegen/type-generator.d.ts.map +1 -0
  60. package/dist/codegen/type-generator.js +433 -0
  61. package/dist/codegen/type-generator.js.map +1 -0
  62. package/dist/codegen/usage-example.d.ts +103 -0
  63. package/dist/codegen/usage-example.d.ts.map +1 -0
  64. package/dist/codegen/usage-example.js +258 -0
  65. package/dist/codegen/usage-example.js.map +1 -0
  66. package/dist/dashboard/DashboardValidator.d.ts +85 -0
  67. package/dist/dashboard/DashboardValidator.d.ts.map +1 -0
  68. package/dist/dashboard/DashboardValidator.js +775 -0
  69. package/dist/dashboard/DashboardValidator.js.map +1 -0
  70. package/dist/dashboard/index.d.ts +6 -0
  71. package/dist/dashboard/index.d.ts.map +1 -0
  72. package/dist/dashboard/index.js +10 -0
  73. package/dist/dashboard/index.js.map +1 -0
  74. package/dist/discovery/CanvasDiscovery.d.ts +160 -0
  75. package/dist/discovery/CanvasDiscovery.d.ts.map +1 -0
  76. package/dist/discovery/CanvasDiscovery.js +865 -0
  77. package/dist/discovery/CanvasDiscovery.js.map +1 -0
  78. package/dist/discovery/CanvasFileManifest.d.ts +86 -0
  79. package/dist/discovery/CanvasFileManifest.d.ts.map +1 -0
  80. package/dist/discovery/CanvasFileManifest.js +338 -0
  81. package/dist/discovery/CanvasFileManifest.js.map +1 -0
  82. package/dist/discovery/LibraryDiscovery.d.ts +108 -0
  83. package/dist/discovery/LibraryDiscovery.d.ts.map +1 -0
  84. package/dist/discovery/LibraryDiscovery.js +263 -0
  85. package/dist/discovery/LibraryDiscovery.js.map +1 -0
  86. package/dist/discovery/types.d.ts +403 -0
  87. package/dist/discovery/types.d.ts.map +1 -0
  88. package/dist/discovery/types.js +6 -0
  89. package/dist/discovery/types.js.map +1 -0
  90. package/dist/events/EventsCanvasValidator.d.ts +139 -0
  91. package/dist/events/EventsCanvasValidator.d.ts.map +1 -0
  92. package/dist/events/EventsCanvasValidator.js +281 -0
  93. package/dist/events/EventsCanvasValidator.js.map +1 -0
  94. package/dist/events/NamespacePathIndex.d.ts +61 -0
  95. package/dist/events/NamespacePathIndex.d.ts.map +1 -0
  96. package/dist/events/NamespacePathIndex.js +74 -0
  97. package/dist/events/NamespacePathIndex.js.map +1 -0
  98. package/dist/events/OtelEventPathsValidator.d.ts +75 -0
  99. package/dist/events/OtelEventPathsValidator.d.ts.map +1 -0
  100. package/dist/events/OtelEventPathsValidator.js +126 -0
  101. package/dist/events/OtelEventPathsValidator.js.map +1 -0
  102. package/dist/events/ScopeEventsValidator.d.ts +68 -0
  103. package/dist/events/ScopeEventsValidator.d.ts.map +1 -0
  104. package/dist/events/ScopeEventsValidator.js +91 -0
  105. package/dist/events/ScopeEventsValidator.js.map +1 -0
  106. package/dist/events/index.d.ts +9 -0
  107. package/dist/events/index.d.ts.map +1 -0
  108. package/dist/events/index.js +12 -0
  109. package/dist/events/index.js.map +1 -0
  110. package/dist/events/path-helpers.d.ts +33 -0
  111. package/dist/events/path-helpers.d.ts.map +1 -0
  112. package/dist/events/path-helpers.js +59 -0
  113. package/dist/events/path-helpers.js.map +1 -0
  114. package/dist/execution/ExecutionLoader.d.ts +135 -0
  115. package/dist/execution/ExecutionLoader.d.ts.map +1 -0
  116. package/dist/execution/ExecutionLoader.js +266 -0
  117. package/dist/execution/ExecutionLoader.js.map +1 -0
  118. package/dist/execution/ExecutionValidator.d.ts +94 -0
  119. package/dist/execution/ExecutionValidator.d.ts.map +1 -0
  120. package/dist/execution/ExecutionValidator.js +503 -0
  121. package/dist/execution/ExecutionValidator.js.map +1 -0
  122. package/dist/generated/graph-converter-execution.types.d.ts +177 -0
  123. package/dist/generated/graph-converter-execution.types.d.ts.map +1 -0
  124. package/dist/generated/graph-converter-execution.types.js +12 -0
  125. package/dist/generated/graph-converter-execution.types.js.map +1 -0
  126. package/dist/helpers/GraphInstrumentationHelper.d.ts +93 -0
  127. package/dist/helpers/GraphInstrumentationHelper.d.ts.map +1 -0
  128. package/dist/helpers/GraphInstrumentationHelper.js +252 -0
  129. package/dist/helpers/GraphInstrumentationHelper.js.map +1 -0
  130. package/dist/index.d.ts +82 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +214 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/matchers/SpanMatcher.d.ts +107 -0
  135. package/dist/matchers/SpanMatcher.d.ts.map +1 -0
  136. package/dist/matchers/SpanMatcher.js +274 -0
  137. package/dist/matchers/SpanMatcher.js.map +1 -0
  138. package/dist/node.d.ts +78 -0
  139. package/dist/node.d.ts.map +1 -0
  140. package/dist/node.js +177 -0
  141. package/dist/node.js.map +1 -0
  142. package/dist/opencode/OpenCodeEventStore.d.ts +25 -0
  143. package/dist/opencode/OpenCodeEventStore.d.ts.map +1 -0
  144. package/dist/opencode/OpenCodeEventStore.js +182 -0
  145. package/dist/opencode/OpenCodeEventStore.js.map +1 -0
  146. package/dist/opencode/agent-sessions.d.ts +46 -0
  147. package/dist/opencode/agent-sessions.d.ts.map +1 -0
  148. package/dist/opencode/agent-sessions.js +302 -0
  149. package/dist/opencode/agent-sessions.js.map +1 -0
  150. package/dist/opencode/index.d.ts +6 -0
  151. package/dist/opencode/index.d.ts.map +1 -0
  152. package/dist/opencode/index.js +15 -0
  153. package/dist/opencode/index.js.map +1 -0
  154. package/dist/opencode/node-path-adapter.d.ts +25 -0
  155. package/dist/opencode/node-path-adapter.d.ts.map +1 -0
  156. package/dist/opencode/node-path-adapter.js +188 -0
  157. package/dist/opencode/node-path-adapter.js.map +1 -0
  158. package/dist/opencode/pipeline.d.ts +42 -0
  159. package/dist/opencode/pipeline.d.ts.map +1 -0
  160. package/dist/opencode/pipeline.js +90 -0
  161. package/dist/opencode/pipeline.js.map +1 -0
  162. package/dist/opencode/types.d.ts +39 -0
  163. package/dist/opencode/types.d.ts.map +1 -0
  164. package/dist/opencode/types.js +3 -0
  165. package/dist/opencode/types.js.map +1 -0
  166. package/dist/orchestration/TraceOrchestrator.d.ts +71 -0
  167. package/dist/orchestration/TraceOrchestrator.d.ts.map +1 -0
  168. package/dist/orchestration/TraceOrchestrator.js +416 -0
  169. package/dist/orchestration/TraceOrchestrator.js.map +1 -0
  170. package/dist/parsers/OtlpTraceParser.d.ts +131 -0
  171. package/dist/parsers/OtlpTraceParser.d.ts.map +1 -0
  172. package/dist/parsers/OtlpTraceParser.js +310 -0
  173. package/dist/parsers/OtlpTraceParser.js.map +1 -0
  174. package/dist/registry/CompositeRegistry.d.ts +71 -0
  175. package/dist/registry/CompositeRegistry.d.ts.map +1 -0
  176. package/dist/registry/CompositeRegistry.js +113 -0
  177. package/dist/registry/CompositeRegistry.js.map +1 -0
  178. package/dist/registry/EventRegistry.d.ts +79 -0
  179. package/dist/registry/EventRegistry.d.ts.map +1 -0
  180. package/dist/registry/EventRegistry.js +165 -0
  181. package/dist/registry/EventRegistry.js.map +1 -0
  182. package/dist/registry/LocalRegistry.d.ts +111 -0
  183. package/dist/registry/LocalRegistry.d.ts.map +1 -0
  184. package/dist/registry/LocalRegistry.js +335 -0
  185. package/dist/registry/LocalRegistry.js.map +1 -0
  186. package/dist/registry/RemoteRegistry.d.ts +122 -0
  187. package/dist/registry/RemoteRegistry.d.ts.map +1 -0
  188. package/dist/registry/RemoteRegistry.js +399 -0
  189. package/dist/registry/RemoteRegistry.js.map +1 -0
  190. package/dist/registry/VersionRegistry.d.ts +51 -0
  191. package/dist/registry/VersionRegistry.d.ts.map +1 -0
  192. package/dist/registry/VersionRegistry.js +105 -0
  193. package/dist/registry/VersionRegistry.js.map +1 -0
  194. package/dist/rules/config.d.ts +57 -0
  195. package/dist/rules/config.d.ts.map +1 -0
  196. package/dist/rules/config.js +382 -0
  197. package/dist/rules/config.js.map +1 -0
  198. package/dist/rules/engine.d.ts +70 -0
  199. package/dist/rules/engine.d.ts.map +1 -0
  200. package/dist/rules/engine.js +373 -0
  201. package/dist/rules/engine.js.map +1 -0
  202. package/dist/rules/implementations/connection-type-references.d.ts +7 -0
  203. package/dist/rules/implementations/connection-type-references.d.ts.map +1 -0
  204. package/dist/rules/implementations/connection-type-references.js +107 -0
  205. package/dist/rules/implementations/connection-type-references.js.map +1 -0
  206. package/dist/rules/implementations/dead-end-states.d.ts +17 -0
  207. package/dist/rules/implementations/dead-end-states.d.ts.map +1 -0
  208. package/dist/rules/implementations/dead-end-states.js +75 -0
  209. package/dist/rules/implementations/dead-end-states.js.map +1 -0
  210. package/dist/rules/implementations/index.d.ts +23 -0
  211. package/dist/rules/implementations/index.d.ts.map +1 -0
  212. package/dist/rules/implementations/index.js +73 -0
  213. package/dist/rules/implementations/index.js.map +1 -0
  214. package/dist/rules/implementations/minimum-node-sources.d.ts +24 -0
  215. package/dist/rules/implementations/minimum-node-sources.d.ts.map +1 -0
  216. package/dist/rules/implementations/minimum-node-sources.js +59 -0
  217. package/dist/rules/implementations/minimum-node-sources.js.map +1 -0
  218. package/dist/rules/implementations/no-unknown-fields.d.ts +7 -0
  219. package/dist/rules/implementations/no-unknown-fields.d.ts.map +1 -0
  220. package/dist/rules/implementations/no-unknown-fields.js +216 -0
  221. package/dist/rules/implementations/no-unknown-fields.js.map +1 -0
  222. package/dist/rules/implementations/orphaned-edge-types.d.ts +7 -0
  223. package/dist/rules/implementations/orphaned-edge-types.d.ts.map +1 -0
  224. package/dist/rules/implementations/orphaned-edge-types.js +50 -0
  225. package/dist/rules/implementations/orphaned-edge-types.js.map +1 -0
  226. package/dist/rules/implementations/orphaned-node-types.d.ts +7 -0
  227. package/dist/rules/implementations/orphaned-node-types.d.ts.map +1 -0
  228. package/dist/rules/implementations/orphaned-node-types.js +53 -0
  229. package/dist/rules/implementations/orphaned-node-types.js.map +1 -0
  230. package/dist/rules/implementations/required-metadata.d.ts +7 -0
  231. package/dist/rules/implementations/required-metadata.d.ts.map +1 -0
  232. package/dist/rules/implementations/required-metadata.js +48 -0
  233. package/dist/rules/implementations/required-metadata.js.map +1 -0
  234. package/dist/rules/implementations/state-transition-references.d.ts +7 -0
  235. package/dist/rules/implementations/state-transition-references.d.ts.map +1 -0
  236. package/dist/rules/implementations/state-transition-references.js +138 -0
  237. package/dist/rules/implementations/state-transition-references.js.map +1 -0
  238. package/dist/rules/implementations/unreachable-states.d.ts +7 -0
  239. package/dist/rules/implementations/unreachable-states.d.ts.map +1 -0
  240. package/dist/rules/implementations/unreachable-states.js +83 -0
  241. package/dist/rules/implementations/unreachable-states.js.map +1 -0
  242. package/dist/rules/implementations/valid-action-patterns.d.ts +17 -0
  243. package/dist/rules/implementations/valid-action-patterns.d.ts.map +1 -0
  244. package/dist/rules/implementations/valid-action-patterns.js +112 -0
  245. package/dist/rules/implementations/valid-action-patterns.js.map +1 -0
  246. package/dist/rules/implementations/valid-color-format.d.ts +7 -0
  247. package/dist/rules/implementations/valid-color-format.d.ts.map +1 -0
  248. package/dist/rules/implementations/valid-color-format.js +94 -0
  249. package/dist/rules/implementations/valid-color-format.js.map +1 -0
  250. package/dist/rules/implementations/valid-edge-types.d.ts +7 -0
  251. package/dist/rules/implementations/valid-edge-types.d.ts.map +1 -0
  252. package/dist/rules/implementations/valid-edge-types.js +248 -0
  253. package/dist/rules/implementations/valid-edge-types.js.map +1 -0
  254. package/dist/rules/implementations/valid-node-types.d.ts +7 -0
  255. package/dist/rules/implementations/valid-node-types.d.ts.map +1 -0
  256. package/dist/rules/implementations/valid-node-types.js +187 -0
  257. package/dist/rules/implementations/valid-node-types.js.map +1 -0
  258. package/dist/rules/index.d.ts +28 -0
  259. package/dist/rules/index.d.ts.map +1 -0
  260. package/dist/rules/index.js +70 -0
  261. package/dist/rules/index.js.map +1 -0
  262. package/dist/rules/types.d.ts +309 -0
  263. package/dist/rules/types.d.ts.map +1 -0
  264. package/dist/rules/types.js +40 -0
  265. package/dist/rules/types.js.map +1 -0
  266. package/dist/scopes/ScopePathIndex.d.ts +56 -0
  267. package/dist/scopes/ScopePathIndex.d.ts.map +1 -0
  268. package/dist/scopes/ScopePathIndex.js +67 -0
  269. package/dist/scopes/ScopePathIndex.js.map +1 -0
  270. package/dist/scopes/ScopesCanvasValidator.d.ts +76 -0
  271. package/dist/scopes/ScopesCanvasValidator.d.ts.map +1 -0
  272. package/dist/scopes/ScopesCanvasValidator.js +221 -0
  273. package/dist/scopes/ScopesCanvasValidator.js.map +1 -0
  274. package/dist/scopes/index.d.ts +12 -0
  275. package/dist/scopes/index.d.ts.map +1 -0
  276. package/dist/scopes/index.js +30 -0
  277. package/dist/scopes/index.js.map +1 -0
  278. package/dist/scopes/utils.d.ts +85 -0
  279. package/dist/scopes/utils.d.ts.map +1 -0
  280. package/dist/scopes/utils.js +143 -0
  281. package/dist/scopes/utils.js.map +1 -0
  282. package/dist/scopes/validateScopeNamespaceNesting.d.ts +38 -0
  283. package/dist/scopes/validateScopeNamespaceNesting.d.ts.map +1 -0
  284. package/dist/scopes/validateScopeNamespaceNesting.js +69 -0
  285. package/dist/scopes/validateScopeNamespaceNesting.js.map +1 -0
  286. package/dist/spans/index.d.ts +12 -0
  287. package/dist/spans/index.d.ts.map +1 -0
  288. package/dist/spans/index.js +25 -0
  289. package/dist/spans/index.js.map +1 -0
  290. package/dist/spans/utils.d.ts +70 -0
  291. package/dist/spans/utils.d.ts.map +1 -0
  292. package/dist/spans/utils.js +205 -0
  293. package/dist/spans/utils.js.map +1 -0
  294. package/dist/storage/topic-types.d.ts +203 -0
  295. package/dist/storage/topic-types.d.ts.map +1 -0
  296. package/dist/storage/topic-types.js +60 -0
  297. package/dist/storage/topic-types.js.map +1 -0
  298. package/dist/storage/topicStore.d.ts +135 -0
  299. package/dist/storage/topicStore.d.ts.map +1 -0
  300. package/dist/storage/topicStore.js +389 -0
  301. package/dist/storage/topicStore.js.map +1 -0
  302. package/dist/storyboard/builder.d.ts +135 -0
  303. package/dist/storyboard/builder.d.ts.map +1 -0
  304. package/dist/storyboard/builder.js +235 -0
  305. package/dist/storyboard/builder.js.map +1 -0
  306. package/dist/storyboard/index.d.ts +9 -0
  307. package/dist/storyboard/index.d.ts.map +1 -0
  308. package/dist/storyboard/index.js +18 -0
  309. package/dist/storyboard/index.js.map +1 -0
  310. package/dist/storyboard/types.d.ts +101 -0
  311. package/dist/storyboard/types.d.ts.map +1 -0
  312. package/dist/storyboard/types.js +10 -0
  313. package/dist/storyboard/types.js.map +1 -0
  314. package/dist/telemetry/coverage.d.ts +92 -0
  315. package/dist/telemetry/coverage.d.ts.map +1 -0
  316. package/dist/telemetry/coverage.js +335 -0
  317. package/dist/telemetry/coverage.js.map +1 -0
  318. package/dist/telemetry/event-validator.d.ts +86 -0
  319. package/dist/telemetry/event-validator.d.ts.map +1 -0
  320. package/dist/telemetry/event-validator.js +257 -0
  321. package/dist/telemetry/event-validator.js.map +1 -0
  322. package/dist/types/audit.d.ts +236 -0
  323. package/dist/types/audit.d.ts.map +1 -0
  324. package/dist/types/audit.js +53 -0
  325. package/dist/types/audit.js.map +1 -0
  326. package/dist/types/auxiliary.d.ts +54 -0
  327. package/dist/types/auxiliary.d.ts.map +1 -0
  328. package/dist/types/auxiliary.js +27 -0
  329. package/dist/types/auxiliary.js.map +1 -0
  330. package/dist/types/canvas-scope.d.ts +156 -0
  331. package/dist/types/canvas-scope.d.ts.map +1 -0
  332. package/dist/types/canvas-scope.js +62 -0
  333. package/dist/types/canvas-scope.js.map +1 -0
  334. package/dist/types/canvas.d.ts +1138 -0
  335. package/dist/types/canvas.d.ts.map +1 -0
  336. package/dist/types/canvas.js +178 -0
  337. package/dist/types/canvas.js.map +1 -0
  338. package/dist/types/dashboard.d.ts +170 -0
  339. package/dist/types/dashboard.d.ts.map +1 -0
  340. package/dist/types/dashboard.js +14 -0
  341. package/dist/types/dashboard.js.map +1 -0
  342. package/dist/types/index.d.ts +352 -0
  343. package/dist/types/index.d.ts.map +1 -0
  344. package/dist/types/index.js +39 -0
  345. package/dist/types/index.js.map +1 -0
  346. package/dist/types/library.d.ts +227 -0
  347. package/dist/types/library.d.ts.map +1 -0
  348. package/dist/types/library.js +16 -0
  349. package/dist/types/library.js.map +1 -0
  350. package/dist/types/otel.d.ts +465 -0
  351. package/dist/types/otel.d.ts.map +1 -0
  352. package/dist/types/otel.js +163 -0
  353. package/dist/types/otel.js.map +1 -0
  354. package/dist/types/path-based-config.d.ts +235 -0
  355. package/dist/types/path-based-config.d.ts.map +1 -0
  356. package/dist/types/path-based-config.js +11 -0
  357. package/dist/types/path-based-config.js.map +1 -0
  358. package/dist/types/registered-trace.d.ts +337 -0
  359. package/dist/types/registered-trace.d.ts.map +1 -0
  360. package/dist/types/registered-trace.js +16 -0
  361. package/dist/types/registered-trace.js.map +1 -0
  362. package/dist/types/resource-match.d.ts +207 -0
  363. package/dist/types/resource-match.d.ts.map +1 -0
  364. package/dist/types/resource-match.js +74 -0
  365. package/dist/types/resource-match.js.map +1 -0
  366. package/dist/types/subsystem-model.d.ts +265 -0
  367. package/dist/types/subsystem-model.d.ts.map +1 -0
  368. package/dist/types/subsystem-model.js +35 -0
  369. package/dist/types/subsystem-model.js.map +1 -0
  370. package/dist/types/version-registry.d.ts +137 -0
  371. package/dist/types/version-registry.d.ts.map +1 -0
  372. package/dist/types/version-registry.js +10 -0
  373. package/dist/types/version-registry.js.map +1 -0
  374. package/dist/utils/CanvasConverter.d.ts +148 -0
  375. package/dist/utils/CanvasConverter.d.ts.map +1 -0
  376. package/dist/utils/CanvasConverter.js +530 -0
  377. package/dist/utils/CanvasConverter.js.map +1 -0
  378. package/dist/utils/GraphConverter.d.ts +18 -0
  379. package/dist/utils/GraphConverter.d.ts.map +1 -0
  380. package/dist/utils/GraphConverter.js +80 -0
  381. package/dist/utils/GraphConverter.js.map +1 -0
  382. package/dist/utils/PathMatcher.d.ts +55 -0
  383. package/dist/utils/PathMatcher.d.ts.map +1 -0
  384. package/dist/utils/PathMatcher.js +178 -0
  385. package/dist/utils/PathMatcher.js.map +1 -0
  386. package/dist/utils/TraceToCanvas.d.ts +83 -0
  387. package/dist/utils/TraceToCanvas.d.ts.map +1 -0
  388. package/dist/utils/TraceToCanvas.js +336 -0
  389. package/dist/utils/TraceToCanvas.js.map +1 -0
  390. package/dist/utils/YamlParser.d.ts +36 -0
  391. package/dist/utils/YamlParser.d.ts.map +1 -0
  392. package/dist/utils/YamlParser.js +92 -0
  393. package/dist/utils/YamlParser.js.map +1 -0
  394. package/dist/utils/registeredTraceHelpers.d.ts +76 -0
  395. package/dist/utils/registeredTraceHelpers.d.ts.map +1 -0
  396. package/dist/utils/registeredTraceHelpers.js +203 -0
  397. package/dist/utils/registeredTraceHelpers.js.map +1 -0
  398. package/dist/utils/traceAggregation.d.ts +25 -0
  399. package/dist/utils/traceAggregation.d.ts.map +1 -0
  400. package/dist/utils/traceAggregation.js +140 -0
  401. package/dist/utils/traceAggregation.js.map +1 -0
  402. package/dist/validation/OtelCanvasValidator.d.ts +40 -0
  403. package/dist/validation/OtelCanvasValidator.d.ts.map +1 -0
  404. package/dist/validation/OtelCanvasValidator.js +59 -0
  405. package/dist/validation/OtelCanvasValidator.js.map +1 -0
  406. package/dist/validation/index.d.ts +8 -0
  407. package/dist/validation/index.d.ts.map +1 -0
  408. package/dist/validation/index.js +13 -0
  409. package/dist/validation/index.js.map +1 -0
  410. package/dist/validation/libraryValidation.d.ts +53 -0
  411. package/dist/validation/libraryValidation.d.ts.map +1 -0
  412. package/dist/validation/libraryValidation.js +115 -0
  413. package/dist/validation/libraryValidation.js.map +1 -0
  414. package/dist/workflow/edge-derivation.d.ts +111 -0
  415. package/dist/workflow/edge-derivation.d.ts.map +1 -0
  416. package/dist/workflow/edge-derivation.js +174 -0
  417. package/dist/workflow/edge-derivation.js.map +1 -0
  418. package/dist/workflow/edge-validation.d.ts +170 -0
  419. package/dist/workflow/edge-validation.d.ts.map +1 -0
  420. package/dist/workflow/edge-validation.js +332 -0
  421. package/dist/workflow/edge-validation.js.map +1 -0
  422. package/dist/workflow/example.d.ts +11 -0
  423. package/dist/workflow/example.d.ts.map +1 -0
  424. package/dist/workflow/example.js +310 -0
  425. package/dist/workflow/example.js.map +1 -0
  426. package/dist/workflow/index.d.ts +20 -0
  427. package/dist/workflow/index.d.ts.map +1 -0
  428. package/dist/workflow/index.js +49 -0
  429. package/dist/workflow/index.js.map +1 -0
  430. package/dist/workflow/scenario-matcher.d.ts +63 -0
  431. package/dist/workflow/scenario-matcher.d.ts.map +1 -0
  432. package/dist/workflow/scenario-matcher.js +215 -0
  433. package/dist/workflow/scenario-matcher.js.map +1 -0
  434. package/dist/workflow/template-parser.d.ts +73 -0
  435. package/dist/workflow/template-parser.d.ts.map +1 -0
  436. package/dist/workflow/template-parser.js +280 -0
  437. package/dist/workflow/template-parser.js.map +1 -0
  438. package/dist/workflow/template-renderer.d.ts +45 -0
  439. package/dist/workflow/template-renderer.d.ts.map +1 -0
  440. package/dist/workflow/template-renderer.js +401 -0
  441. package/dist/workflow/template-renderer.js.map +1 -0
  442. package/dist/workflow/types.d.ts +393 -0
  443. package/dist/workflow/types.d.ts.map +1 -0
  444. package/dist/workflow/types.js +40 -0
  445. package/dist/workflow/types.js.map +1 -0
  446. package/dist/workflow/validator.d.ts +363 -0
  447. package/dist/workflow/validator.d.ts.map +1 -0
  448. package/dist/workflow/validator.js +2283 -0
  449. package/dist/workflow/validator.js.map +1 -0
  450. package/package.json +84 -0
  451. package/schemas/auxiliary.manifest.schema.json +56 -0
  452. package/schemas/subsystem-model.schema.json +767 -0
  453. package/src/ConfigurationLoader.test.ts +466 -0
  454. package/src/ConfigurationLoader.ts +184 -0
  455. package/src/ConfigurationValidator.test.ts +200 -0
  456. package/src/ConfigurationValidator.ts +273 -0
  457. package/src/EventProcessor.test.ts +405 -0
  458. package/src/EventProcessor.ts +256 -0
  459. package/src/EventRecorderService.test.ts +543 -0
  460. package/src/EventRecorderService.ts +741 -0
  461. package/src/LibraryLoader.ts +194 -0
  462. package/src/PathBasedEventProcessor.test.ts +336 -0
  463. package/src/PathBasedEventProcessor.ts +196 -0
  464. package/src/SessionManager.test.ts +424 -0
  465. package/src/SessionManager.ts +471 -0
  466. package/src/ValidationEngine.test.ts +520 -0
  467. package/src/ValidationEngine.ts +200 -0
  468. package/src/agent-sessions/fixture.ts +225 -0
  469. package/src/agent-sessions/index.ts +10 -0
  470. package/src/auxiliary/AuxiliaryManifestValidator.test.ts +93 -0
  471. package/src/auxiliary/AuxiliaryManifestValidator.ts +132 -0
  472. package/src/auxiliary/index.ts +18 -0
  473. package/src/auxiliary/validateAreaScopeDisjoint.test.ts +85 -0
  474. package/src/auxiliary/validateAreaScopeDisjoint.ts +72 -0
  475. package/src/browser-safety.test.ts +170 -0
  476. package/src/cli/codegen.ts +286 -0
  477. package/src/codegen/type-generator.test.ts +219 -0
  478. package/src/codegen/type-generator.ts +560 -0
  479. package/src/codegen/usage-example.ts +357 -0
  480. package/src/dashboard/DashboardValidator.ts +904 -0
  481. package/src/dashboard/index.ts +14 -0
  482. package/src/discovery/CanvasDiscovery.test.ts +691 -0
  483. package/src/discovery/CanvasDiscovery.ts +1114 -0
  484. package/src/discovery/CanvasFileManifest.test.ts +521 -0
  485. package/src/discovery/CanvasFileManifest.ts +419 -0
  486. package/src/discovery/LibraryDiscovery.test.ts +329 -0
  487. package/src/discovery/LibraryDiscovery.ts +386 -0
  488. package/src/discovery/types.ts +453 -0
  489. package/src/events/EventsCanvasValidator.test.ts +191 -0
  490. package/src/events/EventsCanvasValidator.ts +428 -0
  491. package/src/events/NamespacePathIndex.test.ts +97 -0
  492. package/src/events/NamespacePathIndex.ts +100 -0
  493. package/src/events/OtelEventPathsValidator.test.ts +243 -0
  494. package/src/events/OtelEventPathsValidator.ts +191 -0
  495. package/src/events/ScopeEventsValidator.test.ts +173 -0
  496. package/src/events/ScopeEventsValidator.ts +158 -0
  497. package/src/events/index.ts +27 -0
  498. package/src/events/path-helpers.ts +53 -0
  499. package/src/execution/ExecutionLoader.test.ts +378 -0
  500. package/src/execution/ExecutionLoader.ts +331 -0
  501. package/src/execution/ExecutionValidator.test.ts +503 -0
  502. package/src/execution/ExecutionValidator.ts +617 -0
  503. package/src/generated/graph-converter-execution.types.ts +193 -0
  504. package/src/helpers/GraphInstrumentationHelper.test.ts +364 -0
  505. package/src/helpers/GraphInstrumentationHelper.ts +323 -0
  506. package/src/index.ts +587 -0
  507. package/src/matchers/SpanMatcher.test.ts +1105 -0
  508. package/src/matchers/SpanMatcher.ts +381 -0
  509. package/src/node.ts +316 -0
  510. package/src/opencode/EVENT_MAPPING.md +82 -0
  511. package/src/opencode/OpenCodeEventStore.ts +214 -0
  512. package/src/opencode/__fixtures__/event-shapes.json +443 -0
  513. package/src/opencode/__fixtures__/session-events.json +13491 -0
  514. package/src/opencode/agent-sessions.ts +376 -0
  515. package/src/opencode/index.ts +23 -0
  516. package/src/opencode/node-path-adapter.ts +205 -0
  517. package/src/opencode/pipeline.ts +141 -0
  518. package/src/opencode/types.ts +43 -0
  519. package/src/orchestration/TraceOrchestrator.ts +560 -0
  520. package/src/orchestration/__tests__/TraceOrchestrator.test.ts +1098 -0
  521. package/src/parsers/OtlpTraceParser.ts +401 -0
  522. package/src/parsers/__tests__/OtlpTraceParser.test.ts +197 -0
  523. package/src/registry/CompositeRegistry.ts +140 -0
  524. package/src/registry/EventRegistry.test.ts +387 -0
  525. package/src/registry/EventRegistry.ts +191 -0
  526. package/src/registry/LocalRegistry.ts +416 -0
  527. package/src/registry/RemoteRegistry.ts +499 -0
  528. package/src/registry/VersionRegistry.test.ts +223 -0
  529. package/src/registry/VersionRegistry.ts +121 -0
  530. package/src/rules/config.test.ts +277 -0
  531. package/src/rules/config.ts +450 -0
  532. package/src/rules/engine.test.ts +331 -0
  533. package/src/rules/engine.ts +448 -0
  534. package/src/rules/implementations/connection-type-references.ts +117 -0
  535. package/src/rules/implementations/dead-end-states.ts +101 -0
  536. package/src/rules/implementations/index.ts +66 -0
  537. package/src/rules/implementations/minimum-node-sources.ts +84 -0
  538. package/src/rules/implementations/no-unknown-fields.ts +372 -0
  539. package/src/rules/implementations/orphaned-edge-types.ts +55 -0
  540. package/src/rules/implementations/orphaned-node-types.ts +58 -0
  541. package/src/rules/implementations/required-metadata.ts +52 -0
  542. package/src/rules/implementations/state-transition-references.ts +155 -0
  543. package/src/rules/implementations/unreachable-states.ts +94 -0
  544. package/src/rules/implementations/valid-action-patterns.ts +140 -0
  545. package/src/rules/implementations/valid-color-format.ts +152 -0
  546. package/src/rules/implementations/valid-edge-types.ts +273 -0
  547. package/src/rules/implementations/valid-node-types.ts +200 -0
  548. package/src/rules/index.ts +92 -0
  549. package/src/rules/types.ts +426 -0
  550. package/src/scopes/ScopePathIndex.test.ts +94 -0
  551. package/src/scopes/ScopePathIndex.ts +89 -0
  552. package/src/scopes/ScopesCanvasValidator.test.ts +127 -0
  553. package/src/scopes/ScopesCanvasValidator.ts +305 -0
  554. package/src/scopes/__tests__/utils.test.ts +383 -0
  555. package/src/scopes/index.ts +42 -0
  556. package/src/scopes/utils.ts +182 -0
  557. package/src/scopes/validateScopeNamespaceNesting.test.ts +127 -0
  558. package/src/scopes/validateScopeNamespaceNesting.ts +88 -0
  559. package/src/spans/index.ts +24 -0
  560. package/src/spans/utils.ts +249 -0
  561. package/src/storage/topic-types.ts +235 -0
  562. package/src/storage/topicStore.test.ts +193 -0
  563. package/src/storage/topicStore.ts +489 -0
  564. package/src/storyboard/builder.ts +308 -0
  565. package/src/storyboard/index.ts +26 -0
  566. package/src/storyboard/types.ts +117 -0
  567. package/src/telemetry/coverage.ts +480 -0
  568. package/src/telemetry/event-validator.ts +312 -0
  569. package/src/types/audit.ts +314 -0
  570. package/src/types/auxiliary.ts +63 -0
  571. package/src/types/canvas-scope.ts +190 -0
  572. package/src/types/canvas.test.ts +199 -0
  573. package/src/types/canvas.ts +1395 -0
  574. package/src/types/dashboard.ts +257 -0
  575. package/src/types/index.ts +460 -0
  576. package/src/types/library.ts +283 -0
  577. package/src/types/otel.test.ts +219 -0
  578. package/src/types/otel.ts +620 -0
  579. package/src/types/path-based-config.ts +285 -0
  580. package/src/types/registered-trace.ts +432 -0
  581. package/src/types/resource-match.ts +263 -0
  582. package/src/types/subsystem-model.ts +352 -0
  583. package/src/types/version-registry.ts +150 -0
  584. package/src/utils/CanvasConverter.ts +670 -0
  585. package/src/utils/GraphConverter.test.ts +322 -0
  586. package/src/utils/GraphConverter.ts +84 -0
  587. package/src/utils/PathMatcher.test.ts +139 -0
  588. package/src/utils/PathMatcher.ts +185 -0
  589. package/src/utils/TraceToCanvas.test.ts +310 -0
  590. package/src/utils/TraceToCanvas.ts +510 -0
  591. package/src/utils/YamlParser.ts +77 -0
  592. package/src/utils/registeredTraceHelpers.ts +251 -0
  593. package/src/utils/traceAggregation.test.ts +385 -0
  594. package/src/utils/traceAggregation.ts +173 -0
  595. package/src/validation/OtelCanvasValidator.ts +86 -0
  596. package/src/validation/index.ts +17 -0
  597. package/src/validation/libraryValidation.ts +206 -0
  598. package/src/workflow/README.md +408 -0
  599. package/src/workflow/__tests__/edge-derivation.test.ts +449 -0
  600. package/src/workflow/__tests__/edge-validation.test.ts +417 -0
  601. package/src/workflow/__tests__/scenario-matcher.test.ts +225 -0
  602. package/src/workflow/__tests__/template-parser.test.ts +276 -0
  603. package/src/workflow/__tests__/template-renderer.test.ts +509 -0
  604. package/src/workflow/__tests__/types.test.ts +187 -0
  605. package/src/workflow/__tests__/validator.test.ts +3225 -0
  606. package/src/workflow/edge-derivation.ts +265 -0
  607. package/src/workflow/edge-validation.ts +503 -0
  608. package/src/workflow/example.ts +330 -0
  609. package/src/workflow/index.ts +86 -0
  610. package/src/workflow/scenario-matcher.ts +253 -0
  611. package/src/workflow/template-parser.ts +350 -0
  612. package/src/workflow/template-renderer.ts +453 -0
  613. package/src/workflow/types.ts +511 -0
  614. package/src/workflow/validator.ts +2737 -0
@@ -0,0 +1,510 @@
1
+ /**
2
+ * Trace to Canvas Converter
3
+ *
4
+ * Converts OpenTelemetry trace data (captured from test runs) into
5
+ * ExtendedCanvas format for visualization.
6
+ */
7
+
8
+ import type {
9
+ ExtendedCanvas,
10
+ ExtendedCanvasTextNode,
11
+ ExtendedCanvasGroupNode,
12
+ ExtendedCanvasEdge,
13
+ PVNodeShape,
14
+ } from '../types/canvas';
15
+ import type { OtelSpanKind } from '../types/otel';
16
+
17
+ // ============================================================================
18
+ // Input Types (matches test setup output)
19
+ // ============================================================================
20
+
21
+ /**
22
+ * Span data as exported from test runs
23
+ */
24
+ export interface TraceSpan {
25
+ traceId: string;
26
+ spanId: string;
27
+ parentSpanId?: string | null;
28
+ name: string;
29
+ kind: string;
30
+ startTime: number;
31
+ endTime: number;
32
+ duration: number;
33
+ resource?: Record<string, string | number | boolean>;
34
+ attributes?: Record<string, string | number | boolean>;
35
+ status?: {
36
+ code: string;
37
+ message?: string;
38
+ };
39
+ events?: Array<{
40
+ name: string;
41
+ timestamp: number;
42
+ attributes?: Record<string, string | number | boolean>;
43
+ }>;
44
+ }
45
+
46
+ /**
47
+ * Trace export format (from test setup)
48
+ */
49
+ export interface TraceExport {
50
+ exportedAt: string;
51
+ serviceName: string;
52
+ spanCount: number;
53
+ spans: TraceSpan[];
54
+ }
55
+
56
+ // ============================================================================
57
+ // Configuration
58
+ // ============================================================================
59
+
60
+ /**
61
+ * Options for trace-to-canvas conversion
62
+ */
63
+ export interface TraceToCanvasOptions {
64
+ /** Group spans by service into container nodes */
65
+ groupByService?: boolean;
66
+
67
+ /** Layout algorithm */
68
+ layout?: 'hierarchical' | 'timeline';
69
+
70
+ /** Node dimensions */
71
+ nodeWidth?: number;
72
+ nodeHeight?: number;
73
+
74
+ /** Spacing between nodes */
75
+ horizontalSpacing?: number;
76
+ verticalSpacing?: number;
77
+
78
+ /** Include span attributes in node data */
79
+ includeAttributes?: boolean;
80
+
81
+ /** Filter spans by minimum duration (ms) */
82
+ minDurationMs?: number;
83
+
84
+ /** Custom colors by span kind */
85
+ kindColors?: Partial<Record<OtelSpanKind, string>>;
86
+ }
87
+
88
+ const DEFAULT_OPTIONS: Required<TraceToCanvasOptions> = {
89
+ groupByService: true,
90
+ layout: 'hierarchical',
91
+ nodeWidth: 200,
92
+ nodeHeight: 60,
93
+ horizontalSpacing: 50,
94
+ verticalSpacing: 80,
95
+ includeAttributes: true,
96
+ minDurationMs: 0,
97
+ kindColors: {
98
+ SERVER: '#4f46e5', // Indigo
99
+ CLIENT: '#0891b2', // Cyan
100
+ PRODUCER: '#059669', // Emerald
101
+ CONSUMER: '#059669', // Emerald
102
+ INTERNAL: '#6b7280', // Gray
103
+ },
104
+ };
105
+
106
+ // ============================================================================
107
+ // Conversion Logic
108
+ // ============================================================================
109
+
110
+ /**
111
+ * Map span kind to node shape
112
+ */
113
+ function kindToShape(kind: string): PVNodeShape {
114
+ const shapes: Record<string, PVNodeShape> = {
115
+ SERVER: 'hexagon',
116
+ CLIENT: 'diamond',
117
+ PRODUCER: 'rectangle',
118
+ CONSUMER: 'rectangle',
119
+ INTERNAL: 'circle',
120
+ };
121
+ return shapes[kind] ?? 'rectangle';
122
+ }
123
+
124
+ /**
125
+ * Get service name from span resource
126
+ */
127
+ function getServiceName(span: TraceSpan): string {
128
+ return (span.resource?.['service.name'] as string) ?? 'unknown';
129
+ }
130
+
131
+ /**
132
+ * Format duration for display
133
+ */
134
+ function formatDuration(ms: number): string {
135
+ if (ms < 1) return `${(ms * 1000).toFixed(0)}μs`;
136
+ if (ms < 1000) return `${ms.toFixed(2)}ms`;
137
+ return `${(ms / 1000).toFixed(2)}s`;
138
+ }
139
+
140
+ /**
141
+ * Group spans by trace ID
142
+ */
143
+ function groupByTraceId(spans: TraceSpan[]): Map<string, TraceSpan[]> {
144
+ const traces = new Map<string, TraceSpan[]>();
145
+ for (const span of spans) {
146
+ const existing = traces.get(span.traceId) ?? [];
147
+ existing.push(span);
148
+ traces.set(span.traceId, existing);
149
+ }
150
+ return traces;
151
+ }
152
+
153
+ /**
154
+ * Build a tree structure from spans
155
+ */
156
+ interface SpanTree {
157
+ span: TraceSpan;
158
+ children: SpanTree[];
159
+ depth: number;
160
+ index: number;
161
+ }
162
+
163
+ function buildSpanTree(spans: TraceSpan[]): SpanTree[] {
164
+ const spanMap = new Map(spans.map((s) => [s.spanId, s]));
165
+ const childMap = new Map<string | undefined, TraceSpan[]>();
166
+
167
+ // Group by parent
168
+ for (const span of spans) {
169
+ const parentId = span.parentSpanId ?? undefined;
170
+ const siblings = childMap.get(parentId) ?? [];
171
+ siblings.push(span);
172
+ childMap.set(parentId, siblings);
173
+ }
174
+
175
+ // Build tree recursively
176
+ function buildNode(span: TraceSpan, depth: number, index: number): SpanTree {
177
+ const children = (childMap.get(span.spanId) ?? [])
178
+ .sort((a, b) => a.startTime - b.startTime)
179
+ .map((child, i) => buildNode(child, depth + 1, i));
180
+ return { span, children, depth, index };
181
+ }
182
+
183
+ // Find roots (spans with no parent or parent not in this trace)
184
+ const roots = spans.filter((s) => !s.parentSpanId || !spanMap.has(s.parentSpanId));
185
+
186
+ return roots.sort((a, b) => a.startTime - b.startTime).map((root, i) => buildNode(root, 0, i));
187
+ }
188
+
189
+ /**
190
+ * Calculate hierarchical layout positions
191
+ */
192
+ interface LayoutPosition {
193
+ x: number;
194
+ y: number;
195
+ }
196
+
197
+ function calculateHierarchicalLayout(
198
+ trees: SpanTree[],
199
+ options: Required<TraceToCanvasOptions>
200
+ ): Map<string, LayoutPosition> {
201
+ const positions = new Map<string, LayoutPosition>();
202
+ const { nodeWidth, nodeHeight, horizontalSpacing, verticalSpacing } = options;
203
+
204
+ // Track width at each depth level
205
+ const depthWidths = new Map<number, number>();
206
+
207
+ function layoutNode(node: SpanTree, offsetX: number): number {
208
+ const { span, children, depth } = node;
209
+
210
+ // Get current x position for this depth
211
+ const currentX = depthWidths.get(depth) ?? offsetX;
212
+ const y = depth * (nodeHeight + verticalSpacing);
213
+
214
+ if (children.length === 0) {
215
+ // Leaf node
216
+ positions.set(span.spanId, { x: currentX, y });
217
+ depthWidths.set(depth, currentX + nodeWidth + horizontalSpacing);
218
+ return currentX + nodeWidth / 2;
219
+ }
220
+
221
+ // Layout children first
222
+ const childCenters: number[] = [];
223
+ for (const child of children) {
224
+ const center = layoutNode(child, currentX);
225
+ childCenters.push(center);
226
+ }
227
+
228
+ // Center parent above children
229
+ const minCenter = Math.min(...childCenters);
230
+ const maxCenter = Math.max(...childCenters);
231
+ const parentCenter = (minCenter + maxCenter) / 2;
232
+ const parentX = parentCenter - nodeWidth / 2;
233
+
234
+ positions.set(span.spanId, { x: Math.max(currentX, parentX), y });
235
+
236
+ // Update depth width if needed
237
+ const newWidth = Math.max(depthWidths.get(depth) ?? 0, parentX + nodeWidth + horizontalSpacing);
238
+ depthWidths.set(depth, newWidth);
239
+
240
+ return parentCenter;
241
+ }
242
+
243
+ // Layout each tree
244
+ let offsetX = 0;
245
+ for (const tree of trees) {
246
+ layoutNode(tree, offsetX);
247
+ // Add gap between traces
248
+ offsetX = Math.max(...Array.from(depthWidths.values())) + horizontalSpacing;
249
+ }
250
+
251
+ return positions;
252
+ }
253
+
254
+ /**
255
+ * Convert a single span to a canvas node
256
+ */
257
+ function spanToNode(
258
+ span: TraceSpan,
259
+ position: LayoutPosition,
260
+ options: Required<TraceToCanvasOptions>
261
+ ): ExtendedCanvasTextNode {
262
+ const { nodeWidth, nodeHeight, kindColors, includeAttributes } = options;
263
+ const statusCode = span.status?.code ?? 'UNSET';
264
+
265
+ return {
266
+ id: span.spanId,
267
+ type: 'text',
268
+ x: position.x,
269
+ y: position.y,
270
+ width: nodeWidth,
271
+ height: nodeHeight,
272
+ text: span.name,
273
+ color: statusCode === 'ERROR' ? 1 : undefined, // Red for errors
274
+ pv: {
275
+ nodeType: 'span',
276
+ name: span.name,
277
+ description: formatDuration(span.duration),
278
+ shape: kindToShape(span.kind),
279
+ fill: statusCode === 'ERROR' ? '#ef4444' : kindColors[span.kind as OtelSpanKind],
280
+ states: {
281
+ [statusCode]: {
282
+ color: statusCode === 'OK' ? '#22c55e' : statusCode === 'ERROR' ? '#ef4444' : '#6b7280',
283
+ label: statusCode,
284
+ },
285
+ },
286
+ otel: {
287
+ kind: 'instance',
288
+ category: 'span',
289
+ },
290
+ ...(includeAttributes && span.attributes && Object.keys(span.attributes).length > 0
291
+ ? {
292
+ dataSchema: Object.fromEntries(
293
+ Object.entries(span.attributes).map(([key, value]) => [
294
+ key,
295
+ { type: typeof value as 'string' | 'number' | 'boolean', required: false },
296
+ ])
297
+ ),
298
+ }
299
+ : {}),
300
+ },
301
+ };
302
+ }
303
+
304
+ /**
305
+ * Create edge between parent and child span
306
+ */
307
+ function createEdge(
308
+ parentSpanId: string,
309
+ childSpanId: string,
310
+ isCrossService: boolean
311
+ ): ExtendedCanvasEdge {
312
+ return {
313
+ id: `edge-${parentSpanId}-${childSpanId}`,
314
+ fromNode: parentSpanId,
315
+ toNode: childSpanId,
316
+ fromSide: 'bottom',
317
+ toSide: 'top',
318
+ toEnd: 'arrow',
319
+ pv: {
320
+ edgeType: 'span-child',
321
+ style: isCrossService ? 'dashed' : 'solid',
322
+ width: isCrossService ? 2 : 1,
323
+ },
324
+ };
325
+ }
326
+
327
+ /**
328
+ * Create service group node
329
+ */
330
+ function createServiceGroup(
331
+ serviceName: string,
332
+ spans: TraceSpan[],
333
+ positions: Map<string, LayoutPosition>,
334
+ options: Required<TraceToCanvasOptions>
335
+ ): ExtendedCanvasGroupNode | null {
336
+ const serviceSpans = spans.filter((s) => getServiceName(s) === serviceName);
337
+ if (serviceSpans.length === 0) return null;
338
+
339
+ const servicePositions = serviceSpans
340
+ .map((s) => positions.get(s.spanId))
341
+ .filter((p): p is LayoutPosition => p !== undefined);
342
+
343
+ if (servicePositions.length === 0) return null;
344
+
345
+ const minX = Math.min(...servicePositions.map((p) => p.x));
346
+ const maxX = Math.max(...servicePositions.map((p) => p.x));
347
+ const minY = Math.min(...servicePositions.map((p) => p.y));
348
+ const maxY = Math.max(...servicePositions.map((p) => p.y));
349
+
350
+ const padding = 20;
351
+
352
+ return {
353
+ id: `service-${serviceName}`,
354
+ type: 'group',
355
+ x: minX - padding,
356
+ y: minY - padding - 30, // Extra space for label
357
+ width: maxX - minX + options.nodeWidth + padding * 2,
358
+ height: maxY - minY + options.nodeHeight + padding * 2 + 30,
359
+ label: serviceName,
360
+ pv: {
361
+ nodeType: 'service',
362
+ name: serviceName,
363
+ icon: 'server',
364
+ },
365
+ };
366
+ }
367
+
368
+ // ============================================================================
369
+ // Main Conversion Function
370
+ // ============================================================================
371
+
372
+ /**
373
+ * Result of trace-to-canvas conversion
374
+ */
375
+ export interface TraceCanvasResult {
376
+ canvas: ExtendedCanvas;
377
+ stats: {
378
+ traceCount: number;
379
+ spanCount: number;
380
+ serviceCount: number;
381
+ maxDepth: number;
382
+ };
383
+ }
384
+
385
+ /**
386
+ * Convert trace export to ExtendedCanvas
387
+ */
388
+ export function traceToCanvas(
389
+ traceExport: TraceExport,
390
+ options: TraceToCanvasOptions = {}
391
+ ): TraceCanvasResult {
392
+ const opts = { ...DEFAULT_OPTIONS, ...options };
393
+
394
+ // Filter spans by duration
395
+ const spans = traceExport.spans.filter((s) => s.duration >= opts.minDurationMs);
396
+
397
+ if (spans.length === 0) {
398
+ return {
399
+ canvas: {
400
+ name: 'Empty Trace',
401
+ nodes: [],
402
+ edges: [],
403
+ },
404
+ stats: {
405
+ traceCount: 0,
406
+ spanCount: 0,
407
+ serviceCount: 0,
408
+ maxDepth: 0,
409
+ },
410
+ };
411
+ }
412
+
413
+ // Group by trace and build trees
414
+ const traceGroups = groupByTraceId(spans);
415
+ const allTrees: SpanTree[] = [];
416
+ for (const traceSpans of traceGroups.values()) {
417
+ allTrees.push(...buildSpanTree(traceSpans));
418
+ }
419
+
420
+ // Calculate layout
421
+ const positions = calculateHierarchicalLayout(allTrees, opts);
422
+
423
+ // Create span nodes
424
+ const spanNodes: ExtendedCanvasTextNode[] = spans.map((span) => {
425
+ const position = positions.get(span.spanId) ?? { x: 0, y: 0 };
426
+ return spanToNode(span, position, opts);
427
+ });
428
+
429
+ // Create edges
430
+ const spanMap = new Map(spans.map((s) => [s.spanId, s]));
431
+ const edges: ExtendedCanvasEdge[] = spans
432
+ .filter((span) => span.parentSpanId && spanMap.has(span.parentSpanId))
433
+ .map((span) => {
434
+ const parent = spanMap.get(span.parentSpanId!)!;
435
+ const isCrossService = getServiceName(span) !== getServiceName(parent);
436
+ return createEdge(span.parentSpanId!, span.spanId, isCrossService);
437
+ });
438
+
439
+ // Create service groups if enabled
440
+ const serviceGroups: ExtendedCanvasGroupNode[] = [];
441
+ if (opts.groupByService) {
442
+ const services = new Set(spans.map(getServiceName));
443
+ for (const service of services) {
444
+ const group = createServiceGroup(service, spans, positions, opts);
445
+ if (group) serviceGroups.push(group);
446
+ }
447
+ }
448
+
449
+ // Calculate stats
450
+ const maxDepth = Math.max(
451
+ ...allTrees.flatMap(function getDepths(tree: SpanTree): number[] {
452
+ return [tree.depth, ...tree.children.flatMap(getDepths)];
453
+ })
454
+ );
455
+
456
+ // Build canvas
457
+ const canvas: ExtendedCanvas = {
458
+ name: `Trace: ${traceExport.serviceName}`,
459
+ nodes: [...serviceGroups, ...spanNodes],
460
+ edges,
461
+ pv: {
462
+ description: `Exported at ${traceExport.exportedAt}`,
463
+ nodeTypes: {
464
+ span: {
465
+ description: 'OpenTelemetry span from trace',
466
+ shape: 'rectangle',
467
+ },
468
+ service: {
469
+ description: 'Service grouping',
470
+ icon: 'server',
471
+ shape: 'rectangle',
472
+ },
473
+ },
474
+ edgeTypes: {
475
+ 'span-child': {
476
+ label: 'Child span',
477
+ directed: true,
478
+ },
479
+ },
480
+ display: {
481
+ layout: 'manual', // We've already laid out the nodes
482
+ animations: {
483
+ enabled: true,
484
+ speed: 1,
485
+ },
486
+ },
487
+ },
488
+ };
489
+
490
+ return {
491
+ canvas,
492
+ stats: {
493
+ traceCount: traceGroups.size,
494
+ spanCount: spans.length,
495
+ serviceCount: new Set(spans.map(getServiceName)).size,
496
+ maxDepth,
497
+ },
498
+ };
499
+ }
500
+
501
+ /**
502
+ * Convert trace export to canvas and return as JSON string
503
+ */
504
+ export function traceToCanvasJson(
505
+ traceExport: TraceExport,
506
+ options: TraceToCanvasOptions = {}
507
+ ): string {
508
+ const { canvas } = traceToCanvas(traceExport, options);
509
+ return JSON.stringify(canvas, null, 2);
510
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * YAML parsing utility for loading configuration files
3
+ *
4
+ * Provides error handling and validation for YAML configuration files.
5
+ * Supports both .yaml and .yml file extensions.
6
+ */
7
+
8
+ import * as yaml from 'js-yaml';
9
+ import { PathBasedGraphConfiguration } from '../types/path-based-config';
10
+
11
+ export interface YamlParseResult {
12
+ success: boolean;
13
+ data?: PathBasedGraphConfiguration;
14
+ error?: string;
15
+ }
16
+
17
+ /**
18
+ * Parse YAML content into a configuration object
19
+ *
20
+ * @param content - Raw YAML string content
21
+ * @param filename - Optional filename for error messages
22
+ * @returns Parse result with configuration or error
23
+ */
24
+ export function parseYaml(content: string, filename?: string): YamlParseResult {
25
+ try {
26
+ const data = yaml.load(content) as PathBasedGraphConfiguration;
27
+
28
+ if (!data) {
29
+ return {
30
+ success: false,
31
+ error: `Empty YAML file${filename ? `: ${filename}` : ''}`,
32
+ };
33
+ }
34
+
35
+ // Basic validation - ensure it has the required structure
36
+ if (!data.metadata || !data.nodeTypes || !data.edgeTypes) {
37
+ return {
38
+ success: false,
39
+ error: `Invalid configuration structure${
40
+ filename ? ` in ${filename}` : ''
41
+ }: missing required fields (metadata, nodeTypes, or edgeTypes)`,
42
+ };
43
+ }
44
+
45
+ return {
46
+ success: true,
47
+ data,
48
+ };
49
+ } catch (error) {
50
+ const errorMessage = error instanceof Error ? error.message : String(error);
51
+ return {
52
+ success: false,
53
+ error: `YAML parse error${filename ? ` in ${filename}` : ''}: ${errorMessage}`,
54
+ };
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Check if a filename has a valid YAML extension
60
+ *
61
+ * @param filename - Filename to check
62
+ * @returns True if filename ends with .yaml or .yml
63
+ */
64
+ export function isYamlFile(filename: string): boolean {
65
+ return filename.endsWith('.yaml') || filename.endsWith('.yml');
66
+ }
67
+
68
+ /**
69
+ * Extract configuration name from filename
70
+ * Removes the .yaml or .yml extension
71
+ *
72
+ * @param filename - Filename to process
73
+ * @returns Configuration name without extension
74
+ */
75
+ export function getConfigNameFromFilename(filename: string): string {
76
+ return filename.replace(/\.(yaml|yml)$/, '');
77
+ }