@principal-ai/subsystems-react 0.53.6 → 0.54.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 (104) hide show
  1. package/dist/index.d.ts +8 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +3 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/pierre/PierreTrailCodeView.d.ts.map +1 -1
  6. package/dist/pierre/PierreTrailCodeView.js +7 -5
  7. package/dist/pierre/PierreTrailCodeView.js.map +1 -1
  8. package/dist/stories/Subsystem/ComponentGraph/fixtures.d.ts.map +1 -1
  9. package/dist/stories/Subsystem/ComponentGraph/fixtures.js +1 -2
  10. package/dist/stories/Subsystem/ComponentGraph/fixtures.js.map +1 -1
  11. package/dist/subsystem/C4Graph.d.ts +144 -9
  12. package/dist/subsystem/C4Graph.d.ts.map +1 -1
  13. package/dist/subsystem/C4Graph.js +924 -148
  14. package/dist/subsystem/C4Graph.js.map +1 -1
  15. package/dist/subsystem/C4NodeCard.d.ts +22 -1
  16. package/dist/subsystem/C4NodeCard.d.ts.map +1 -1
  17. package/dist/subsystem/C4NodeCard.js +10 -2
  18. package/dist/subsystem/C4NodeCard.js.map +1 -1
  19. package/dist/subsystem/ComponentDeclaration.d.ts +5 -4
  20. package/dist/subsystem/ComponentDeclaration.d.ts.map +1 -1
  21. package/dist/subsystem/ComponentDeclaration.js +12 -4
  22. package/dist/subsystem/ComponentDeclaration.js.map +1 -1
  23. package/dist/subsystem/ConstructsCatalog.d.ts.map +1 -1
  24. package/dist/subsystem/ConstructsCatalog.js +10 -7
  25. package/dist/subsystem/ConstructsCatalog.js.map +1 -1
  26. package/dist/subsystem/GraphSidebar.d.ts +71 -0
  27. package/dist/subsystem/GraphSidebar.d.ts.map +1 -0
  28. package/dist/subsystem/GraphSidebar.js +145 -0
  29. package/dist/subsystem/GraphSidebar.js.map +1 -0
  30. package/dist/subsystem/GraphWithSidebar.d.ts +24 -0
  31. package/dist/subsystem/GraphWithSidebar.d.ts.map +1 -0
  32. package/dist/subsystem/GraphWithSidebar.js +25 -0
  33. package/dist/subsystem/GraphWithSidebar.js.map +1 -0
  34. package/dist/subsystem/SubsystemComponentGraph.d.ts +33 -0
  35. package/dist/subsystem/SubsystemComponentGraph.d.ts.map +1 -1
  36. package/dist/subsystem/SubsystemComponentGraph.js +364 -411
  37. package/dist/subsystem/SubsystemComponentGraph.js.map +1 -1
  38. package/dist/subsystem/TrailStepsNav.d.ts +48 -0
  39. package/dist/subsystem/TrailStepsNav.d.ts.map +1 -0
  40. package/dist/subsystem/TrailStepsNav.js +189 -0
  41. package/dist/subsystem/TrailStepsNav.js.map +1 -0
  42. package/dist/subsystem/TrailsPanel.d.ts.map +1 -1
  43. package/dist/subsystem/TrailsPanel.js +3 -4
  44. package/dist/subsystem/TrailsPanel.js.map +1 -1
  45. package/dist/subsystem/__fixtures__/c4Drilldown.d.ts +151 -0
  46. package/dist/subsystem/__fixtures__/c4Drilldown.d.ts.map +1 -0
  47. package/dist/subsystem/__fixtures__/c4Drilldown.js +783 -0
  48. package/dist/subsystem/__fixtures__/c4Drilldown.js.map +1 -0
  49. package/dist/subsystem/c4.d.ts +39 -8
  50. package/dist/subsystem/c4.d.ts.map +1 -1
  51. package/dist/subsystem/c4.js.map +1 -1
  52. package/dist/subsystem/declarationRef.d.ts +26 -18
  53. package/dist/subsystem/declarationRef.d.ts.map +1 -1
  54. package/dist/subsystem/declarationRef.js +9 -4
  55. package/dist/subsystem/declarationRef.js.map +1 -1
  56. package/dist/subsystem/model.d.ts +19 -1
  57. package/dist/subsystem/model.d.ts.map +1 -1
  58. package/dist/subsystem/model.js +12 -2
  59. package/dist/subsystem/model.js.map +1 -1
  60. package/dist/subsystem/nodes.d.ts.map +1 -1
  61. package/dist/subsystem/nodes.js +24 -4
  62. package/dist/subsystem/nodes.js.map +1 -1
  63. package/dist/subsystem/trailBrief.d.ts.map +1 -1
  64. package/dist/subsystem/trailBrief.js +6 -1
  65. package/dist/subsystem/trailBrief.js.map +1 -1
  66. package/package.json +3 -3
  67. package/src/index.ts +9 -2
  68. package/src/pierre/PierreTrailCodeView.tsx +9 -13
  69. package/src/stories/Subsystem/C4Graph/C4ToComponentDrill.stories.tsx +496 -0
  70. package/src/stories/Subsystem/ComponentGraph/AnimatedProgression.stories.tsx +7 -7
  71. package/src/stories/Subsystem/ComponentGraph/Constructs.stories.tsx +19 -25
  72. package/src/stories/Subsystem/ComponentGraph/DetailPanel.stories.tsx +8 -10
  73. package/src/stories/Subsystem/ComponentGraph/Issues.stories.tsx +19 -19
  74. package/src/stories/Subsystem/ComponentGraph/ProposedTrails.stories.tsx +6 -6
  75. package/src/stories/Subsystem/ComponentGraph/TrailAutoplay.stories.tsx +7 -7
  76. package/src/stories/Subsystem/ComponentGraph/Trails.stories.tsx +27 -30
  77. package/src/stories/Subsystem/ComponentGraph/fixtures.ts +1 -2
  78. package/src/stories/Subsystem/ConstructsCatalog.stories.tsx +10 -13
  79. package/src/stories/Subsystem/EgoGraph/EgoGraph.stories.tsx +3 -4
  80. package/src/stories/Subsystem/Sidebar/GraphSidebar.stories.tsx +206 -0
  81. package/src/subsystem/C4Graph.groups.test.ts +96 -2
  82. package/src/subsystem/C4Graph.tsx +1377 -165
  83. package/src/subsystem/C4NodeCard.test.ts +1 -2
  84. package/src/subsystem/C4NodeCard.tsx +24 -2
  85. package/src/subsystem/ComponentDeclaration.tsx +18 -8
  86. package/src/subsystem/ConstructsCatalog.tsx +23 -8
  87. package/src/subsystem/GraphSidebar.test.tsx +152 -0
  88. package/src/subsystem/GraphSidebar.tsx +300 -0
  89. package/src/subsystem/GraphWithSidebar.test.tsx +78 -0
  90. package/src/subsystem/GraphWithSidebar.tsx +60 -0
  91. package/src/subsystem/SubsystemComponentGraph.tsx +284 -370
  92. package/src/subsystem/TrailStepsNav.test.tsx +179 -0
  93. package/src/subsystem/TrailStepsNav.tsx +372 -0
  94. package/src/subsystem/TrailsPanel.tsx +3 -4
  95. package/src/subsystem/__fixtures__/c4Drilldown.test.ts +338 -0
  96. package/src/subsystem/__fixtures__/c4Drilldown.ts +847 -0
  97. package/src/subsystem/c4.ts +41 -8
  98. package/src/subsystem/declarationRef.ts +28 -19
  99. package/src/subsystem/model.test.ts +32 -12
  100. package/src/subsystem/model.ts +30 -1
  101. package/src/subsystem/nodes.group.test.tsx +82 -0
  102. package/src/subsystem/nodes.tsx +30 -2
  103. package/src/subsystem/trailBrief.test.ts +2 -2
  104. package/src/subsystem/trailBrief.ts +6 -1
