@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,466 @@
1
+ import { describe, expect, test, beforeEach } from 'bun:test';
2
+ import { ConfigurationLoader } from './ConfigurationLoader';
3
+ // Types imported for documentation - they're part of the public API
4
+ import { InMemoryFileSystemAdapter } from '@principal-ai/repository-abstraction';
5
+ import type { PathBasedGraphConfiguration } from './types/path-based-config';
6
+
7
+ describe('ConfigurationLoader', () => {
8
+ let fsAdapter: InMemoryFileSystemAdapter;
9
+ let loader: ConfigurationLoader;
10
+
11
+ const validConfig: PathBasedGraphConfiguration = {
12
+ metadata: {
13
+ name: 'Test Config',
14
+ version: '1.0.0',
15
+ description: 'A test configuration',
16
+ },
17
+ nodeTypes: {
18
+ service: {
19
+ shape: 'rectangle',
20
+ color: '#4A90E2',
21
+ dataSchema: {
22
+ name: { type: 'string', required: true },
23
+ },
24
+ },
25
+ },
26
+ edgeTypes: {
27
+ call: {
28
+ style: 'solid',
29
+ color: '#999',
30
+ },
31
+ },
32
+ allowedConnections: [
33
+ {
34
+ from: 'service',
35
+ to: 'service',
36
+ via: 'call',
37
+ },
38
+ ],
39
+ };
40
+
41
+ beforeEach(() => {
42
+ fsAdapter = new InMemoryFileSystemAdapter();
43
+ loader = new ConfigurationLoader(fsAdapter);
44
+ });
45
+
46
+ describe('hasConfigDirectory', () => {
47
+ test('returns true when .principal-views directory exists', async () => {
48
+ await fsAdapter.createDir('/project/.principal-views');
49
+
50
+ expect(await loader.hasConfigDirectory('/project')).toBe(true);
51
+ });
52
+
53
+ test('returns false when .principal-views directory does not exist', async () => {
54
+ expect(await loader.hasConfigDirectory('/project')).toBe(false);
55
+ });
56
+
57
+ test('returns false when .principal-views exists but is not a directory', async () => {
58
+ await fsAdapter.writeFile('/project/.principal-views', 'not a directory');
59
+
60
+ expect(await loader.hasConfigDirectory('/project')).toBe(false);
61
+ });
62
+ });
63
+
64
+ describe('listConfigurations', () => {
65
+ test('returns empty array when .principal-views does not exist', async () => {
66
+ const configs = await loader.listConfigurations('/project');
67
+
68
+ expect(configs).toEqual([]);
69
+ });
70
+
71
+ test('returns list of configuration names', async () => {
72
+ await fsAdapter.createDir('/project/.principal-views');
73
+ await fsAdapter.writeFile(
74
+ '/project/.principal-views/architecture.yaml',
75
+ JSON.stringify(validConfig)
76
+ );
77
+ await fsAdapter.writeFile('/project/.principal-views/data-flow.yaml', JSON.stringify(validConfig));
78
+ await fsAdapter.writeFile('/project/.principal-views/deployment.yml', JSON.stringify(validConfig));
79
+
80
+ const configs = await loader.listConfigurations('/project');
81
+
82
+ expect(configs).toEqual(['architecture', 'data-flow', 'deployment']);
83
+ });
84
+
85
+ test('filters out non-YAML files', async () => {
86
+ await fsAdapter.createDir('/project/.principal-views');
87
+ await fsAdapter.writeFile('/project/.principal-views/config1.yaml', JSON.stringify(validConfig));
88
+ await fsAdapter.writeFile('/project/.principal-views/README.md', '# README');
89
+ await fsAdapter.writeFile('/project/.principal-views/config.json', '{}');
90
+
91
+ const configs = await loader.listConfigurations('/project');
92
+
93
+ expect(configs).toEqual(['config1']);
94
+ });
95
+
96
+ test('returns sorted configuration names', async () => {
97
+ await fsAdapter.createDir('/project/.principal-views');
98
+ await fsAdapter.writeFile('/project/.principal-views/zebra.yaml', JSON.stringify(validConfig));
99
+ await fsAdapter.writeFile('/project/.principal-views/alpha.yaml', JSON.stringify(validConfig));
100
+ await fsAdapter.writeFile('/project/.principal-views/middle.yaml', JSON.stringify(validConfig));
101
+
102
+ const configs = await loader.listConfigurations('/project');
103
+
104
+ expect(configs).toEqual(['alpha', 'middle', 'zebra']);
105
+ });
106
+ });
107
+
108
+ describe('loadByName', () => {
109
+ beforeEach(async () => {
110
+ await fsAdapter.createDir('/project/.principal-views');
111
+ });
112
+
113
+ test('loads configuration by name with .yaml extension', async () => {
114
+ const yamlContent = `
115
+ metadata:
116
+ name: Test Config
117
+ version: 1.0.0
118
+ nodeTypes:
119
+ service:
120
+ shape: rectangle
121
+ color: '#4A90E2'
122
+ dataSchema:
123
+ name:
124
+ type: string
125
+ required: true
126
+ edgeTypes:
127
+ call:
128
+ style: solid
129
+ color: '#999'
130
+ allowedConnections:
131
+ - from: service
132
+ to: service
133
+ via: call
134
+ `;
135
+ await fsAdapter.writeFile('/project/.principal-views/simple.yaml', yamlContent);
136
+
137
+ const result = await loader.loadByName('simple', '/project');
138
+
139
+ expect(result).not.toBeNull();
140
+ expect(result?.name).toBe('simple');
141
+ expect(result?.config.metadata.name).toBe('Test Config');
142
+ });
143
+
144
+ test('loads configuration by name with .yml extension', async () => {
145
+ const yamlContent = `
146
+ metadata:
147
+ name: Alternative Config
148
+ version: 2.0.0
149
+ nodeTypes:
150
+ component:
151
+ shape: hexagon
152
+ color: '#FF6B6B'
153
+ dataSchema:
154
+ id:
155
+ type: string
156
+ required: true
157
+ edgeTypes:
158
+ link:
159
+ style: dashed
160
+ color: '#888'
161
+ allowedConnections:
162
+ - from: component
163
+ to: component
164
+ via: link
165
+ `;
166
+ await fsAdapter.writeFile('/project/.principal-views/alt.yml', yamlContent);
167
+
168
+ const result = await loader.loadByName('alt', '/project');
169
+
170
+ expect(result).not.toBeNull();
171
+ expect(result?.name).toBe('alt');
172
+ expect(result?.config.metadata.name).toBe('Alternative Config');
173
+ });
174
+
175
+ test('returns null when configuration does not exist', async () => {
176
+ const result = await loader.loadByName('nonexistent', '/project');
177
+
178
+ expect(result).toBeNull();
179
+ });
180
+
181
+ test('returns null when .principal-views directory does not exist', async () => {
182
+ const result = await loader.loadByName('any', '/no-project');
183
+
184
+ expect(result).toBeNull();
185
+ });
186
+
187
+ test('returns null when YAML is invalid', async () => {
188
+ await fsAdapter.writeFile('/project/.principal-views/invalid.yaml', 'invalid: yaml: content:');
189
+
190
+ const result = await loader.loadByName('invalid', '/project');
191
+
192
+ expect(result).toBeNull();
193
+ });
194
+
195
+ test('returns null when configuration structure is invalid', async () => {
196
+ const yamlContent = `
197
+ metadata:
198
+ name: Incomplete
199
+ nodeTypes: {}
200
+ # Missing edgeTypes and allowedConnections
201
+ `;
202
+ await fsAdapter.writeFile('/project/.principal-views/incomplete.yaml', yamlContent);
203
+
204
+ const result = await loader.loadByName('incomplete', '/project');
205
+
206
+ expect(result).toBeNull();
207
+ });
208
+
209
+ test('prefers .yaml over .yml when both exist', async () => {
210
+ const yamlContent = `
211
+ metadata:
212
+ name: YAML Version
213
+ version: 1.0.0
214
+ nodeTypes:
215
+ service:
216
+ shape: rectangle
217
+ dataSchema:
218
+ name:
219
+ type: string
220
+ edgeTypes:
221
+ call:
222
+ style: solid
223
+ allowedConnections:
224
+ - from: service
225
+ to: service
226
+ via: call
227
+ `;
228
+ const ymlContent = `
229
+ metadata:
230
+ name: YML Version
231
+ version: 1.0.0
232
+ nodeTypes:
233
+ service:
234
+ shape: rectangle
235
+ dataSchema:
236
+ name:
237
+ type: string
238
+ edgeTypes:
239
+ call:
240
+ style: solid
241
+ allowedConnections:
242
+ - from: service
243
+ to: service
244
+ via: call
245
+ `;
246
+ await fsAdapter.writeFile('/project/.principal-views/both.yaml', yamlContent);
247
+ await fsAdapter.writeFile('/project/.principal-views/both.yml', ymlContent);
248
+
249
+ const result = await loader.loadByName('both', '/project');
250
+
251
+ expect(result).not.toBeNull();
252
+ expect(result?.config.metadata.name).toBe('YAML Version');
253
+ });
254
+ });
255
+
256
+ describe('loadAll', () => {
257
+ test('returns error when .principal-views directory does not exist', async () => {
258
+ const result = await loader.loadAll('/project');
259
+
260
+ expect(result.configs).toEqual([]);
261
+ expect(result.errors).toHaveLength(1);
262
+ expect(result.errors[0].file).toBe('.principal-views');
263
+ expect(result.errors[0].error).toContain('not found');
264
+ });
265
+
266
+ test('loads all valid configurations', async () => {
267
+ await fsAdapter.createDir('/project/.principal-views');
268
+
269
+ const config1 = `
270
+ metadata:
271
+ name: Config 1
272
+ version: 1.0.0
273
+ nodeTypes:
274
+ service:
275
+ shape: rectangle
276
+ dataSchema:
277
+ name:
278
+ type: string
279
+ edgeTypes:
280
+ call:
281
+ style: solid
282
+ allowedConnections:
283
+ - from: service
284
+ to: service
285
+ via: call
286
+ `;
287
+ const config2 = `
288
+ metadata:
289
+ name: Config 2
290
+ version: 2.0.0
291
+ nodeTypes:
292
+ component:
293
+ shape: hexagon
294
+ dataSchema:
295
+ id:
296
+ type: string
297
+ edgeTypes:
298
+ link:
299
+ style: dashed
300
+ allowedConnections:
301
+ - from: component
302
+ to: component
303
+ via: link
304
+ `;
305
+
306
+ await fsAdapter.writeFile('/project/.principal-views/first.yaml', config1);
307
+ await fsAdapter.writeFile('/project/.principal-views/second.yml', config2);
308
+
309
+ const result = await loader.loadAll('/project');
310
+
311
+ expect(result.configs).toHaveLength(2);
312
+ expect(result.errors).toEqual([]);
313
+ expect(result.configs[0].name).toBe('first');
314
+ expect(result.configs[1].name).toBe('second');
315
+ });
316
+
317
+ test('skips non-YAML files', async () => {
318
+ await fsAdapter.createDir('/project/.principal-views');
319
+
320
+ const validYaml = `
321
+ metadata:
322
+ name: Valid
323
+ version: 1.0.0
324
+ nodeTypes:
325
+ service:
326
+ shape: rectangle
327
+ dataSchema:
328
+ name:
329
+ type: string
330
+ edgeTypes:
331
+ call:
332
+ style: solid
333
+ allowedConnections:
334
+ - from: service
335
+ to: service
336
+ via: call
337
+ `;
338
+
339
+ await fsAdapter.writeFile('/project/.principal-views/valid.yaml', validYaml);
340
+ await fsAdapter.writeFile('/project/.principal-views/README.md', '# README');
341
+ await fsAdapter.writeFile('/project/.principal-views/config.json', '{}');
342
+
343
+ const result = await loader.loadAll('/project');
344
+
345
+ expect(result.configs).toHaveLength(1);
346
+ expect(result.configs[0].name).toBe('valid');
347
+ expect(result.errors).toEqual([]);
348
+ });
349
+
350
+ test('collects errors for invalid files', async () => {
351
+ await fsAdapter.createDir('/project/.principal-views');
352
+
353
+ const validYaml = `
354
+ metadata:
355
+ name: Valid
356
+ version: 1.0.0
357
+ nodeTypes:
358
+ service:
359
+ shape: rectangle
360
+ dataSchema:
361
+ name:
362
+ type: string
363
+ edgeTypes:
364
+ call:
365
+ style: solid
366
+ allowedConnections:
367
+ - from: service
368
+ to: service
369
+ via: call
370
+ `;
371
+
372
+ await fsAdapter.writeFile('/project/.principal-views/valid.yaml', validYaml);
373
+ await fsAdapter.writeFile('/project/.principal-views/invalid-yaml.yaml', 'invalid: yaml: content:');
374
+ await fsAdapter.writeFile(
375
+ '/project/.principal-views/incomplete.yaml',
376
+ 'metadata:\n name: Incomplete\nnodeTypes: {}'
377
+ );
378
+
379
+ const result = await loader.loadAll('/project');
380
+
381
+ expect(result.configs).toHaveLength(1);
382
+ expect(result.configs[0].name).toBe('valid');
383
+ expect(result.errors.length).toBeGreaterThan(0);
384
+ });
385
+
386
+ test('returns configs sorted by name', async () => {
387
+ await fsAdapter.createDir('/project/.principal-views');
388
+
389
+ const configTemplate = (name: string) => `
390
+ metadata:
391
+ name: ${name}
392
+ version: 1.0.0
393
+ nodeTypes:
394
+ service:
395
+ shape: rectangle
396
+ dataSchema:
397
+ name:
398
+ type: string
399
+ edgeTypes:
400
+ call:
401
+ style: solid
402
+ allowedConnections:
403
+ - from: service
404
+ to: service
405
+ via: call
406
+ `;
407
+
408
+ await fsAdapter.writeFile('/project/.principal-views/zebra.yaml', configTemplate('Zebra'));
409
+ await fsAdapter.writeFile('/project/.principal-views/alpha.yaml', configTemplate('Alpha'));
410
+ await fsAdapter.writeFile('/project/.principal-views/middle.yaml', configTemplate('Middle'));
411
+
412
+ const result = await loader.loadAll('/project');
413
+
414
+ expect(result.configs).toHaveLength(3);
415
+ expect(result.configs[0].name).toBe('alpha');
416
+ expect(result.configs[1].name).toBe('middle');
417
+ expect(result.configs[2].name).toBe('zebra');
418
+ });
419
+
420
+ test('handles mixed .yaml and .yml extensions', async () => {
421
+ await fsAdapter.createDir('/project/.principal-views');
422
+
423
+ const configTemplate = (name: string) => `
424
+ metadata:
425
+ name: ${name}
426
+ version: 1.0.0
427
+ nodeTypes:
428
+ service:
429
+ shape: rectangle
430
+ dataSchema:
431
+ name:
432
+ type: string
433
+ edgeTypes:
434
+ call:
435
+ style: solid
436
+ allowedConnections:
437
+ - from: service
438
+ to: service
439
+ via: call
440
+ `;
441
+
442
+ await fsAdapter.writeFile('/project/.principal-views/config1.yaml', configTemplate('Config 1'));
443
+ await fsAdapter.writeFile('/project/.principal-views/config2.yml', configTemplate('Config 2'));
444
+
445
+ const result = await loader.loadAll('/project');
446
+
447
+ expect(result.configs).toHaveLength(2);
448
+ expect(result.errors).toEqual([]);
449
+ });
450
+ });
451
+
452
+ describe('getConfigDirectoryPath', () => {
453
+ test('returns correct .principal-views path', async () => {
454
+ const path = loader.getConfigDirectoryPath('/my/project');
455
+
456
+ expect(path).toBe('/my/project/.principal-views');
457
+ });
458
+
459
+ test('handles trailing slashes', async () => {
460
+ const path = loader.getConfigDirectoryPath('/my/project/');
461
+
462
+ // The path should be consistent regardless of trailing slash
463
+ expect(path).toContain('.principal-views');
464
+ });
465
+ });
466
+ });
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Configuration loader for managing multiple graph configurations
3
+ *
4
+ * Supports loading configurations from the .principal-views/ folder using the adapter pattern
5
+ * for environment-agnostic file operations.
6
+ */
7
+
8
+ import type { FileSystemAdapter } from '@principal-ai/repository-abstraction';
9
+ import type { PathBasedGraphConfiguration } from './types/path-based-config';
10
+ import { parseYaml, isYamlFile, getConfigNameFromFilename } from './utils/YamlParser';
11
+
12
+ /**
13
+ * Represents a single configuration file
14
+ */
15
+ export interface ConfigurationFile {
16
+ /** Configuration name (filename without extension) */
17
+ name: string;
18
+ /** Full path to the configuration file */
19
+ path: string;
20
+ /** Parsed configuration data */
21
+ config: PathBasedGraphConfiguration;
22
+ }
23
+
24
+ /**
25
+ * Result of loading all configurations
26
+ */
27
+ export interface ConfigurationLoadResult {
28
+ /** Successfully loaded configurations */
29
+ configs: ConfigurationFile[];
30
+ /** Errors encountered during loading */
31
+ errors: Array<{ file: string; error: string }>;
32
+ }
33
+
34
+ /**
35
+ * Loader for managing multiple graph configurations from .principal-views/ folder
36
+ */
37
+ export class ConfigurationLoader {
38
+ private static readonly CONFIG_DIR = '.principal-views';
39
+
40
+ constructor(private fsAdapter: FileSystemAdapter) {}
41
+
42
+ /**
43
+ * Check if the .principal-views/ configuration directory exists
44
+ *
45
+ * @param baseDir - Base directory to search from
46
+ * @returns True if .principal-views/ directory exists
47
+ */
48
+ async hasConfigDirectory(baseDir: string): Promise<boolean> {
49
+ const configPath = this.fsAdapter.join(baseDir, ConfigurationLoader.CONFIG_DIR);
50
+ const exists = await this.fsAdapter.exists(configPath);
51
+ if (!exists) return false;
52
+ return await this.fsAdapter.isDirectory(configPath);
53
+ }
54
+
55
+ /**
56
+ * List all available configuration names in .principal-views/ folder
57
+ *
58
+ * @param baseDir - Base directory containing .principal-views/ folder
59
+ * @returns Array of configuration names (without extensions)
60
+ */
61
+ async listConfigurations(baseDir: string): Promise<string[]> {
62
+ if (!(await this.hasConfigDirectory(baseDir))) {
63
+ return [];
64
+ }
65
+
66
+ const configPath = this.fsAdapter.join(baseDir, ConfigurationLoader.CONFIG_DIR);
67
+ const files = await this.fsAdapter.readDir(configPath);
68
+
69
+ return files.filter(isYamlFile).map(getConfigNameFromFilename).sort();
70
+ }
71
+
72
+ /**
73
+ * Load a specific configuration by name
74
+ *
75
+ * @param name - Configuration name (without extension)
76
+ * @param baseDir - Base directory containing .principal-views/ folder
77
+ * @returns Configuration file or null if not found/invalid
78
+ */
79
+ async loadByName(name: string, baseDir: string): Promise<ConfigurationFile | null> {
80
+ if (!(await this.hasConfigDirectory(baseDir))) {
81
+ return null;
82
+ }
83
+
84
+ const configPath = this.fsAdapter.join(baseDir, ConfigurationLoader.CONFIG_DIR);
85
+
86
+ // Try both .yaml and .yml extensions
87
+ for (const ext of ['yaml', 'yml']) {
88
+ const filename = `${name}.${ext}`;
89
+ const fullPath = this.fsAdapter.join(configPath, filename);
90
+
91
+ if (await this.fsAdapter.exists(fullPath)) {
92
+ try {
93
+ const content = await this.fsAdapter.readFile(fullPath);
94
+ const parseResult = parseYaml(content, filename);
95
+
96
+ if (parseResult.success && parseResult.data) {
97
+ return {
98
+ name,
99
+ path: fullPath,
100
+ config: parseResult.data,
101
+ };
102
+ }
103
+ } catch (error) {
104
+ // File exists but couldn't be read or parsed
105
+ return null;
106
+ }
107
+ }
108
+ }
109
+
110
+ return null;
111
+ }
112
+
113
+ /**
114
+ * Load all configurations from .principal-views/ folder
115
+ *
116
+ * @param baseDir - Base directory containing .principal-views/ folder
117
+ * @returns Result containing all loaded configs and any errors
118
+ */
119
+ async loadAll(baseDir: string): Promise<ConfigurationLoadResult> {
120
+ const result: ConfigurationLoadResult = {
121
+ configs: [],
122
+ errors: [],
123
+ };
124
+
125
+ if (!(await this.hasConfigDirectory(baseDir))) {
126
+ result.errors.push({
127
+ file: '.principal-views',
128
+ error: 'Configuration directory .principal-views/ not found',
129
+ });
130
+ return result;
131
+ }
132
+
133
+ const configPath = this.fsAdapter.join(baseDir, ConfigurationLoader.CONFIG_DIR);
134
+ const files = await this.fsAdapter.readDir(configPath);
135
+
136
+ for (const filename of files) {
137
+ if (!isYamlFile(filename)) {
138
+ continue; // Skip non-YAML files
139
+ }
140
+
141
+ const fullPath = this.fsAdapter.join(configPath, filename);
142
+ const name = getConfigNameFromFilename(filename);
143
+
144
+ try {
145
+ const content = await this.fsAdapter.readFile(fullPath);
146
+ const parseResult = parseYaml(content, filename);
147
+
148
+ if (parseResult.success && parseResult.data) {
149
+ result.configs.push({
150
+ name,
151
+ path: fullPath,
152
+ config: parseResult.data,
153
+ });
154
+ } else if (parseResult.error) {
155
+ result.errors.push({
156
+ file: filename,
157
+ error: parseResult.error,
158
+ });
159
+ }
160
+ } catch (error) {
161
+ const errorMessage = error instanceof Error ? error.message : String(error);
162
+ result.errors.push({
163
+ file: filename,
164
+ error: `Failed to read file: ${errorMessage}`,
165
+ });
166
+ }
167
+ }
168
+
169
+ // Sort configs by name for consistent ordering
170
+ result.configs.sort((a, b) => a.name.localeCompare(b.name));
171
+
172
+ return result;
173
+ }
174
+
175
+ /**
176
+ * Get the configuration directory path
177
+ *
178
+ * @param baseDir - Base directory
179
+ * @returns Full path to .principal-views/ directory
180
+ */
181
+ getConfigDirectoryPath(baseDir: string): string {
182
+ return this.fsAdapter.join(baseDir, ConfigurationLoader.CONFIG_DIR);
183
+ }
184
+ }