@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,200 @@
1
+ import type {
2
+ EdgeEvent,
3
+ GraphEvent,
4
+ GraphState,
5
+ StateEvent,
6
+ ValidationResult,
7
+ ValidationRules,
8
+ Violation,
9
+ Warning,
10
+ } from './types';
11
+
12
+ /**
13
+ * ValidationEngine checks events against defined rules
14
+ */
15
+ export class ValidationEngine {
16
+ private rules: ValidationRules;
17
+ private violationCount = 0;
18
+ private warningCount = 0;
19
+
20
+ constructor(rules: ValidationRules) {
21
+ this.rules = rules;
22
+ }
23
+
24
+ /**
25
+ * Validate an event against all rules
26
+ */
27
+ validate(event: GraphEvent, state: GraphState): ValidationResult {
28
+ const violations: Violation[] = [];
29
+ const warnings: Warning[] = [];
30
+
31
+ // Check connection rules
32
+ if (event.category === 'edge' && event.operation === 'create') {
33
+ violations.push(...this.validateConnection(event, state));
34
+ }
35
+
36
+ // Check state transition rules
37
+ if (event.category === 'state') {
38
+ violations.push(...this.validateStateTransition(event, state));
39
+ }
40
+
41
+ // Check if event was expected
42
+ if (event.expected === false) {
43
+ violations.push(this.createUnexpectedEventViolation(event));
44
+ }
45
+
46
+ // Update counters
47
+ this.violationCount += violations.filter((v) => v.severity === 'error').length;
48
+ this.warningCount += violations.filter((v) => v.severity === 'warning').length;
49
+
50
+ return {
51
+ valid: violations.filter((v) => v.severity === 'error').length === 0,
52
+ violations,
53
+ warnings,
54
+ metrics: {
55
+ totalEvents: 1,
56
+ validEvents: violations.length === 0 ? 1 : 0,
57
+ violations: violations.filter((v) => v.severity === 'error').length,
58
+ warnings: violations.filter((v) => v.severity === 'warning').length,
59
+ unexpectedEvents: event.expected === false ? 1 : 0,
60
+ expectedEventsMissing: 0,
61
+ },
62
+ };
63
+ }
64
+
65
+ /**
66
+ * Check constraints across the entire graph state
67
+ */
68
+ checkConstraints(state: GraphState): Violation[] {
69
+ const violations: Violation[] = [];
70
+
71
+ // Check cardinality constraints
72
+ if (this.rules.cardinality) {
73
+ for (const [nodeType, rule] of Object.entries(this.rules.cardinality)) {
74
+ const count = Array.from(state.nodes.values()).filter((n) => n.type === nodeType).length;
75
+
76
+ if (rule.min !== undefined && count < rule.min) {
77
+ violations.push({
78
+ id: `cardinality-${nodeType}-min`,
79
+ severity: 'error',
80
+ type: 'cardinality',
81
+ description: `Node type '${nodeType}' has ${count} instances but requires at least ${rule.min}`,
82
+ });
83
+ }
84
+
85
+ if (rule.max !== undefined && count > rule.max) {
86
+ violations.push({
87
+ id: `cardinality-${nodeType}-max`,
88
+ severity: 'error',
89
+ type: 'cardinality',
90
+ description: `Node type '${nodeType}' has ${count} instances but allows at most ${rule.max}`,
91
+ });
92
+ }
93
+ }
94
+ }
95
+
96
+ return violations;
97
+ }
98
+
99
+ /**
100
+ * Validate connection rules
101
+ */
102
+ private validateConnection(event: GraphEvent, state: GraphState): Violation[] {
103
+ const violations: Violation[] = [];
104
+ const payload = event.payload as EdgeEvent;
105
+
106
+ // Get the nodes being connected
107
+ const fromNode = state.nodes.get(payload.from);
108
+ const toNode = state.nodes.get(payload.to);
109
+
110
+ if (!fromNode || !toNode) {
111
+ violations.push({
112
+ id: `connection-${event.id}`,
113
+ severity: 'error',
114
+ type: 'connection',
115
+ description: 'Cannot create edge: one or both nodes do not exist',
116
+ event,
117
+ context: {
118
+ edgeId: payload.edgeId,
119
+ },
120
+ });
121
+ return violations;
122
+ }
123
+
124
+ // Check if this connection is allowed
125
+ const allowedConnections = state.configuration.allowedConnections || [];
126
+ const isAllowed = allowedConnections.some(
127
+ (rule) =>
128
+ rule.from === fromNode.type && rule.to === toNode.type && rule.via === payload.edgeType
129
+ );
130
+
131
+ if (!isAllowed) {
132
+ violations.push({
133
+ id: `connection-${event.id}`,
134
+ severity: 'error',
135
+ type: 'connection',
136
+ description: `Connection from '${fromNode.type}' to '${toNode.type}' via '${payload.edgeType}' is not allowed`,
137
+ event,
138
+ context: {
139
+ edgeId: payload.edgeId,
140
+ },
141
+ });
142
+ }
143
+
144
+ return violations;
145
+ }
146
+
147
+ /**
148
+ * Validate state transitions
149
+ */
150
+ private validateStateTransition(event: GraphEvent, state: GraphState): Violation[] {
151
+ const violations: Violation[] = [];
152
+ const payload = event.payload as StateEvent;
153
+
154
+ const node = state.nodes.get(payload.nodeId);
155
+ if (!node) {
156
+ return violations;
157
+ }
158
+
159
+ const transitions = this.rules.stateTransitions?.[node.type];
160
+ if (!transitions) {
161
+ return violations;
162
+ }
163
+
164
+ const currentState = payload.previousState || node.state;
165
+ const newState = payload.newState;
166
+
167
+ // Find valid transitions from current state
168
+ const validTransition = transitions.find((t) => t.from === currentState);
169
+
170
+ if (validTransition && !validTransition.to.includes(newState)) {
171
+ violations.push({
172
+ id: `state-transition-${event.id}`,
173
+ severity: 'error',
174
+ type: 'state',
175
+ description: `Invalid state transition for '${
176
+ node.type
177
+ }': ${currentState} -> ${newState}. Valid transitions: ${validTransition.to.join(', ')}`,
178
+ event,
179
+ context: {
180
+ nodeId: payload.nodeId,
181
+ },
182
+ });
183
+ }
184
+
185
+ return violations;
186
+ }
187
+
188
+ /**
189
+ * Create violation for unexpected event
190
+ */
191
+ private createUnexpectedEventViolation(event: GraphEvent): Violation {
192
+ return {
193
+ id: `unexpected-${event.id}`,
194
+ severity: 'warning',
195
+ type: 'unexpected_event',
196
+ description: `Unexpected event: ${event.type}`,
197
+ event,
198
+ };
199
+ }
200
+ }
@@ -0,0 +1,225 @@
1
+ import path from "node:path";
2
+ import {
3
+ accumulateToAgentSessionEvents,
4
+ type AgentSessionEvent,
5
+ type NormalizedPathInfo,
6
+ type RepoNormalizedUniversalAgentSessionEvent,
7
+ } from "@principal-ai/agent-monitoring";
8
+
9
+ /**
10
+ * Frozen File City agent-session fixture generation.
11
+ *
12
+ * Reproduces the shape the file-city-panel fixture loaders consume
13
+ * (`{ generatedFrom, session, events }`): repo-normalized universal events are
14
+ * accumulated into agent-session events, then layer item paths (repo-relative
15
+ * displayPaths) are rewritten back to absolute paths with a per-repo
16
+ * files/edits manifest. The result is a static snapshot — no pipeline runs at
17
+ * story time.
18
+ */
19
+
20
+ export interface AgentSessionFixtureMeta {
21
+ sessionName: string;
22
+ sessionTask: string;
23
+ workingDirectory: string;
24
+ createdAt?: string;
25
+ }
26
+
27
+ export interface AgentSessionFixtureRepo {
28
+ repo: string;
29
+ root: string;
30
+ files: number;
31
+ edits: number;
32
+ }
33
+
34
+ export interface AgentSessionFixtureSummary {
35
+ sessionId: string;
36
+ agent: string;
37
+ sessionName: string;
38
+ sessionTask: string;
39
+ workingDirectory: string;
40
+ rawEventCount: number;
41
+ agentEventCount: number;
42
+ repos: AgentSessionFixtureRepo[];
43
+ /** Distinct model ids the session used, in first-use order. */
44
+ models?: string[];
45
+ }
46
+
47
+ export interface FixtureLayerItem {
48
+ path: string;
49
+ type: "file" | "directory";
50
+ renderStrategy?: "border" | "fill" | "glow" | "pattern" | "cover" | "icon" | "custom";
51
+ }
52
+
53
+ export interface FixtureHighlightLayer {
54
+ id: string;
55
+ name: string;
56
+ enabled: boolean;
57
+ color: string;
58
+ opacity?: number;
59
+ borderWidth?: number;
60
+ priority: number;
61
+ dynamic?: boolean;
62
+ items: FixtureLayerItem[];
63
+ }
64
+
65
+ export interface FixtureAgentSessionEvent {
66
+ id: string;
67
+ timestamp: number;
68
+ sessionId: string;
69
+ sessionName: string;
70
+ sessionColor: string;
71
+ operation: AgentSessionEvent["operation"];
72
+ files: string[];
73
+ dependencies: string[];
74
+ description: string;
75
+ layers: FixtureHighlightLayer[];
76
+ contextTokens?: number;
77
+ subagentType?: string;
78
+ childSessionId?: string;
79
+ toolName?: string;
80
+ }
81
+
82
+ export interface AgentSessionFixture {
83
+ generatedFrom: string;
84
+ session: AgentSessionFixtureSummary;
85
+ events: FixtureAgentSessionEvent[];
86
+ }
87
+
88
+ function repoLabel(nf: { repository?: { gitRoot?: string; repo?: string } }): string {
89
+ if (nf.repository?.repo) return nf.repository.repo;
90
+ if (nf.repository?.gitRoot) return path.basename(nf.repository.gitRoot);
91
+ return "";
92
+ }
93
+
94
+ function repoRoot(nf: { repository?: { gitRoot?: string } }): string {
95
+ return nf.repository?.gitRoot ?? "";
96
+ }
97
+
98
+ /**
99
+ * Extract a model id from a model value — agents set it inconsistently
100
+ * (opencode stores `{ providerID, modelID }`-shaped objects, cline / grok /
101
+ * pi store a plain string id).
102
+ */
103
+ function modelIdOf(value: unknown): string | undefined {
104
+ if (typeof value === "string" && value.length > 0) return value;
105
+ if (value && typeof value === "object") {
106
+ const o = value as Record<string, unknown>;
107
+ for (const key of ["modelID", "id"]) {
108
+ if (typeof o[key] === "string" && (o[key] as string).length > 0) {
109
+ return o[key] as string;
110
+ }
111
+ }
112
+ }
113
+ return undefined;
114
+ }
115
+
116
+ /** Pull the model id from one event — normalized `data.model` first, then the
117
+ * raw opencode `info` blob (the bridge only copies `info.model` onto
118
+ * normalized events when the session's created event carried it). */
119
+ function eventModelId(e: RepoNormalizedUniversalAgentSessionEvent): string | undefined {
120
+ const direct = modelIdOf(e.data?.["model"]);
121
+ if (direct) return direct;
122
+ const raw = e.raw as { data?: { info?: { model?: unknown } } } | undefined;
123
+ return modelIdOf(raw?.data?.info?.model);
124
+ }
125
+
126
+ /** Distinct model ids across a session's events, in first-seen order. */
127
+ function collectModels(events: RepoNormalizedUniversalAgentSessionEvent[]): string[] {
128
+ const seen = new Set<string>();
129
+ const models: string[] = [];
130
+ for (const e of events) {
131
+ const id = eventModelId(e);
132
+ if (id && !seen.has(id)) {
133
+ seen.add(id);
134
+ models.push(id);
135
+ }
136
+ }
137
+ return models;
138
+ }
139
+
140
+ export function buildAgentSessionFixture(options: {
141
+ agent: string;
142
+ sessionId: string;
143
+ sessionMeta: AgentSessionFixtureMeta;
144
+ normalizedEvents: RepoNormalizedUniversalAgentSessionEvent[];
145
+ rawEventCount?: number;
146
+ }): AgentSessionFixture {
147
+ const { agent, sessionId, sessionMeta, normalizedEvents, rawEventCount } = options;
148
+ const sessionName = sessionMeta.sessionName || "opencode";
149
+ const agentEvents = accumulateToAgentSessionEvents(normalizedEvents, sessionName);
150
+
151
+ // Rewrite layer item paths (repo-relative displayPath) back to absolute
152
+ // paths. Layer snapshots reflect accumulated state across events, so build a
153
+ // global displayPath -> absolutePath map from every event's files/dependencies.
154
+ const repoBreakdown = new Map<string, { root: string; files: Set<string>; edits: Set<string> }>();
155
+ const displayToAbs = new Map<string, string>();
156
+
157
+ for (const e of agentEvents) {
158
+ for (const f of [...e.files, ...e.dependencies]) {
159
+ if (typeof f === "object" && f && "displayPath" in f) {
160
+ const nf = f as NormalizedPathInfo;
161
+ if (nf.displayPath && !displayToAbs.has(nf.displayPath)) {
162
+ displayToAbs.set(nf.displayPath, nf.absolutePath);
163
+ }
164
+ const label = repoLabel(nf);
165
+ if (!repoBreakdown.has(label)) {
166
+ repoBreakdown.set(label, { root: repoRoot(nf), files: new Set(), edits: new Set() });
167
+ }
168
+ repoBreakdown.get(label)!.files.add(nf.absolutePath);
169
+ if (!repoBreakdown.get(label)!.root) repoBreakdown.get(label)!.root = repoRoot(nf);
170
+ }
171
+ }
172
+ }
173
+
174
+ const events: FixtureAgentSessionEvent[] = agentEvents.map((e) => {
175
+ const files = e.files.map((f) =>
176
+ typeof f === "string" ? f : (f as NormalizedPathInfo).absolutePath,
177
+ );
178
+ const dependencies = e.dependencies.map((f) =>
179
+ typeof f === "string" ? f : (f as NormalizedPathInfo).absolutePath,
180
+ );
181
+
182
+ if (e.operation === "editing") {
183
+ for (const f of files) {
184
+ const label = [...repoBreakdown.entries()].find(([, v]) => v.files.has(f))?.[0] ?? "";
185
+ if (!repoBreakdown.has(label)) {
186
+ repoBreakdown.set(label, { root: "", files: new Set(), edits: new Set() });
187
+ }
188
+ repoBreakdown.get(label)!.edits.add(f);
189
+ }
190
+ }
191
+
192
+ const layers = e.layers.map((l) => ({
193
+ ...l,
194
+ items: l.items.map((item) => {
195
+ const abs = item.path.startsWith("/") ? item.path : displayToAbs.get(item.path) ?? item.path;
196
+ return { ...item, path: abs };
197
+ }),
198
+ }));
199
+
200
+ return { ...e, files, dependencies, layers };
201
+ });
202
+
203
+ const session: AgentSessionFixtureSummary = {
204
+ sessionId,
205
+ agent,
206
+ sessionName,
207
+ sessionTask: sessionMeta.sessionTask,
208
+ workingDirectory: sessionMeta.workingDirectory,
209
+ rawEventCount: rawEventCount ?? normalizedEvents.length,
210
+ agentEventCount: events.length,
211
+ repos: [...repoBreakdown.entries()].map(([repo, v]) => ({
212
+ repo,
213
+ root: v.root,
214
+ files: v.files.size,
215
+ edits: v.edits.size,
216
+ })),
217
+ models: collectModels(normalizedEvents),
218
+ };
219
+
220
+ return {
221
+ generatedFrom: `${agent} session ${sessionId}`,
222
+ session,
223
+ events,
224
+ };
225
+ }
@@ -0,0 +1,10 @@
1
+ export { buildAgentSessionFixture } from "./fixture";
2
+ export type {
3
+ AgentSessionFixture,
4
+ AgentSessionFixtureMeta,
5
+ AgentSessionFixtureRepo,
6
+ AgentSessionFixtureSummary,
7
+ FixtureAgentSessionEvent,
8
+ FixtureHighlightLayer,
9
+ FixtureLayerItem,
10
+ } from "./fixture";
@@ -0,0 +1,93 @@
1
+ import { describe, expect, test } from 'bun:test';
2
+ import { mkdtempSync, mkdirSync, writeFileSync } from 'fs';
3
+ import { tmpdir } from 'os';
4
+ import { join } from 'path';
5
+ import { NodeFileSystemAdapter } from '@principal-ai/repository-abstraction/node';
6
+ import { AuxiliaryManifestValidator } from './AuxiliaryManifestValidator';
7
+ import type { AuxiliaryManifest } from '../types/auxiliary';
8
+
9
+ function makeRepo(layout: string[]): string {
10
+ const root = mkdtempSync(join(tmpdir(), 'aux-manifest-'));
11
+ for (const rel of layout) {
12
+ const full = join(root, rel);
13
+ mkdirSync(full.substring(0, full.lastIndexOf('/')) || full, { recursive: true });
14
+ if (!rel.endsWith('/')) writeFileSync(full, '');
15
+ }
16
+ return root;
17
+ }
18
+
19
+ describe('AuxiliaryManifestValidator', () => {
20
+ const validator = new AuxiliaryManifestValidator(new NodeFileSystemAdapter());
21
+
22
+ test('no manifest is a no-op', async () => {
23
+ const result = await validator.validate({ basePath: '/tmp' });
24
+ expect(result.valid).toBe(true);
25
+ expect(result.violations).toHaveLength(0);
26
+ });
27
+
28
+ test('passes for a clean manifest', async () => {
29
+ const root = makeRepo(['docs/README.md', '.github/workflows/ci.yml']);
30
+ const manifest: AuxiliaryManifest = {
31
+ areas: [
32
+ { name: 'Documentation', paths: ['docs'], description: 'design docs' },
33
+ { name: 'GitHub', paths: ['.github'], description: 'CI config' },
34
+ ],
35
+ };
36
+ const result = await validator.validate({ manifest, basePath: root });
37
+ expect(result.valid).toBe(true);
38
+ expect(result.violations).toHaveLength(0);
39
+ });
40
+
41
+ test('flags duplicate area names', async () => {
42
+ const root = makeRepo(['docs/README.md', 'misc/note.txt']);
43
+ const manifest: AuxiliaryManifest = {
44
+ areas: [
45
+ { name: 'Docs', paths: ['docs'], description: 'a' },
46
+ { name: 'Docs', paths: ['misc'], description: 'b' },
47
+ ],
48
+ };
49
+ const result = await validator.validate({ manifest, basePath: root });
50
+ const dup = result.violations.find((v) => v.ruleId === 'auxiliary-area-name-duplicate');
51
+ expect(dup).toBeDefined();
52
+ expect(dup!.severity).toBe('error');
53
+ expect(result.valid).toBe(false);
54
+ });
55
+
56
+ test('warns when a declared path does not exist', async () => {
57
+ const root = makeRepo(['docs/README.md']);
58
+ const manifest: AuxiliaryManifest = {
59
+ areas: [{ name: 'Ghost', paths: ['nope'], description: 'missing' }],
60
+ };
61
+ const result = await validator.validate({ manifest, basePath: root });
62
+ const missing = result.violations.find((v) => v.ruleId === 'auxiliary-area-path-missing');
63
+ expect(missing).toBeDefined();
64
+ expect(missing!.severity).toBe('warn');
65
+ // Warnings alone don't invalidate the manifest
66
+ expect(result.valid).toBe(true);
67
+ });
68
+
69
+ test('flags overlap between two areas', async () => {
70
+ const root = makeRepo(['docs/sub/file.md']);
71
+ const manifest: AuxiliaryManifest = {
72
+ areas: [
73
+ { name: 'A', paths: ['docs'], description: 'a' },
74
+ { name: 'B', paths: ['docs/sub'], description: 'b' },
75
+ ],
76
+ };
77
+ const result = await validator.validate({ manifest, basePath: root });
78
+ const overlap = result.violations.find((v) => v.ruleId === 'auxiliary-area-paths-overlap');
79
+ expect(overlap).toBeDefined();
80
+ expect(overlap!.severity).toBe('error');
81
+ expect(result.valid).toBe(false);
82
+ });
83
+
84
+ test('flags duplicate paths within a single area as self-overlap', async () => {
85
+ const root = makeRepo(['docs/file.md']);
86
+ const manifest: AuxiliaryManifest = {
87
+ areas: [{ name: 'A', paths: ['docs', 'docs'], description: 'a' }],
88
+ };
89
+ const result = await validator.validate({ manifest, basePath: root });
90
+ const self = result.violations.find((v) => v.ruleId === 'auxiliary-area-paths-self-overlap');
91
+ expect(self).toBeDefined();
92
+ });
93
+ });
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Auxiliary Manifest Validator
3
+ *
4
+ * Own-file checks for `.principal-views/auxiliary.manifest.json`:
5
+ * - area names are unique
6
+ * - declared paths exist on disk
7
+ * - paths don't overlap each other (within or across areas)
8
+ *
9
+ * Cross-file overlap with scope paths lives in `validateAreaScopeDisjoint`,
10
+ * mirroring the way `validateScopeNamespaceNesting` handles cross-canvas
11
+ * checks for scopes/namespaces.
12
+ */
13
+
14
+ import type { FileSystemAdapter } from '@principal-ai/repository-abstraction';
15
+ import type { AuxiliaryManifest } from '../types/auxiliary';
16
+ import { pathsOverlap } from '../events/path-helpers';
17
+
18
+ export interface AuxiliaryManifestValidationContext {
19
+ /** Parsed manifest. When absent, validation is a no-op (manifest is optional). */
20
+ manifest?: AuxiliaryManifest;
21
+
22
+ /** Path to the manifest file — used in violation messages. */
23
+ manifestPath?: string;
24
+
25
+ /** Repo root for resolving area paths against the filesystem. */
26
+ basePath: string;
27
+ }
28
+
29
+ export interface AuxiliaryManifestViolation {
30
+ ruleId: string;
31
+ severity: 'error' | 'warn';
32
+ file: string;
33
+ path?: string;
34
+ message: string;
35
+ impact: string;
36
+ suggestion: string;
37
+ }
38
+
39
+ export interface AuxiliaryManifestValidationResult {
40
+ valid: boolean;
41
+ violations: AuxiliaryManifestViolation[];
42
+ }
43
+
44
+ const DEFAULT_MANIFEST_PATH = '.principal-views/auxiliary.manifest.json';
45
+
46
+ export class AuxiliaryManifestValidator {
47
+ constructor(private fsAdapter: FileSystemAdapter) {}
48
+
49
+ async validate(context: AuxiliaryManifestValidationContext): Promise<AuxiliaryManifestValidationResult> {
50
+ const violations: AuxiliaryManifestViolation[] = [];
51
+ const { manifest, basePath } = context;
52
+ const file = context.manifestPath || DEFAULT_MANIFEST_PATH;
53
+
54
+ if (!manifest) {
55
+ return { valid: true, violations };
56
+ }
57
+
58
+ const areas = manifest.areas || [];
59
+
60
+ // Unique area names
61
+ const seenNames = new Map<string, number>();
62
+ areas.forEach((area, idx) => {
63
+ const count = seenNames.get(area.name) ?? 0;
64
+ seenNames.set(area.name, count + 1);
65
+ if (count === 1) {
66
+ violations.push({
67
+ ruleId: 'auxiliary-area-name-duplicate',
68
+ severity: 'error',
69
+ file,
70
+ path: `areas[${idx}].name`,
71
+ message: `Area name "${area.name}" is declared more than once`,
72
+ impact: 'Duplicate names make diagnostics ambiguous — a violation cannot be tied back to a single area',
73
+ suggestion: 'Rename one of the areas so names are unique across the manifest.',
74
+ });
75
+ }
76
+ });
77
+
78
+ // Path existence + collect for overlap pass
79
+ const declaredPaths: Array<{ areaName: string; areaIndex: number; pathIndex: number; path: string }> = [];
80
+ for (let areaIdx = 0; areaIdx < areas.length; areaIdx++) {
81
+ const area = areas[areaIdx];
82
+ const paths = area.paths || [];
83
+ for (let pathIdx = 0; pathIdx < paths.length; pathIdx++) {
84
+ const p = paths[pathIdx];
85
+ declaredPaths.push({ areaName: area.name, areaIndex: areaIdx, pathIndex: pathIdx, path: p });
86
+
87
+ const resolved = this.fsAdapter.join(basePath, p);
88
+ if (!(await this.fsAdapter.exists(resolved))) {
89
+ violations.push({
90
+ ruleId: 'auxiliary-area-path-missing',
91
+ severity: 'warn',
92
+ file,
93
+ path: `areas[${areaIdx}].paths[${pathIdx}]`,
94
+ message: `Path "${p}" declared by area "${area.name}" does not exist`,
95
+ impact: 'The manifest documents a folder that is not present in the repository',
96
+ suggestion: 'Verify the path exists relative to the repository root, or remove it from the area declaration.',
97
+ });
98
+ }
99
+ }
100
+ }
101
+
102
+ // Path overlap. Unlike scopes, areas have no dotted-name hierarchy, so
103
+ // parent-child nesting between two areas is just as ambiguous as a flat
104
+ // overlap — both are flagged.
105
+ for (let i = 0; i < declaredPaths.length; i++) {
106
+ for (let j = i + 1; j < declaredPaths.length; j++) {
107
+ const a = declaredPaths[i];
108
+ const b = declaredPaths[j];
109
+ const relationship = pathsOverlap(a.path, b.path);
110
+ if (relationship === 'none') continue;
111
+
112
+ const sameArea = a.areaName === b.areaName;
113
+ violations.push({
114
+ ruleId: sameArea ? 'auxiliary-area-paths-self-overlap' : 'auxiliary-area-paths-overlap',
115
+ severity: 'error',
116
+ file,
117
+ path: sameArea
118
+ ? `areas[${a.areaIndex}].paths`
119
+ : undefined,
120
+ message: sameArea
121
+ ? `Area "${a.areaName}" declares overlapping paths "${a.path}" and "${b.path}"`
122
+ : `Paths overlap between areas "${a.areaName}" ("${a.path}") and "${b.areaName}" ("${b.path}")`,
123
+ impact: 'Two area declarations covering the same file make ownership ambiguous',
124
+ suggestion: 'Make the paths disjoint. If one folder genuinely sits inside another area, drop the redundant entry.',
125
+ });
126
+ }
127
+ }
128
+
129
+ const errors = violations.filter((v) => v.severity === 'error');
130
+ return { valid: errors.length === 0, violations };
131
+ }
132
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Auxiliary module
3
+ *
4
+ * Validation for `auxiliary.manifest.json` — the catalog of project regions
5
+ * that sit outside the OTEL telemetry surface (docs, .github, etc.).
6
+ */
7
+
8
+ export {
9
+ AuxiliaryManifestValidator,
10
+ type AuxiliaryManifestValidationContext,
11
+ type AuxiliaryManifestValidationResult,
12
+ type AuxiliaryManifestViolation,
13
+ } from './AuxiliaryManifestValidator';
14
+
15
+ export {
16
+ validateAreaScopeDisjoint,
17
+ type ValidateAreaScopeDisjointInput,
18
+ } from './validateAreaScopeDisjoint';