@@ -646,7 +646,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
646
646
  to: 'maintain-rpc-handler',
647
647
  mechanism: 'calls',
648
648
  file: 'packages/subsystems-studio/src/mainview/components/MaintainModelPickerModal.tsx',
649
- line: 116,
649
+ span: { startLine: 116, endLine: 116, contentHash: 'fixture' },
650
650
  symbol: 'MaintainModelPickerModal',
651
651
  purl: `${PURL}#packages/subsystems-studio/src/mainview/components/MaintainModelPickerModal.tsx`,
652
652
  annotation: 'Fire the maintainSubsystemModel RPC with the selected model.',
@@ -656,7 +656,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
656
656
  to: 'maintain-background-runner',
657
657
  mechanism: 'calls',
658
658
  file: 'packages/subsystems-studio/src/bun/index.ts',
659
- line: 2522,
659
+ span: { startLine: 2522, endLine: 2522, contentHash: 'fixture' },
660
660
  symbol: 'maintainSubsystemModelInBackground',
661
661
  purl: `${PURL}#packages/subsystems-studio/src/bun/index.ts`,
662
662
  annotation: 'RPC returns started:true immediately and hands off to the guarded runner.',
@@ -666,7 +666,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
666
666
  to: 'maintain-orchestrator',
667
667
  mechanism: 'calls',
668
668
  file: 'packages/subsystems-studio/src/bun/index.ts',
669
- line: 3160,
669
+ span: { startLine: 3160, endLine: 3160, contentHash: 'fixture' },
670
670
  symbol: 'maintainSubsystemModelInBackground',
671
671
  purl: `${PURL}#packages/subsystems-studio/src/bun/index.ts`,
672
672
  annotation: 'Run the full install → audit → route-by-verdict → brief pipeline.',
@@ -676,7 +676,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
676
676
  to: 'maintain-agent-launcher',
677
677
  mechanism: 'calls',
678
678
  file: 'packages/subsystems-studio/src/bun/maintain-model.ts',
679
- line: 854,
679
+ span: { startLine: 854, endLine: 854, contentHash: 'fixture' },
680
680
  symbol: 'runMaintainAgent',
681
681
  purl: `${PURL}#packages/subsystems-studio/src/bun/maintain-model.ts`,
682
682
  annotation: 'Resolve the model then launch the agent run, retrying once on the credentialed fallback if unusable.',
@@ -686,7 +686,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
686
686
  to: 'session-runner',
687
687
  mechanism: 'calls',
688
688
  file: 'packages/subsystems-studio/src/bun/maintain-model.ts',
