@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,560 @@
1
+ /**
2
+ * TraceOrchestrator - Coordinates the complete trace matching pipeline
3
+ *
4
+ * Pipeline:
5
+ * 1. Parse OTLP trace → extract resources and scopes
6
+ * 2. For each scope → lookup VersionSnapshot from registry
7
+ * 3. Match spans against workflows/scenarios
8
+ * 4. Categorize results into three categories
9
+ */
10
+
11
+ import type { OtelExportTraceServiceRequest, OtelSpanData } from '../types/otel';
12
+ import type {
13
+ RegisteredTrace,
14
+ StoryboardRegistryInterface,
15
+ TraceResource,
16
+ ScenarioMatch,
17
+ StoryboardMatch,
18
+ UnmatchedSpans,
19
+ UnmatchedSpan,
20
+ ValidationIssue,
21
+ MatchedSpan,
22
+ OrphanedSpan,
23
+ ScopeLookupResult,
24
+ } from '../types/registered-trace';
25
+ import type { DiscoveredStoryboardWithContent, DiscoveredWorkflowWithContent, DiscoveredCanvasWithContent } from '../discovery/types';
26
+ import type { ExtendedCanvas } from '../types/canvas';
27
+ import { OtlpTraceParser } from '../parsers/OtlpTraceParser';
28
+ import { SpanMatcher } from '../matchers/SpanMatcher';
29
+ import { selectScenario } from '../workflow/scenario-matcher';
30
+ import type { OtelEvent } from '../workflow/types';
31
+
32
+ /**
33
+ * Span with associated scope information
34
+ */
35
+ interface ScopeSpan {
36
+ scopeName: string;
37
+ scopeVersion: string;
38
+ spanId: string;
39
+ spanName: string;
40
+ traceId: string;
41
+ parentSpanId?: string;
42
+ startTime: number;
43
+ endTime: number;
44
+ duration: number;
45
+ attributes: Record<string, unknown>;
46
+ events: Array<{
47
+ name: string;
48
+ timestamp: number;
49
+ attributes: Record<string, unknown>;
50
+ }>;
51
+ status: { code: number; message?: string };
52
+ }
53
+
54
+ /**
55
+ * Scope with its VersionSnapshot (storyboards)
56
+ */
57
+ interface ScopeWithStoryboards {
58
+ scopeName: string;
59
+ scopeVersion: string;
60
+ lookupResult: ScopeLookupResult;
61
+ spanIds: string[];
62
+ }
63
+
64
+ /**
65
+ * Orchestrator configuration
66
+ */
67
+ export interface TraceOrchestratorConfig {
68
+ registry: StoryboardRegistryInterface;
69
+ enableValidation?: boolean;
70
+ }
71
+
72
+ /**
73
+ * Main orchestrator for trace matching
74
+ */
75
+ export class TraceOrchestrator {
76
+ private parser: OtlpTraceParser;
77
+
78
+ constructor(private config: TraceOrchestratorConfig) {
79
+ this.parser = new OtlpTraceParser();
80
+ }
81
+
82
+ /**
83
+ * Process an OTLP trace through the complete matching pipeline
84
+ */
85
+ async processTrace(otlpData: OtelExportTraceServiceRequest): Promise<RegisteredTrace> {
86
+ // Step 1: Parse trace to extract resources and basic info
87
+ const resources = this.parser.extractResources(otlpData);
88
+ const traceInfo = this.parser.extractTraceInfo(otlpData);
89
+
90
+ // Step 2: For each scope, lookup storyboards from registry
91
+ const scopeStoryboards = await this.lookupStoryboardsForScopes(resources);
92
+
93
+ // Step 3: Extract all spans with scope information
94
+ const allSpans = this.extractAllSpans(otlpData, resources);
95
+
96
+ // Step 4: Match spans against storyboards
97
+ const { scenarioMatches, storyboardMatches, unmatchedSpans } = await this.matchSpans(
98
+ allSpans,
99
+ scopeStoryboards
100
+ );
101
+
102
+ // Step 5: Validate if enabled
103
+ const validationIssues = this.config.enableValidation
104
+ ? this.validateMatches(scenarioMatches, storyboardMatches)
105
+ : undefined;
106
+
107
+ // Step 6: Build final RegisteredTrace
108
+ const registeredTrace: RegisteredTrace = {
109
+ traceId: traceInfo.traceId,
110
+ name: traceInfo.name,
111
+ startTime: traceInfo.startTime,
112
+ endTime: traceInfo.endTime,
113
+ duration: traceInfo.duration,
114
+ spanCount: traceInfo.spanCount,
115
+ hasErrors: traceInfo.hasErrors,
116
+ resources,
117
+ scenarioMatches,
118
+ storyboardMatches,
119
+ unmatchedSpans,
120
+ validationIssues,
121
+ otlpData, // Include original OTLP data
122
+ };
123
+
124
+ return registeredTrace;
125
+ }
126
+
127
+ /**
128
+ * Lookup storyboards from registry for each scope
129
+ */
130
+ private async lookupStoryboardsForScopes(
131
+ resources: TraceResource[]
132
+ ): Promise<ScopeWithStoryboards[]> {
133
+ const results: ScopeWithStoryboards[] = [];
134
+
135
+ for (const resource of resources) {
136
+ for (const scopeInfo of resource.scopes) {
137
+ const lookupResult = await this.config.registry.lookupByScope(
138
+ {
139
+ name: scopeInfo.scope.name,
140
+ version: scopeInfo.scope.version,
141
+ },
142
+ {
143
+ attributes: resource.attributes,
144
+ }
145
+ );
146
+
147
+ results.push({
148
+ scopeName: scopeInfo.scope.name,
149
+ scopeVersion: scopeInfo.scope.version,
150
+ lookupResult,
151
+ spanIds: scopeInfo.spanIds,
152
+ });
153
+ }
154
+ }
155
+
156
+ return results;
157
+ }
158
+
159
+ /**
160
+ * Extract all spans with their scope information
161
+ */
162
+ private extractAllSpans(
163
+ otlpData: OtelExportTraceServiceRequest,
164
+ resources: TraceResource[]
165
+ ): ScopeSpan[] {
166
+ const spans: ScopeSpan[] = [];
167
+ const seenSpanIds = new Set<string>();
168
+
169
+ for (const resource of resources) {
170
+ for (const scopeInfo of resource.scopes) {
171
+ const scopeSpans = this.parser.getSpansForScope(otlpData, scopeInfo.scope.name);
172
+
173
+ for (const span of scopeSpans) {
174
+ // Deduplicate spans by spanId - getSpansForScope may return same spans
175
+ // when called multiple times for the same scope across different resources
176
+ if (seenSpanIds.has(span.spanId)) {
177
+ continue;
178
+ }
179
+ seenSpanIds.add(span.spanId);
180
+
181
+ spans.push({
182
+ scopeName: scopeInfo.scope.name,
183
+ scopeVersion: scopeInfo.scope.version,
184
+ spanId: span.spanId,
185
+ spanName: span.spanName,
186
+ traceId: span.traceId,
187
+ parentSpanId: span.parentSpanId,
188
+ startTime: span.startTime,
189
+ endTime: span.endTime,
190
+ duration: span.duration,
191
+ attributes: span.attributes,
192
+ events: span.events,
193
+ status: span.status,
194
+ });
195
+ }
196
+ }
197
+ }
198
+
199
+ return spans;
200
+ }
201
+
202
+ /**
203
+ * Match spans against storyboards and categorize results
204
+ *
205
+ * Flow:
206
+ * 1. For each span, find workflows where spanPattern matches span name (exact match)
207
+ * 2. For matched workflows, run scenario matching against span events
208
+ * 3. Categorize into: scenario matches, storyboard matches (orphaned), unmatched
209
+ */
210
+ private async matchSpans(
211
+ spans: ScopeSpan[],
212
+ scopeStoryboards: ScopeWithStoryboards[]
213
+ ): Promise<{
214
+ scenarioMatches: ScenarioMatch[];
215
+ storyboardMatches: StoryboardMatch[];
216
+ unmatchedSpans: UnmatchedSpans;
217
+ }> {
218
+ const scenarioMatches: ScenarioMatch[] = [];
219
+ const storyboardMatches: StoryboardMatch[] = [];
220
+ const unmatchedSpansList: UnmatchedSpan[] = [];
221
+
222
+ const matchedSpanIds = new Set<string>();
223
+
224
+ // For each scope with storyboards
225
+ for (const scopeWithStoryboards of scopeStoryboards) {
226
+ if (!scopeWithStoryboards.lookupResult.found) {
227
+ // Lookup failed → all spans are unmatched with specific reason
228
+ const scopeSpans = spans.filter((s) => s.scopeName === scopeWithStoryboards.scopeName);
229
+ const reason = scopeWithStoryboards.lookupResult.reason === 'scope_not_owned'
230
+ ? `Scope "${scopeWithStoryboards.scopeName}" is not registered in any owned-scopes. Add it to library.yaml resources.owned-scopes`
231
+ : `Scope "${scopeWithStoryboards.scopeName}" is registered but has no storyboards defined in .principal-views/`;
232
+
233
+ for (const span of scopeSpans) {
234
+ unmatchedSpansList.push({
235
+ spanId: span.spanId,
236
+ parentSpanId: span.parentSpanId,
237
+ spanName: span.spanName,
238
+ scopeName: span.scopeName,
239
+ scopeVersion: span.scopeVersion,
240
+ timestamp: span.startTime,
241
+ duration: span.duration,
242
+ reason,
243
+ attributes: span.attributes,
244
+ });
245
+ // Mark as processed so we don't add it again in the final loop
246
+ matchedSpanIds.add(span.spanId);
247
+ }
248
+ continue;
249
+ }
250
+
251
+ // Get spans for this scope
252
+ const scopeSpans = spans.filter((s) => s.scopeName === scopeWithStoryboards.scopeName);
253
+
254
+ // Match against each storyboard's workflows
255
+ for (const storyboard of scopeWithStoryboards.lookupResult.snapshot.storyboards) {
256
+ // Validate that content is loaded
257
+ const sbWithContent = storyboard as DiscoveredStoryboardWithContent;
258
+ if (!this.isStoryboardWithContent(sbWithContent)) {
259
+ console.error('[TraceOrchestrator] Storyboard content not loaded:', storyboard.id);
260
+ continue;
261
+ }
262
+
263
+ // Get canvas for node highlighting (optional)
264
+ const canvas = sbWithContent.canvas as DiscoveredCanvasWithContent;
265
+ const spanMatcher = canvas?.content
266
+ ? new SpanMatcher(canvas.content as ExtendedCanvas)
267
+ : null;
268
+
269
+ // Match each span against workflows by spanPattern (exact match)
270
+ for (const span of scopeSpans) {
271
+ // Skip if already matched by another storyboard
272
+ if (matchedSpanIds.has(span.spanId)) continue;
273
+
274
+ // Find workflow where spanPattern matches span name
275
+ const workflowMatch = await this.matchSpanToWorkflow(
276
+ span,
277
+ sbWithContent,
278
+ scopeWithStoryboards.scopeName,
279
+ spanMatcher
280
+ );
281
+
282
+ if (workflowMatch) {
283
+ matchedSpanIds.add(span.spanId);
284
+
285
+ if (workflowMatch.type === 'scenario') {
286
+ scenarioMatches.push(workflowMatch.match as ScenarioMatch);
287
+ } else {
288
+ storyboardMatches.push(workflowMatch.match as StoryboardMatch);
289
+ }
290
+ }
291
+ }
292
+ }
293
+ }
294
+
295
+ // Collect unmatched spans (spans that didn't match any workflow's spanPattern)
296
+ for (const span of spans) {
297
+ if (!matchedSpanIds.has(span.spanId)) {
298
+ const scopeData = scopeStoryboards.find((s) => s.scopeName === span.scopeName);
299
+ let reason: string;
300
+
301
+ if (!scopeData || !scopeData.lookupResult.found) {
302
+ // This shouldn't happen as we already processed these in the loop above,
303
+ // but handle it defensively
304
+ if (scopeData && !scopeData.lookupResult.found) {
305
+ reason = scopeData.lookupResult.reason === 'scope_not_owned'
306
+ ? `Scope "${span.scopeName}" is not registered in any owned-scopes`
307
+ : `Scope "${span.scopeName}" has no storyboards`;
308
+ } else {
309
+ reason = `Scope "${span.scopeName}" not found in trace resources`;
310
+ }
311
+ } else {
312
+ reason = `No workflow spanPattern matched span "${span.spanName}"`;
313
+ }
314
+
315
+ unmatchedSpansList.push({
316
+ spanId: span.spanId,
317
+ parentSpanId: span.parentSpanId,
318
+ spanName: span.spanName,
319
+ scopeName: span.scopeName,
320
+ scopeVersion: span.scopeVersion,
321
+ timestamp: span.startTime,
322
+ duration: span.duration,
323
+ reason,
324
+ attributes: span.attributes,
325
+ });
326
+ }
327
+ }
328
+
329
+ const unmatchedSpans: UnmatchedSpans = {
330
+ spans: unmatchedSpansList,
331
+ };
332
+
333
+ return { scenarioMatches, storyboardMatches, unmatchedSpans };
334
+ }
335
+
336
+ /**
337
+ * Match a span against a storyboard's workflows by spanPattern
338
+ *
339
+ * Returns the first workflow where spanPattern === span.spanName,
340
+ * then runs scenario matching on that workflow.
341
+ */
342
+ private async matchSpanToWorkflow(
343
+ span: ScopeSpan,
344
+ storyboard: DiscoveredStoryboardWithContent,
345
+ scopeName: string,
346
+ spanMatcher: SpanMatcher | null
347
+ ): Promise<
348
+ | { type: 'scenario'; match: ScenarioMatch }
349
+ | { type: 'storyboard'; match: StoryboardMatch }
350
+ | null
351
+ > {
352
+ // Try each workflow in the storyboard
353
+ for (const workflow of storyboard.workflows) {
354
+ const wfWithContent = workflow as DiscoveredWorkflowWithContent;
355
+ if (!this.isWorkflowWithContent(wfWithContent)) {
356
+ console.error('[TraceOrchestrator] Workflow content not loaded:', workflow.id);
357
+ continue;
358
+ }
359
+
360
+ // Check if span name matches workflow's spanPattern (exact match)
361
+ const spanPattern = wfWithContent.content.spanPattern;
362
+ if (!spanPattern || span.spanName !== spanPattern) {
363
+ continue; // spanPattern doesn't match, try next workflow
364
+ }
365
+
366
+ // spanPattern matched! Now run scenario matching
367
+
368
+ // Convert span events to OtelEvent format for scenario matcher
369
+ // Include span attributes so templates can access them via @span namespace
370
+ const otelEvents: OtelEvent[] = span.events.map((e) => ({
371
+ name: e.name,
372
+ timestamp: e.timestamp,
373
+ attributes: e.attributes as Record<string, string | number | boolean>,
374
+ spanAttributes: span.attributes as Record<string, string | number | boolean>,
375
+ }));
376
+
377
+ // Get matched canvas node IDs (for visualization)
378
+ let matchedNodeIds: string[] = [];
379
+ if (spanMatcher) {
380
+ const otelSpan = this.convertToOtelSpan(span);
381
+ const matchResult = spanMatcher.matchSpan(otelSpan, { attributes: [] });
382
+ matchedNodeIds = matchResult.matchedNodeIds;
383
+ }
384
+
385
+ // Run scenario matching
386
+ const scenarioMatchResult = selectScenario(wfWithContent.content, otelEvents);
387
+
388
+ if (
389
+ scenarioMatchResult.recommendedScenario &&
390
+ scenarioMatchResult.recommendedScenario.matchPercentage > 0
391
+ ) {
392
+ // Category 1: Scenario Match
393
+ const detail = scenarioMatchResult.recommendedScenario;
394
+
395
+ const matchedSpans: MatchedSpan[] = matchedNodeIds.length > 0
396
+ ? matchedNodeIds.map((nodeId) => ({
397
+ spanId: span.spanId,
398
+ parentSpanId: span.parentSpanId,
399
+ spanName: span.spanName,
400
+ nodeId,
401
+ timestamp: span.startTime,
402
+ duration: span.duration,
403
+ events: detail.matchedEventNames,
404
+ attributes: span.attributes,
405
+ matchConfidence: 'exact' as const,
406
+ }))
407
+ : [{
408
+ spanId: span.spanId,
409
+ parentSpanId: span.parentSpanId,
410
+ spanName: span.spanName,
411
+ nodeId: 'workflow-root', // No canvas node matched, use placeholder
412
+ timestamp: span.startTime,
413
+ duration: span.duration,
414
+ events: detail.matchedEventNames,
415
+ attributes: span.attributes,
416
+ matchConfidence: 'exact' as const,
417
+ }];
418
+
419
+ return {
420
+ type: 'scenario',
421
+ match: {
422
+ storyboardId: storyboard.id,
423
+ storyboardName: storyboard.name,
424
+ workflowId: wfWithContent.id,
425
+ workflowName: wfWithContent.name,
426
+ scenarioId: detail.scenario.id,
427
+ scopeName,
428
+ scopeVersion: span.scopeVersion,
429
+ matchedSpans,
430
+ coveragePercent: detail.matchPercentage,
431
+ matchType: detail.matchPercentage === 100 ? 'full' : 'partial',
432
+ },
433
+ };
434
+ } else {
435
+ // Category 2: Storyboard Match (workflow matched, but scenario didn't)
436
+ const orphanedSpans: OrphanedSpan[] = [{
437
+ spanId: span.spanId,
438
+ parentSpanId: span.parentSpanId,
439
+ spanName: span.spanName,
440
+ nodeId: matchedNodeIds[0] || 'workflow-root',
441
+ timestamp: span.startTime,
442
+ duration: span.duration,
443
+ reason: 'Workflow spanPattern matched but no scenario matched the observed events',
444
+ observedEvents: span.events.map((e) => e.name),
445
+ expectedEvents: wfWithContent.content.scenarios.flatMap(
446
+ (s: { template: { events?: Record<string, unknown> } }) =>
447
+ Object.keys(s.template.events || {})
448
+ ),
449
+ attributes: span.attributes,
450
+ }];
451
+
452
+ return {
453
+ type: 'storyboard',
454
+ match: {
455
+ storyboardId: storyboard.id,
456
+ storyboardName: storyboard.name,
457
+ workflowId: wfWithContent.id,
458
+ workflowName: wfWithContent.name,
459
+ scopeName,
460
+ scopeVersion: span.scopeVersion,
461
+ orphanedSpans,
462
+ },
463
+ };
464
+ }
465
+ }
466
+
467
+ return null; // No workflow's spanPattern matched this span
468
+ }
469
+
470
+ /**
471
+ * Type guard to check if storyboard has content loaded
472
+ */
473
+ private isStoryboardWithContent(
474
+ storyboard: DiscoveredStoryboardWithContent
475
+ ): storyboard is DiscoveredStoryboardWithContent {
476
+ const canvas = storyboard.canvas as DiscoveredCanvasWithContent | undefined;
477
+ return canvas?.content !== undefined;
478
+ }
479
+
480
+ /**
481
+ * Convert ScopeSpan to OtelSpanData format
482
+ */
483
+ private convertToOtelSpan(span: ScopeSpan): OtelSpanData {
484
+ return {
485
+ traceId: span.traceId,
486
+ spanId: span.spanId,
487
+ name: span.spanName,
488
+ parentSpanId: span.parentSpanId,
489
+ kind: 1, // SPAN_KIND_INTERNAL (default - would be extracted from original OTLP)
490
+ startTimeUnixNano: String(span.startTime * 1000000), // Convert ms back to nanos
491
+ endTimeUnixNano: String(span.endTime * 1000000),
492
+ attributes: Object.entries(span.attributes || {}).map(([key, value]) => ({
493
+ key,
494
+ value: { stringValue: String(value) },
495
+ })),
496
+ events: span.events.map((e) => ({
497
+ timeUnixNano: String(e.timestamp * 1000000),
498
+ name: e.name,
499
+ attributes: Object.entries(e.attributes || {}).map(([key, value]) => ({
500
+ key,
501
+ value: { stringValue: String(value) },
502
+ })),
503
+ })),
504
+ status: span.status,
505
+ };
506
+ }
507
+
508
+ /**
509
+ * Type guard to check if workflow has content loaded
510
+ */
511
+ private isWorkflowWithContent(
512
+ workflow: DiscoveredWorkflowWithContent
513
+ ): workflow is DiscoveredWorkflowWithContent {
514
+ return workflow.content !== undefined;
515
+ }
516
+
517
+ /**
518
+ * Validate matches for common issues
519
+ */
520
+ private validateMatches(
521
+ scenarioMatches: ScenarioMatch[],
522
+ storyboardMatches: StoryboardMatch[]
523
+ ): ValidationIssue[] {
524
+ const issues: ValidationIssue[] = [];
525
+
526
+ // Check for duplicate scenario matches (same workflow + scenario matched twice)
527
+ const scenarioKeys = new Set<string>();
528
+ for (const match of scenarioMatches) {
529
+ // Include workflowId in key - different workflows can have same scenarioId (e.g., "success")
530
+ const key = `${match.storyboardId}:${match.workflowId}:${match.scenarioId}:${match.scopeName}`;
531
+ if (scenarioKeys.has(key)) {
532
+ issues.push({
533
+ level: 'warning',
534
+ category: 'matching',
535
+ message: `Duplicate scenario match detected for scope ${match.scopeName}`,
536
+ spanId: match.matchedSpans[0]?.spanId,
537
+ scopeName: match.scopeName,
538
+ });
539
+ }
540
+ scenarioKeys.add(key);
541
+ }
542
+
543
+ // Check for orphaned spans with no clear reason
544
+ for (const match of storyboardMatches) {
545
+ for (const orphan of match.orphanedSpans) {
546
+ if (!orphan.reason || orphan.reason.trim() === '') {
547
+ issues.push({
548
+ level: 'warning',
549
+ category: 'matching',
550
+ message: 'Orphaned span has no reason',
551
+ spanId: orphan.spanId,
552
+ scopeName: match.scopeName,
553
+ });
554
+ }
555
+ }
556
+ }
557
+
558
+ return issues;
559
+ }
560
+ }