@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,85 @@
1
+ import { describe, expect, test } from 'bun:test';
2
+ import { validateAreaScopeDisjoint } from './validateAreaScopeDisjoint';
3
+ import type { AuxiliaryManifest } from '../types/auxiliary';
4
+ import type { ExtendedCanvas } from '../types/canvas';
5
+
6
+ function scopesCanvas(nodes: Array<{ scope: string; paths?: string[] }>): ExtendedCanvas {
7
+ return {
8
+ nodes: nodes.map((n, i) => ({
9
+ id: `s${i}`,
10
+ type: 'otel-scope',
11
+ description: `${n.scope} scope`,
12
+ ...(n.paths !== undefined ? { paths: n.paths } : {}),
13
+ otel: { scope: n.scope },
14
+ x: 0, y: 0, width: 100, height: 50,
15
+ })),
16
+ edges: [],
17
+ } as ExtendedCanvas;
18
+ }
19
+
20
+ describe('validateAreaScopeDisjoint', () => {
21
+ test('returns no violations when areas and scopes are disjoint', () => {
22
+ const manifest: AuxiliaryManifest = {
23
+ areas: [{ name: 'Docs', paths: ['docs'], description: 'd' }],
24
+ };
25
+ const violations = validateAreaScopeDisjoint({
26
+ manifest,
27
+ scopesCanvas: scopesCanvas([{ scope: 'core', paths: ['packages/subsystems-core/src'] }]),
28
+ });
29
+ expect(violations).toHaveLength(0);
30
+ });
31
+
32
+ test('flags exact overlap with a scope path', () => {
33
+ const manifest: AuxiliaryManifest = {
34
+ areas: [{ name: 'Core', paths: ['packages/subsystems-core/src'], description: 'd' }],
35
+ };
36
+ const violations = validateAreaScopeDisjoint({
37
+ manifest,
38
+ scopesCanvas: scopesCanvas([{ scope: 'core', paths: ['packages/subsystems-core/src'] }]),
39
+ });
40
+ expect(violations).toHaveLength(1);
41
+ expect(violations[0].ruleId).toBe('auxiliary-area-scope-overlap');
42
+ });
43
+
44
+ test('flags parent-child overlap (area covering a scope path)', () => {
45
+ const manifest: AuxiliaryManifest = {
46
+ areas: [{ name: 'All', paths: ['packages'], description: 'd' }],
47
+ };
48
+ const violations = validateAreaScopeDisjoint({
49
+ manifest,
50
+ scopesCanvas: scopesCanvas([{ scope: 'core', paths: ['packages/subsystems-core/src'] }]),
51
+ });
52
+ expect(violations).toHaveLength(1);
53
+ expect(violations[0].ruleId).toBe('auxiliary-area-scope-overlap');
54
+ });
55
+
56
+ test('flags parent-child overlap (scope path covering an area)', () => {
57
+ const manifest: AuxiliaryManifest = {
58
+ areas: [{ name: 'Inner', paths: ['packages/subsystems-core/src/docs'], description: 'd' }],
59
+ };
60
+ const violations = validateAreaScopeDisjoint({
61
+ manifest,
62
+ scopesCanvas: scopesCanvas([{ scope: 'core', paths: ['packages/subsystems-core/src'] }]),
63
+ });
64
+ expect(violations).toHaveLength(1);
65
+ });
66
+
67
+ test('no scopes canvas means no cross-check', () => {
68
+ const manifest: AuxiliaryManifest = {
69
+ areas: [{ name: 'Docs', paths: ['docs'], description: 'd' }],
70
+ };
71
+ const violations = validateAreaScopeDisjoint({ manifest });
72
+ expect(violations).toHaveLength(0);
73
+ });
74
+
75
+ test('scopes without paths impose no constraint', () => {
76
+ const manifest: AuxiliaryManifest = {
77
+ areas: [{ name: 'Docs', paths: ['docs'], description: 'd' }],
78
+ };
79
+ const violations = validateAreaScopeDisjoint({
80
+ manifest,
81
+ scopesCanvas: scopesCanvas([{ scope: 'core' }]),
82
+ });
83
+ expect(violations).toHaveLength(0);
84
+ });
85
+ });
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Area / Scope Disjointness Validator
3
+ *
4
+ * Cross-file check: project-area paths declared in
5
+ * `auxiliary.manifest.json` must be disjoint from every scope path declared
6
+ * in `architecture.scopes.canvas`. Areas and scopes carve up the repo into
7
+ * non-overlapping regions — any overlap (parent-child or otherwise) means a
8
+ * file is claimed by both an OTEL scope and an auxiliary area, which makes
9
+ * ownership ambiguous.
10
+ *
11
+ * Mirrors `validateScopeNamespaceNesting`'s cross-canvas pattern: takes both
12
+ * inputs, returns violations.
13
+ */
14
+
15
+ import type { AuxiliaryManifest } from '../types/auxiliary';
16
+ import type { ExtendedCanvas } from '../types/canvas';
17
+ import { isOtelScopeNode } from '../types/canvas';
18
+ import { pathsOverlap } from '../events/path-helpers';
19
+ import type { AuxiliaryManifestViolation } from './AuxiliaryManifestValidator';
20
+
21
+ export interface ValidateAreaScopeDisjointInput {
22
+ manifest: AuxiliaryManifest;
23
+ manifestPath?: string;
24
+ scopesCanvas?: ExtendedCanvas;
25
+ scopesCanvasPath?: string;
26
+ }
27
+
28
+ const DEFAULT_MANIFEST_PATH = '.principal-views/auxiliary.manifest.json';
29
+
30
+ export function validateAreaScopeDisjoint(
31
+ input: ValidateAreaScopeDisjointInput,
32
+ ): AuxiliaryManifestViolation[] {
33
+ const { manifest, scopesCanvas } = input;
34
+ const manifestFile = input.manifestPath || DEFAULT_MANIFEST_PATH;
35
+
36
+ if (!scopesCanvas) return [];
37
+
38
+ const scopePaths: Array<{ scope: string; path: string }> = [];
39
+ for (const node of scopesCanvas.nodes || []) {
40
+ if (!isOtelScopeNode(node)) continue;
41
+ const scope = node.otel?.scope;
42
+ const paths = node.paths;
43
+ if (!scope || !paths || paths.length === 0) continue;
44
+ for (const p of paths) scopePaths.push({ scope, path: p });
45
+ }
46
+
47
+ if (scopePaths.length === 0) return [];
48
+
49
+ const violations: AuxiliaryManifestViolation[] = [];
50
+ const areas = manifest.areas || [];
51
+
52
+ areas.forEach((area, areaIdx) => {
53
+ (area.paths || []).forEach((areaPath, pathIdx) => {
54
+ for (const sp of scopePaths) {
55
+ const relationship = pathsOverlap(areaPath, sp.path);
56
+ if (relationship === 'none') continue;
57
+
58
+ violations.push({
59
+ ruleId: 'auxiliary-area-scope-overlap',
60
+ severity: 'error',
61
+ file: manifestFile,
62
+ path: `areas[${areaIdx}].paths[${pathIdx}]`,
63
+ message: `Area "${area.name}" path "${areaPath}" overlaps scope "${sp.scope}" path "${sp.path}"`,
64
+ impact: 'A file claimed by both an OTEL scope and an auxiliary area has ambiguous ownership — the manifest is meant to catalog regions outside the telemetry surface',
65
+ suggestion: 'Make the area path disjoint from every scope path. If the folder is genuinely runtime code, drop it from the manifest; if it is auxiliary, narrow the scope path or move the folder.',
66
+ });
67
+ }
68
+ });
69
+ });
70
+
71
+ return violations;
72
+ }
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Browser-safety regression test.
3
+ *
4
+ * The package has two entry points:
5
+ * - `@principal-ai/subsystems-core` (src/index.ts) — must work in any
6
+ * environment, including browsers. It must not transitively import any
7
+ * Node.js-only built-in module.
8
+ * - `@principal-ai/subsystems-core/node` (src/node.ts) — Node-only.
9
+ *
10
+ * This test walks the import graph starting from src/index.ts and fails if
11
+ * any reachable source file pulls in a forbidden Node built-in. `import type`
12
+ * lines are erased at compile time and are ignored.
13
+ */
14
+
15
+ import { describe, expect, test } from 'bun:test';
16
+ import { readFileSync, statSync } from 'fs';
17
+ import { dirname, resolve } from 'path';
18
+
19
+ const ENTRY = resolve(import.meta.dir, 'index.ts');
20
+ const SRC_ROOT = resolve(import.meta.dir);
21
+
22
+ // Node built-ins that don't exist in the browser. `node:` prefix and
23
+ // submodules like `fs/promises` are matched separately.
24
+ const FORBIDDEN_BARE = new Set([
25
+ 'fs',
26
+ 'path',
27
+ 'os',
28
+ 'child_process',
29
+ 'crypto',
30
+ 'http',
31
+ 'https',
32
+ 'net',
33
+ 'tls',
34
+ 'stream',
35
+ 'zlib',
36
+ 'url',
37
+ 'worker_threads',
38
+ 'cluster',
39
+ 'dgram',
40
+ 'dns',
41
+ 'readline',
42
+ 'v8',
43
+ 'vm',
44
+ ]);
45
+
46
+ function isForbidden(spec: string): boolean {
47
+ if (spec.startsWith('node:')) return true;
48
+ const root = spec.split('/')[0];
49
+ return FORBIDDEN_BARE.has(root);
50
+ }
51
+
52
+ function resolveRelative(from: string, spec: string): string | null {
53
+ const base = resolve(dirname(from), spec);
54
+ const candidates = [
55
+ base,
56
+ `${base}.ts`,
57
+ `${base}.tsx`,
58
+ `${base}/index.ts`,
59
+ `${base}/index.tsx`,
60
+ ];
61
+ for (const c of candidates) {
62
+ try {
63
+ const s = statSync(c);
64
+ if (s.isFile()) return c;
65
+ } catch {
66
+ // not a file; keep trying
67
+ }
68
+ }
69
+ return null;
70
+ }
71
+
72
+ interface ImportRef {
73
+ spec: string;
74
+ typeOnly: boolean;
75
+ }
76
+
77
+ // Strip /* ... */ and // ... so commented-out imports don't trip the regex.
78
+ function stripComments(src: string): string {
79
+ return src
80
+ .replace(/\/\*[\s\S]*?\*\//g, '')
81
+ .replace(/(^|[^:])\/\/[^\n]*/g, '$1');
82
+ }
83
+
84
+ function extractImports(src: string): ImportRef[] {
85
+ const cleaned = stripComments(src);
86
+ const refs: ImportRef[] = [];
87
+
88
+ // import ... from 'spec' / import 'spec'
89
+ const importRe = /^\s*import\s+(type\s+)?(?:[^'"]*?from\s+)?['"]([^'"]+)['"]/gm;
90
+ let m: RegExpExecArray | null;
91
+ while ((m = importRe.exec(cleaned))) {
92
+ refs.push({ spec: m[2], typeOnly: Boolean(m[1]) });
93
+ }
94
+
95
+ // export ... from 'spec' (re-exports — runtime-relevant unless "export type")
96
+ const exportRe = /^\s*export\s+(type\s+)?(?:\*|\{[^}]*\})\s+from\s+['"]([^'"]+)['"]/gm;
97
+ while ((m = exportRe.exec(cleaned))) {
98
+ refs.push({ spec: m[2], typeOnly: Boolean(m[1]) });
99
+ }
100
+
101
+ return refs;
102
+ }
103
+
104
+ interface LeakReport {
105
+ chain: string[];
106
+ forbiddenSpec: string;
107
+ }
108
+
109
+ function findLeaks(entry: string): LeakReport[] {
110
+ const visited = new Set<string>();
111
+ const leaks: LeakReport[] = [];
112
+
113
+ function walk(file: string, chain: string[]): void {
114
+ if (visited.has(file)) return;
115
+ visited.add(file);
116
+
117
+ const rel = file.startsWith(SRC_ROOT) ? file.slice(SRC_ROOT.length + 1) : file;
118
+ const nextChain = [...chain, rel];
119
+
120
+ let src: string;
121
+ try {
122
+ src = readFileSync(file, 'utf-8');
123
+ } catch {
124
+ return;
125
+ }
126
+
127
+ for (const ref of extractImports(src)) {
128
+ if (ref.typeOnly) continue;
129
+
130
+ // Forbidden Node built-in?
131
+ if (isForbidden(ref.spec)) {
132
+ leaks.push({ chain: nextChain, forbiddenSpec: ref.spec });
133
+ continue;
134
+ }
135
+
136
+ // Relative import — recurse.
137
+ if (ref.spec.startsWith('.')) {
138
+ const resolved = resolveRelative(file, ref.spec);
139
+ if (resolved) walk(resolved, nextChain);
140
+ continue;
141
+ }
142
+
143
+ // External package — out of scope. We trust the package author to have
144
+ // shipped a browser-safe entry; if they didn't, that's a separate bug.
145
+ }
146
+ }
147
+
148
+ walk(entry, []);
149
+ return leaks;
150
+ }
151
+
152
+ describe('browser-safe entry (src/index.ts)', () => {
153
+ test('does not transitively import any Node.js built-in', () => {
154
+ const leaks = findLeaks(ENTRY);
155
+
156
+ if (leaks.length > 0) {
157
+ const lines = leaks.map((l) => {
158
+ const arrow = l.chain.join('\n → ');
159
+ return ` ✗ imports "${l.forbiddenSpec}" via:\n → ${arrow}`;
160
+ });
161
+ const msg =
162
+ `Found ${leaks.length} Node.js built-in import(s) reachable from src/index.ts.\n` +
163
+ `These must move to src/node.ts (or be replaced with a FileSystemAdapter):\n\n` +
164
+ lines.join('\n\n');
165
+ throw new Error(msg);
166
+ }
167
+
168
+ expect(leaks).toHaveLength(0);
169
+ });
170
+ });
@@ -0,0 +1,286 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Code Generation CLI
4
+ *
5
+ * Generate types from canvas files.
6
+ *
7
+ * Usage:
8
+ * npx @principal-ai/subsystems-core codegen my-flow.canvas
9
+ * npx @principal-ai/subsystems-core codegen --lang typescript --output types/ my-flow.canvas
10
+ *
11
+ * Similar to:
12
+ * - graphql-codegen (GraphQL)
13
+ * - openapi-generator (OpenAPI)
14
+ * - protoc (Protobuf)
15
+ */
16
+
17
+ import fs from 'fs';
18
+ import path from 'path';
19
+ import { generateTypes, generatorRegistry } from '../codegen/type-generator';
20
+ import type { ExtendedCanvas } from '../types/canvas';
21
+ import type { CodegenOptions } from '../codegen/type-generator';
22
+
23
+ interface CliOptions {
24
+ language: 'typescript' | 'python' | 'go' | 'rust';
25
+ output?: string;
26
+ readonly?: boolean;
27
+ strictNullChecks?: boolean;
28
+ includeDocComments?: boolean;
29
+ namespace?: string;
30
+ watch?: boolean;
31
+ }
32
+
33
+ /**
34
+ * Parse command line arguments
35
+ */
36
+ function parseArgs(args: string[]): { options: CliOptions; canvasFiles: string[] } {
37
+ const options: CliOptions = {
38
+ language: 'typescript',
39
+ includeDocComments: true,
40
+ strictNullChecks: true,
41
+ };
42
+
43
+ const canvasFiles: string[] = [];
44
+
45
+ for (let i = 0; i < args.length; i++) {
46
+ const arg = args[i];
47
+
48
+ switch (arg) {
49
+ case '--lang':
50
+ case '-l':
51
+ options.language = args[++i] as CliOptions['language'];
52
+ break;
53
+ case '--output':
54
+ case '-o':
55
+ options.output = args[++i];
56
+ break;
57
+ case '--readonly':
58
+ options.readonly = true;
59
+ break;
60
+ case '--no-strict-null-checks':
61
+ options.strictNullChecks = false;
62
+ break;
63
+ case '--no-doc-comments':
64
+ options.includeDocComments = false;
65
+ break;
66
+ case '--namespace':
67
+ case '-n':
68
+ options.namespace = args[++i];
69
+ break;
70
+ case '--watch':
71
+ case '-w':
72
+ options.watch = true;
73
+ break;
74
+ case '--help':
75
+ case '-h':
76
+ printHelp();
77
+ process.exit(0);
78
+ break;
79
+ case '--list-generators':
80
+ listGenerators();
81
+ process.exit(0);
82
+ break;
83
+ default:
84
+ if (!arg.startsWith('--')) {
85
+ canvasFiles.push(arg);
86
+ }
87
+ }
88
+ }
89
+
90
+ return { options, canvasFiles };
91
+ }
92
+
93
+ /**
94
+ * Generate types for a canvas file
95
+ */
96
+ function generateTypesForFile(canvasPath: string, options: CliOptions) {
97
+ console.log(`📝 Generating types from ${canvasPath}...`);
98
+
99
+ // Read canvas file
100
+ const canvas: ExtendedCanvas = JSON.parse(fs.readFileSync(canvasPath, 'utf-8'));
101
+
102
+ // Generate types
103
+ const codegenOptions: CodegenOptions = {
104
+ language: options.language,
105
+ style: {
106
+ readonly: options.readonly,
107
+ strictNullChecks: options.strictNullChecks,
108
+ includeDocComments: options.includeDocComments,
109
+ },
110
+ namespace: options.namespace,
111
+ };
112
+
113
+ const result = generateTypes(canvas, codegenOptions);
114
+
115
+ // Determine output path
116
+ let outputPath: string;
117
+ if (options.output) {
118
+ // If output is a directory, use generated filename
119
+ if (fs.existsSync(options.output) && fs.statSync(options.output).isDirectory()) {
120
+ outputPath = path.join(options.output, result.filename);
121
+ } else {
122
+ outputPath = options.output;
123
+ }
124
+ } else {
125
+ // Default: packages/subsystems-core/src/generated/ for .principal-views canvases
126
+ // This keeps canvas files in .principal-views/ but generates types to idiomatic locations
127
+ const canvasDir = path.dirname(canvasPath);
128
+ const canvasAbsPath = path.resolve(canvasPath);
129
+
130
+ if (canvasAbsPath.includes('.principal-views')) {
131
+ // Canvas is in .principal-views/, output to packages/subsystems-core/src/generated/
132
+ const repoRoot = canvasAbsPath.split('.principal-views')[0];
133
+ const generatedDir = path.join(repoRoot, 'packages', 'core', 'src', 'generated');
134
+ outputPath = path.join(generatedDir, result.filename);
135
+ } else {
136
+ // Canvas is elsewhere, use same directory
137
+ outputPath = path.join(canvasDir, result.filename);
138
+ }
139
+ }
140
+
141
+ // Ensure output directory exists
142
+ const outputDir = path.dirname(outputPath);
143
+ if (!fs.existsSync(outputDir)) {
144
+ fs.mkdirSync(outputDir, { recursive: true });
145
+ }
146
+
147
+ // Write types file
148
+ fs.writeFileSync(outputPath, result.code);
149
+
150
+ console.log(`✅ Generated ${outputPath}`);
151
+ console.log(` Language: ${options.language}`);
152
+ console.log(` Size: ${result.code.length} bytes`);
153
+
154
+ return outputPath;
155
+ }
156
+
157
+ /**
158
+ * Print help message
159
+ */
160
+ function printHelp() {
161
+ console.log(`
162
+ Code Generation CLI - Generate types from canvas files
163
+
164
+ USAGE:
165
+ npx @principal-ai/subsystems-core codegen [OPTIONS] <canvas-files...>
166
+
167
+ OPTIONS:
168
+ -l, --lang <language> Target language (typescript|python|go|rust) [default: typescript]
169
+ -o, --output <path> Output file or directory [default: same as canvas]
170
+ -n, --namespace <name> Wrap types in a namespace
171
+ --readonly Use readonly modifiers (TypeScript)
172
+ --no-strict-null-checks Disable strict null checks
173
+ --no-doc-comments Omit JSDoc comments
174
+ -w, --watch Watch for changes and regenerate
175
+ --list-generators List available code generators
176
+ -h, --help Show this help message
177
+
178
+ EXAMPLES:
179
+ # Generate TypeScript types
180
+ npx @principal-ai/subsystems-core codegen my-flow.canvas
181
+
182
+ # Generate with namespace
183
+ npx @principal-ai/subsystems-core codegen --namespace Events my-flow.canvas
184
+
185
+ # Generate to specific output directory
186
+ npx @principal-ai/subsystems-core codegen --output src/types/ my-flow.canvas
187
+
188
+ # Generate multiple files
189
+ npx @principal-ai/subsystems-core codegen *.canvas
190
+
191
+ # Watch mode (future)
192
+ npx @principal-ai/subsystems-core codegen --watch my-flow.canvas
193
+
194
+ PRECEDENTS:
195
+ This tool follows patterns from:
196
+ - GraphQL Code Generator (graphql-code-generator.com)
197
+ - OpenAPI Generator (openapi-generator.tech)
198
+ - Protobuf Compiler (protoc)
199
+
200
+ Like these tools, it generates type-safe code from declarative schemas.
201
+ `);
202
+ }
203
+
204
+ /**
205
+ * List available generators
206
+ */
207
+ function listGenerators() {
208
+ console.log('\nAvailable Code Generators:\n');
209
+
210
+ const languages = generatorRegistry.list();
211
+
212
+ for (const lang of languages) {
213
+ const generator = generatorRegistry.get(lang);
214
+ console.log(` • ${lang.padEnd(15)} ${generator ? '✓' : '✗'}`);
215
+ }
216
+
217
+ console.log('\nTo add support for more languages, implement the CodeGenerator interface.');
218
+ console.log('See: packages/subsystems-core/src/codegen/type-generator.ts\n');
219
+ }
220
+
221
+ /**
222
+ * Main entry point
223
+ */
224
+ function main() {
225
+ const { options, canvasFiles } = parseArgs(process.argv.slice(2));
226
+
227
+ if (canvasFiles.length === 0) {
228
+ console.error('❌ Error: No canvas files specified\n');
229
+ printHelp();
230
+ process.exit(1);
231
+ }
232
+
233
+ // Validate language
234
+ const availableLanguages = generatorRegistry.list();
235
+ if (!availableLanguages.includes(options.language)) {
236
+ console.error(`❌ Error: Unsupported language '${options.language}'`);
237
+ console.error(` Available: ${availableLanguages.join(', ')}\n`);
238
+ listGenerators();
239
+ process.exit(1);
240
+ }
241
+
242
+ // Generate types for each file
243
+ const outputFiles: string[] = [];
244
+
245
+ for (const canvasFile of canvasFiles) {
246
+ try {
247
+ // Check if file exists
248
+ if (!fs.existsSync(canvasFile)) {
249
+ console.error(`❌ Error: File not found: ${canvasFile}`);
250
+ continue;
251
+ }
252
+
253
+ const outputPath = generateTypesForFile(canvasFile, options);
254
+ outputFiles.push(outputPath);
255
+ } catch (error) {
256
+ console.error(`❌ Error processing ${canvasFile}:`, error);
257
+ process.exit(1);
258
+ }
259
+ }
260
+
261
+ console.log(`\n✨ Successfully generated ${outputFiles.length} type file(s)\n`);
262
+
263
+ // Watch mode
264
+ if (options.watch) {
265
+ console.log('👀 Watching for changes...');
266
+ for (const canvasFile of canvasFiles) {
267
+ fs.watch(canvasFile, (eventType) => {
268
+ if (eventType === 'change') {
269
+ console.log(`\n🔄 ${canvasFile} changed, regenerating...`);
270
+ try {
271
+ generateTypesForFile(canvasFile, options);
272
+ } catch (error) {
273
+ console.error('❌ Error:', error);
274
+ }
275
+ }
276
+ });
277
+ }
278
+ }
279
+ }
280
+
281
+ // Run CLI if executed directly
282
+ if (require.main === module) {
283
+ main();
284
+ }
285
+
286
+ export { main, parseArgs, generateTypesForFile };