689
- line: 742,
689
+ span: { startLine: 742, endLine: 742, contentHash: 'fixture' },
690
690
  symbol: 'runOpencodeV2AgentSession',
691
691
  purl: `${PURL}#packages/subsystems-studio/src/bun/maintain-model.ts`,
692
692
  annotation: 'Hand the brief, agent, and directory to the V2 session runner.',
@@ -696,7 +696,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
696
696
  to: 'events-tab',
697
697
  mechanism: 'calls',
698
698
  file: 'packages/subsystems-studio/src/bun/index.ts',
699
- line: 3164,
699
+ span: { startLine: 3164, endLine: 3164, contentHash: 'fixture' },
700
700
  symbol: 'maintainSubsystemModelInBackground',
701
701
  purl: `${PURL}#packages/subsystems-studio/src/bun/index.ts`,
702
702
  annotation: 'Open the live feed tab the instant the session id exists.',
@@ -712,7 +712,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
712
712
  to: 'sse-feed-reader',
713
713
  mechanism: 'calls',
714
714
  file: 'packages/subsystems-studio/src/bun/opencode-v2-live.ts',
715
- line: 355,
715
+ span: { startLine: 355, endLine: 355, contentHash: 'fixture' },
716
716
  symbol: 'runOpencodeV2AgentSession',
717
717
  purl: `${PURL}#packages/subsystems-studio/src/bun/opencode-v2-live.ts`,
718
718
  annotation: 'Open the /api/event subscription before creating the session.',
@@ -722,7 +722,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
722
722
  to: 'opencode-v2-server',
723
723
  mechanism: 'watches',
724
724
  file: 'packages/subsystems-studio/src/bun/opencode-v2-live.ts',
725
- line: 222,
725
+ span: { startLine: 222, endLine: 222, contentHash: 'fixture' },
726
726
  symbol: 'readSse',
727
727
  purl: `${PURL}#packages/subsystems-studio/src/bun/opencode-v2-live.ts`,
728
728
  annotation: "Stream the single SSE feed that carries every session's events.",
@@ -732,7 +732,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
732
732
  to: 'service-ensurer',
733
733
  mechanism: 'calls',
734
734
  file: 'packages/subsystems-studio/src/bun/opencode-v2-live.ts',
735
- line: 326,
735
+ span: { startLine: 326, endLine: 326, contentHash: 'fixture' },
736
736
  symbol: 'runOpencodeV2AgentSession',
737
737
  purl: `${PURL}#packages/subsystems-studio/src/bun/opencode-v2-live.ts`,
738
738
  annotation: 'Ensure the opencode2 daemon is healthy, starting the service if it is not.',
@@ -742,7 +742,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
742
742
  to: 'opencode-v2-server',
743
743
  mechanism: 'calls',
744
744
  file: 'packages/subsystems-studio/src/bun/opencode-v2-live.ts',
745
- line: 384,
745
+ span: { startLine: 384, endLine: 384, contentHash: 'fixture' },
746
746
  symbol: 'runOpencodeV2AgentSession',
747
747
  purl: `${PURL}#packages/subsystems-studio/src/bun/opencode-v2-live.ts`,
748
748
  annotation: 'POST /api/session creates the session with a 15s HTTP timeout.',
@@ -752,7 +752,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
752
752
  to: 'opencode-v2-server',
753
753
  mechanism: 'calls',
754
754
  file: 'packages/subsystems-studio/src/bun/opencode-v2-live.ts',
755
- line: 428,
755
+ span: { startLine: 428, endLine: 428, contentHash: 'fixture' },
756
756
  symbol: 'runOpencodeV2AgentSession',
757
757
  purl: `${PURL}#packages/subsystems-studio/src/bun/opencode-v2-live.ts`,
758
758
  annotation: 'POST /api/session/{id}/prompt feeds the maintain brief with a 15s HTTP timeout.',
@@ -762,7 +762,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
762
762
  to: 'terminal-matcher',
763
763
  mechanism: 'calls',
764
764
  file: 'packages/subsystems-studio/src/bun/opencode-v2-live.ts',
765
- line: 365,
765
+ span: { startLine: 365, endLine: 365, contentHash: 'fixture' },
766
766
  symbol: 'readSse',
767
767
  purl: `${PURL}#packages/subsystems-studio/src/bun/opencode-v2-live.ts`,
768
768
  annotation: 'Flag sawTerminal when the event is an execution finish or session idle.',
@@ -772,7 +772,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
772
772
  to: 'session-runner',
773
773
  mechanism: 'feeds',
774
774
  file: 'packages/subsystems-studio/src/bun/opencode-v2-live.ts',
775
- line: 469,
775
+ span: { startLine: 469, endLine: 469, contentHash: 'fixture' },
776
776
  symbol: 'runOpencodeV2AgentSession',
777
777
  purl: `${PURL}#packages/subsystems-studio/src/bun/opencode-v2-live.ts`,
778
778
  annotation: 'Wait loop polls every 400ms until sawTerminal or the 15-minute deadline.',
@@ -782,7 +782,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
782
782
  to: 'maintain-probe-registry',
783
783
  mechanism: 'reads',
784
784
  file: 'packages/subsystems-studio/src/bun/opencode-v2-live.ts',
785
- line: 484,
785
+ span: { startLine: 484, endLine: 484, contentHash: 'fixture' },
786
786
  symbol: 'runOpencodeV2AgentSession',
787
787
  purl: `${PURL}#packages/subsystems-studio/src/bun/opencode-v2-live.ts`,
788
788
  annotation: "Confirm the model's first tool call landed the liveness probe; abort as unusable on timeout.",
@@ -792,7 +792,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
792
792
  to: 'live-feed-store',
793
793
  mechanism: 'writes',
794
794
  file: 'packages/subsystems-studio/src/bun/opencode-v2-live.ts',
795
- line: 529,
795
+ span: { startLine: 529, endLine: 529, contentHash: 'fixture' },
796
796
  symbol: 'runOpencodeV2AgentSession',
797
797
  purl: `${PURL}#packages/subsystems-studio/src/bun/opencode-v2-live.ts`,
798
798
  annotation: 'Stamp the feed done (or error) when the wait loop exits.',
@@ -802,7 +802,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
802
802
  to: 'maintain-picker',
803
803
  mechanism: 'feeds',
804
804
  file: 'packages/subsystems-studio/src/bun/index.ts',
805
- line: 3187,
805
+ span: { startLine: 3187, endLine: 3187, contentHash: 'fixture' },
806
806
  symbol: 'maintainSubsystemModelInBackground',
807
807
  purl: `${PURL}#packages/subsystems-studio/src/bun/index.ts`,
808
808
  annotation: 'Broadcast done/error so the Maintain row flips off Running.',
@@ -818,7 +818,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
818
818
  to: 'probe-route',
819
819
  mechanism: 'calls',
820
820
  file: 'packages/subsystems-studio/src/bun/http-server.ts',
821
- line: 314,
821
+ span: { startLine: 314, endLine: 314, contentHash: 'fixture' },
822
822
  symbol: 'handleSubsystemModelRequest',
823
823
  purl: `${PURL}#packages/subsystems-studio/src/bun/http-server.ts`,
824
824
  annotation: "The agent's step-0 tool call curls POST /api/maintainer/probe with the run token.",
@@ -828,7 +828,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
828
828
  to: 'maintain-probe-registry',
829
829
  mechanism: 'writes',
830
830
  file: 'packages/subsystems-studio/src/bun/http-server.ts',
831
- line: 318,
831
+ span: { startLine: 318, endLine: 318, contentHash: 'fixture' },
832
832
  symbol: 'getMaintainerProbeRegistry',
833
833
  purl: `${PURL}#packages/subsystems-studio/src/bun/http-server.ts`,
834
834
  annotation: 'mark(runId) records when the probe landed.',
@@ -838,7 +838,7 @@ const MAINTAIN_TRAILS: SubsystemTrail[] = [
838
838
  to: 'maintain-probe-registry',
839
839
  mechanism: 'reads',
840
840
  file: 'packages/subsystems-studio/src/bun/opencode-v2-live.ts',
841
- line: 484,
841
+ span: { startLine: 484, endLine: 484, contentHash: 'fixture' },
842
842
  symbol: 'runOpencodeV2AgentSession',
843
843
  purl: `${PURL}#packages/subsystems-studio/src/bun/opencode-v2-live.ts`,
844
844
  annotation: 'Each loop tick checks whether the token landed before the probe deadline.',
@@ -92,7 +92,7 @@ const trails: SubsystemTrail[] = [
92
92
  to: 'maintain',
93
93
  mechanism: 'calls',
94
94
  file: 'src/bun/verify-subsystem-component.ts',
95
- line: 1,
95
+ span: { startLine: 1, endLine: 1, contentHash: 'fixture' },
96
96
  symbol: 'auditSubsystemModel',
97
97
  annotation: 'Live-only trail — no proposed badge.',
98
98
  },
@@ -107,7 +107,7 @@ const trails: SubsystemTrail[] = [
107
107
  to: 'maintain',
108
108
  mechanism: 'calls',
109
109
  file: 'src/bun/verify-subsystem-component.ts',
110
- line: 1,
110
+ span: { startLine: 1, endLine: 1, contentHash: 'fixture' },
111
111
  symbol: 'auditSubsystemModel',
112
112
  },
113
113
  {
@@ -115,7 +115,7 @@ const trails: SubsystemTrail[] = [
115
115
  to: 'lifecycle',
116
116
  mechanism: 'uses',
117
117
  file: 'src/bun/maintain-model.ts',
118
- line: 1,
118
+ span: { startLine: 1, endLine: 1, contentHash: 'fixture' },
119
119
  symbol: 'runMaintainModel',
120
120
  annotation: 'Step onto the proposed lifecycle — step index is tinted.',
121
121
  },
@@ -124,7 +124,7 @@ const trails: SubsystemTrail[] = [
124
124
  to: 'cli',
125
125
  mechanism: 'calls',
126
126
  file: 'src/bun/maintain-model.ts',
127
- line: 1,
127
+ span: { startLine: 1, endLine: 1, contentHash: 'fixture' },
128
128
  symbol: 'OpenCodeV2Lifecycle.ensure',
129
129
  },
130
130
  ],
@@ -138,7 +138,7 @@ const trails: SubsystemTrail[] = [
138
138
  to: 'cache',
139
139
  mechanism: 'writes',
140
140
  file: 'src/bun/maintain-model.ts',
141
- line: 1,
141
+ span: { startLine: 1, endLine: 1, contentHash: 'fixture' },
142
142
  symbol: 'LifecycleProbeCache.set',
143
143
  annotation: 'Both endpoints are proposed.',
144
144
  },
@@ -153,7 +153,7 @@ const trails: SubsystemTrail[] = [
153
153
  to: 'cli',
154
154
  mechanism: 'uses',
155
155
  file: 'src/bun/verify-subsystem-component.ts',
156
- line: 1,
156
+ span: { startLine: 1, endLine: 1, contentHash: 'fixture' },
157
157
  symbol: 'probeCliVersion',
158
158
  // Step-level proposed: BOTH endpoints are real components — the
159
159
  // seam itself is what is planned. The edge label draws dashed on
@@ -87,7 +87,7 @@ const trails: SubsystemTrail[] = [
87
87
  to: 'api',
88
88
  mechanism: 'calls',
89
89
  file: 'src/ui/BookingPage.tsx',
90
- line: 42,
90
+ span: { startLine: 42, endLine: 42, contentHash: 'fixture' },
91
91
  purl: stepPurl('src/ui/BookingPage.tsx'),
92
92
  symbol: 'BookingPage.submit',
93
93
  annotation: 'Submit hands the picked slot to the API.',
@@ -97,7 +97,7 @@ const trails: SubsystemTrail[] = [
97
97
  to: 'store',
98
98
  mechanism: 'writes',
99
99
  file: 'src/api/checkout.ts',
100
- line: 18,
100
+ span: { startLine: 18, endLine: 18, contentHash: 'fixture' },
101
101
  purl: stepPurl('src/api/checkout.ts'),
102
102
  symbol: 'checkoutApi.book',
103
103
  annotation: 'API writes the booking into the store.',
@@ -107,7 +107,7 @@ const trails: SubsystemTrail[] = [
107
107
  to: 'db',
108
108
  mechanism: 'writes',
109
109
  file: 'src/store/bookingStore.ts',
110
- line: 27,
110
+ span: { startLine: 27, endLine: 27, contentHash: 'fixture' },
111
111
  purl: stepPurl('src/store/bookingStore.ts'),
112
112
  symbol: 'BookingStore.commit',
113
113
  annotation: 'Store commits the row.',
@@ -117,7 +117,7 @@ const trails: SubsystemTrail[] = [
117
117
  to: 'ui',
118
118
  mechanism: 'produces',
119
119
  file: 'src/api/checkout.ts',
120
- line: 24,
120
+ span: { startLine: 24, endLine: 24, contentHash: 'fixture' },
121
121
  purl: stepPurl('src/api/checkout.ts'),
122
122
  symbol: 'checkoutApi.respond',
123
123
  annotation: 'API returns the confirmed booking.',
@@ -133,7 +133,7 @@ const trails: SubsystemTrail[] = [
133
133
  to: 'api',
134
134
  mechanism: 'calls',
135
135
  file: 'src/ui/BookingPage.tsx',
136
- line: 61,
136
+ span: { startLine: 61, endLine: 61, contentHash: 'fixture' },
137
137
  purl: stepPurl('src/ui/BookingPage.tsx'),
138
138
  symbol: 'BookingPage.cancel',
139
139
  },
@@ -142,7 +142,7 @@ const trails: SubsystemTrail[] = [
142
142
  to: 'store',
143
143
  mechanism: 'writes',
144
144
  file: 'src/api/checkout.ts',
145
- line: 33,
145
+ span: { startLine: 33, endLine: 33, contentHash: 'fixture' },
146
146
  purl: stepPurl('src/api/checkout.ts'),
147
147
  symbol: 'checkoutApi.cancel',
148
148
  },
@@ -151,7 +151,7 @@ const trails: SubsystemTrail[] = [
151
151
  to: 'db',
152
152
  mechanism: 'writes',
153
153
  file: 'src/store/bookingStore.ts',
154
- line: 41,
154
+ span: { startLine: 41, endLine: 41, contentHash: 'fixture' },
155
155
  purl: stepPurl('src/store/bookingStore.ts'),
156
156
  symbol: 'BookingStore.remove',
157
157
  },
@@ -134,32 +134,32 @@ const drawingTrails: SubsystemTrail[] = [
134
134
  id: 'tl-open-drawing',
135
135
  title: 'Open drawing',
136
136
  steps: [
137
- { from: 'panel', to: 'storage', mechanism: 'calls', file: 'src/panels/DrawingsLeftPanel.tsx', line: 56, purl: stepPurl('src/panels/DrawingsLeftPanel.tsx'), symbol: 'DrawingsLeftPanel.scan', annotation: 'Lists the drawings directory; each row feeds an open intent.' },
138
- { from: 'panel', to: 'host', mechanism: 'produces', file: 'src/panels/DrawingsLeftPanel.tsx', line: 85, purl: stepPurl('src/panels/DrawingsLeftPanel.tsx'), symbol: 'DrawingsLeftPanel.openDrawing', annotation: 'Emits the open intent up to the host.' },
139
- { from: 'host', to: 'storage', mechanism: 'calls', file: 'src/hooks/useDrawingsHost.ts', line: 45, purl: stepPurl('src/hooks/useDrawingsHost.ts'), symbol: 'useDrawingsHost.openDrawing', annotation: 'Host resolves the path and delegates to storage.' },
140
- { from: 'host', to: 'shell', mechanism: 'produces', file: 'src/workspace/WorkspaceShell.tsx', line: 369, purl: stepPurl('src/workspace/WorkspaceShell.tsx'), symbol: 'WorkspaceShell.openTab', annotation: 'Asks the shell to surface the drawing as a tab.' },
141
- { from: 'shell', to: 'tab', mechanism: 'feeds', file: 'src/workspace/WorkspaceShell.tsx', line: 372, purl: stepPurl('src/workspace/WorkspaceShell.tsx'), symbol: 'WorkspaceShell.mountTab' },
142
- { from: 'storage', to: 'fs', mechanism: 'calls', file: 'src/storage/drawingsStorage.ts', line: 90, purl: stepPurl('src/storage/drawingsStorage.ts'), symbol: 'DrawingsStorage.read', annotation: 'Reads the file through the sandboxed fs service.' },
143
- { from: 'tab', to: 'fs', mechanism: 'calls', file: 'src/components/DrawingTabContent.tsx', line: 83, purl: stepPurl('src/components/DrawingTabContent.tsx'), symbol: 'DrawingTabContent.load' },
137
+ { from: 'panel', to: 'storage', mechanism: 'calls', file: 'src/panels/DrawingsLeftPanel.tsx', span: { startLine: 56, endLine: 56, contentHash: 'fixture' }, purl: stepPurl('src/panels/DrawingsLeftPanel.tsx'), symbol: 'DrawingsLeftPanel.scan', annotation: 'Lists the drawings directory; each row feeds an open intent.' },
138
+ { from: 'panel', to: 'host', mechanism: 'produces', file: 'src/panels/DrawingsLeftPanel.tsx', span: { startLine: 85, endLine: 85, contentHash: 'fixture' }, purl: stepPurl('src/panels/DrawingsLeftPanel.tsx'), symbol: 'DrawingsLeftPanel.openDrawing', annotation: 'Emits the open intent up to the host.' },
139
+ { from: 'host', to: 'storage', mechanism: 'calls', file: 'src/hooks/useDrawingsHost.ts', span: { startLine: 45, endLine: 45, contentHash: 'fixture' }, purl: stepPurl('src/hooks/useDrawingsHost.ts'), symbol: 'useDrawingsHost.openDrawing', annotation: 'Host resolves the path and delegates to storage.' },
140
+ { from: 'host', to: 'shell', mechanism: 'produces', file: 'src/workspace/WorkspaceShell.tsx', span: { startLine: 369, endLine: 369, contentHash: 'fixture' }, purl: stepPurl('src/workspace/WorkspaceShell.tsx'), symbol: 'WorkspaceShell.openTab', annotation: 'Asks the shell to surface the drawing as a tab.' },
141
+ { from: 'shell', to: 'tab', mechanism: 'feeds', file: 'src/workspace/WorkspaceShell.tsx', span: { startLine: 372, endLine: 372, contentHash: 'fixture' }, purl: stepPurl('src/workspace/WorkspaceShell.tsx'), symbol: 'WorkspaceShell.mountTab' },
142
+ { from: 'storage', to: 'fs', mechanism: 'calls', file: 'src/storage/drawingsStorage.ts', span: { startLine: 90, endLine: 90, contentHash: 'fixture' }, purl: stepPurl('src/storage/drawingsStorage.ts'), symbol: 'DrawingsStorage.read', annotation: 'Reads the file through the sandboxed fs service.' },
143
+ { from: 'tab', to: 'fs', mechanism: 'calls', file: 'src/components/DrawingTabContent.tsx', span: { startLine: 83, endLine: 83, contentHash: 'fixture' }, purl: stepPurl('src/components/DrawingTabContent.tsx'), symbol: 'DrawingTabContent.load' },
144
144
  ],
145
145
  },
146
146
  {
147
147
  id: 'tl-save-drawing',
148
148
  title: 'Save drawing',
149
149
  steps: [
150
- { from: 'tab', to: 'fs', mechanism: 'calls', file: 'src/components/DrawingTabContent.tsx', line: 112, purl: stepPurl('src/components/DrawingTabContent.tsx'), symbol: 'DrawingTabContent.save' },
151
- { from: 'tab', to: 'host', mechanism: 'produces', file: 'src/components/DrawingTabContent.tsx', line: 121, purl: stepPurl('src/components/DrawingTabContent.tsx'), symbol: 'DrawingTabContent.emitSaved' },
152
- { from: 'host', to: 'panel', mechanism: 'produces', file: 'src/hooks/useDrawingsHost.ts', line: 64, purl: stepPurl('src/hooks/useDrawingsHost.ts'), symbol: 'useDrawingsHost.onSaved' },
153
- { from: 'panel', to: 'storage', mechanism: 'calls', file: 'src/panels/DrawingsLeftPanel.tsx', line: 56, purl: stepPurl('src/panels/DrawingsLeftPanel.tsx'), symbol: 'DrawingsLeftPanel.scan' },
150
+ { from: 'tab', to: 'fs', mechanism: 'calls', file: 'src/components/DrawingTabContent.tsx', span: { startLine: 112, endLine: 112, contentHash: 'fixture' }, purl: stepPurl('src/components/DrawingTabContent.tsx'), symbol: 'DrawingTabContent.save' },
151
+ { from: 'tab', to: 'host', mechanism: 'produces', file: 'src/components/DrawingTabContent.tsx', span: { startLine: 121, endLine: 121, contentHash: 'fixture' }, purl: stepPurl('src/components/DrawingTabContent.tsx'), symbol: 'DrawingTabContent.emitSaved' },
152
+ { from: 'host', to: 'panel', mechanism: 'produces', file: 'src/hooks/useDrawingsHost.ts', span: { startLine: 64, endLine: 64, contentHash: 'fixture' }, purl: stepPurl('src/hooks/useDrawingsHost.ts'), symbol: 'useDrawingsHost.onSaved' },
153
+ { from: 'panel', to: 'storage', mechanism: 'calls', file: 'src/panels/DrawingsLeftPanel.tsx', span: { startLine: 56, endLine: 56, contentHash: 'fixture' }, purl: stepPurl('src/panels/DrawingsLeftPanel.tsx'), symbol: 'DrawingsLeftPanel.scan' },
154
154
  ],
155
155
  },
156
156
  {
157
157
  id: 'tl-delete-drawing',
158
158
  title: 'Delete drawing',
159
159
  steps: [
160
- { from: 'host', to: 'fs', mechanism: 'calls', file: 'src/hooks/useDrawingsHost.ts', line: 64, purl: stepPurl('src/hooks/useDrawingsHost.ts'), symbol: 'useDrawingsHost.deleteDrawing' },
161
- { from: 'host', to: 'panel', mechanism: 'produces', file: 'src/hooks/useDrawingsHost.ts', line: 66, purl: stepPurl('src/hooks/useDrawingsHost.ts'), symbol: 'useDrawingsHost.refreshList' },
162
- { from: 'panel', to: 'storage', mechanism: 'calls', file: 'src/panels/DrawingsLeftPanel.tsx', line: 56, purl: stepPurl('src/panels/DrawingsLeftPanel.tsx'), symbol: 'DrawingsLeftPanel.scan' },
160
+ { from: 'host', to: 'fs', mechanism: 'calls', file: 'src/hooks/useDrawingsHost.ts', span: { startLine: 64, endLine: 64, contentHash: 'fixture' }, purl: stepPurl('src/hooks/useDrawingsHost.ts'), symbol: 'useDrawingsHost.deleteDrawing' },
161
+ { from: 'host', to: 'panel', mechanism: 'produces', file: 'src/hooks/useDrawingsHost.ts', span: { startLine: 66, endLine: 66, contentHash: 'fixture' }, purl: stepPurl('src/hooks/useDrawingsHost.ts'), symbol: 'useDrawingsHost.refreshList' },
162
+ { from: 'panel', to: 'storage', mechanism: 'calls', file: 'src/panels/DrawingsLeftPanel.tsx', span: { startLine: 56, endLine: 56, contentHash: 'fixture' }, purl: stepPurl('src/panels/DrawingsLeftPanel.tsx'), symbol: 'DrawingsLeftPanel.scan' },
163
163
  ],
164
164
  },
165
165
  ];
@@ -255,7 +255,7 @@ const proposedTrails: SubsystemTrail[] = [
255
255
  to: 'storage',
256
256
  mechanism: 'calls',
257
257
  file: 'src/hooks/useDrawingsHost.ts',
258
- line: 45,
258
+ span: { startLine: 45, endLine: 45, contentHash: 'fixture' },
259
259
  purl: stepPurl('src/hooks/useDrawingsHost.ts'),
260
260
  symbol: 'useDrawingsHost.openDrawing',
261
261
  annotation: 'Live step — its snippet still renders.',
@@ -265,7 +265,7 @@ const proposedTrails: SubsystemTrail[] = [
265
265
  to: 'runs',
266
266
  mechanism: 'writes',
267
267
  file: 'src/runs/subsystemModelRuns.ts',
268
- line: 1,
268
+ span: { startLine: 1, endLine: 1, contentHash: 'fixture' },
269
269
  purl: stepPurl('src/runs/subsystemModelRuns.ts'),
270
270
  symbol: 'SubsystemModelRunStore.write',
271
271
  annotation: 'Proposed seam — the file is not in the checkout yet.',
@@ -350,11 +350,10 @@ const clickableComponents: SubsystemComponent[] = [
350
350
  symbol: 'LoadPanel',
351
351
  purpose: 'loads the drawing list and hands rows to the render surface',
352
352
  process: 'draw-list',
353
- declarationRef: {
354
- file: 'src/load/LoadPanel.tsx',
353
+ declarationSpan: {
355
354
  startLine: 3,
356
- lineHash: 'story',
357
- capturedAt: '2026-01-01T00:00:00.000Z',
355
+ endLine: 3,
356
+ contentHash: 'story',
358
357
  },
359
358
  declaration: {
360
359
  kind: 'function',
@@ -374,11 +373,10 @@ const clickableComponents: SubsystemComponent[] = [
374
373
  symbol: 'DrawingStore.list',
375
374
  purpose: 'lists stored drawings for the panel',
376
375
  process: 'draw-list',
377
- declarationRef: {
378
- file: 'src/store/DrawingStore.ts',
376
+ declarationSpan: {
379
377
  startLine: 4,
380
- lineHash: 'story',
381
- capturedAt: '2026-01-01T00:00:00.000Z',
378
+ endLine: 4,
379
+ contentHash: 'story',
382
380
  },
383
381
  declaration: {
384
382
  kind: 'method',
@@ -397,11 +395,10 @@ const clickableComponents: SubsystemComponent[] = [
397
395
  symbol: 'RenderSurface',
398
396
  purpose: 'paints a drawing into a surface',
399
397
  process: 'draw-host',
400
- declarationRef: {
401
- file: 'src/render/RenderSurface.ts',
398
+ declarationSpan: {
402
399
  startLine: 3,
403
- lineHash: 'story',
404
- capturedAt: '2026-01-01T00:00:00.000Z',
400
+ endLine: 3,
401
+ contentHash: 'story',
405
402
  },
406
403
  declaration: {
407
404
  kind: 'class',
@@ -454,7 +451,7 @@ const clickableTrails: SubsystemTrail[] = [
454
451
  to: 'drawing-store-list',
455
452
  mechanism: 'calls',
456
453
  file: 'src/load/LoadPanel.tsx',
457
- line: 4,
454
+ span: { startLine: 4, endLine: 4, contentHash: 'fixture' },
458
455
  purl: stepPurl('src/load/LoadPanel.tsx'),
459
456
  symbol: 'LoadPanel.load',
460
457
  annotation:
@@ -465,7 +462,7 @@ const clickableTrails: SubsystemTrail[] = [
465
462
  to: 'render-surface',
466
463
  mechanism: 'calls',
467
464
  file: 'src/store/DrawingStore.ts',
468
- line: 5,
465
+ span: { startLine: 5, endLine: 5, contentHash: 'fixture' },
469
466
  purl: stepPurl('src/store/DrawingStore.ts'),
470
467
  symbol: 'DrawingStore.list',
471
468
  annotation: 'list reads through RenderSurface — click RenderSurface.',
@@ -38,7 +38,7 @@ export function trailFromSteps(
38
38
  to,
39
39
  mechanism,
40
40
  file,
41
- line,
41
+ span: { startLine: line, endLine: line, contentHash: 'fixture' },
42
42
  purl: `pkg:github/storybook/fixture#${file}`,
43
43
  symbol: symbol ?? from,
44
44
  })),
@@ -54,7 +54,6 @@ export function graphSpecFromSteps(
54
54
  to,
55
55
  mechanism: mechanism as SubsystemTrailMechanism,
56
56
  file: 'story-placeholder.ts',
57
- line: 1,
58
57
  purl: 'pkg:github/storybook/fixture#story-placeholder.ts',
59
58
  symbol: from,
60
59
  }));
@@ -43,11 +43,10 @@ const components: SubsystemComponent[] = [
43
43
  process: 'notes-api/server',
44
44
  file: 'src/api/submitNote.ts',
45
45
  purpose: 'HTTP/handler entry — validates and hands off to the service.',
46
- declarationRef: {
47
- file: 'src/api/submitNote.ts',
46
+ declarationSpan: {
48
47
  startLine: 7,
49
- lineHash: 'storybook-placeholder',
50
- capturedAt: new Date(0).toISOString(),
48
+ endLine: 7,
49
+ contentHash: 'storybook-placeholder',
51
50
  },
52
51
  declaration: {
53
52
  kind: 'function',
@@ -69,11 +68,10 @@ const components: SubsystemComponent[] = [
69
68
  process: 'notes-api/server',
70
69
  file: 'src/NoteService.ts',
71
70
  purpose: 'Owns intake rules; methods are separate nodes when they matter.',
72
- declarationRef: {
73
- file: 'src/NoteService.ts',
71
+ declarationSpan: {
74
72
  startLine: 3,
75
- lineHash: 'storybook-placeholder',
76
- capturedAt: new Date(0).toISOString(),
73
+ endLine: 3,
74
+ contentHash: 'storybook-placeholder',
77
75
  },
78
76
  declaration: {
79
77
  kind: 'class',
@@ -101,11 +99,10 @@ const components: SubsystemComponent[] = [
101
99
  process: 'notes-api/server',
102
100
  file: 'src/NoteService.ts',
103
101
  purpose: 'Instance method on NoteService — written as its own construct.',
104
- declarationRef: {
105
- file: 'src/NoteService.ts',
102
+ declarationSpan: {
106
103
  startLine: 14,
107
- lineHash: 'storybook-placeholder',
108
- capturedAt: new Date(0).toISOString(),
104
+ endLine: 14,
105
+ contentHash: 'storybook-placeholder',
109
106
  },
110
107
  declaration: {
111
108
  kind: 'method',
@@ -337,7 +334,7 @@ function renderFileViewer(file: string, opts?: SubsystemOpenFileOptions) {
337
334
  filePath={file}
338
335
  fileName={file.split('/').pop() ?? file}
339
336
  startLine={startLine}
340
- endLine={startLine}
337
+ endLine={opts?.endLine ?? startLine}
341
338
  focusLine={startLine}
342
339
  contextLines={12}
343
340
  readFile={readStoryFile}
@@ -151,11 +151,10 @@ function toComponent(
151
151
  ...(line != null ? { line } : {}),
152
152
  ...(line != null
153
153
  ? {
154
- declarationRef: {
155
- file: node.source_file ?? '',
154
+ declarationSpan: {
156
155
  startLine: line,
157
- lineHash: 'ego-fixture',
158
- capturedAt: new Date(0).toISOString(),
156
+ endLine: line,
157
+ contentHash: 'ego-fixture',
159
158
  },
160
159
  }
161
160
  : {}),