@principal-ai/principal-view-react 0.16.55 → 0.16.57
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.
- package/dist/graphify/consolidated.d.ts +16 -1
- package/dist/graphify/consolidated.d.ts.map +1 -1
- package/dist/graphify/index.d.ts +1 -1
- package/dist/graphify/index.d.ts.map +1 -1
- package/dist/graphify/index.js.map +1 -1
- package/dist/graphify/kind.d.ts +1 -1
- package/dist/graphify/kind.d.ts.map +1 -1
- package/dist/graphify/kind.js +7 -1
- package/dist/graphify/kind.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/pierre/constructColors.d.ts +24 -0
- package/dist/pierre/constructColors.d.ts.map +1 -0
- package/dist/pierre/constructColors.js +91 -0
- package/dist/pierre/constructColors.js.map +1 -0
- package/dist/pierre/index.d.ts +2 -0
- package/dist/pierre/index.d.ts.map +1 -1
- package/dist/pierre/index.js +1 -0
- package/dist/pierre/index.js.map +1 -1
- package/dist/pierre/pierreSyntaxTheme.d.ts +11 -0
- package/dist/pierre/pierreSyntaxTheme.d.ts.map +1 -0
- package/dist/pierre/pierreSyntaxTheme.js +20 -0
- package/dist/pierre/pierreSyntaxTheme.js.map +1 -0
- package/dist/pierre/syntaxTokens.d.ts +11 -0
- package/dist/pierre/syntaxTokens.d.ts.map +1 -0
- package/dist/pierre/syntaxTokens.js +51 -0
- package/dist/pierre/syntaxTokens.js.map +1 -0
- package/dist/stories/Subsystem/ComponentGraph/fixtures.d.ts +8 -0
- package/dist/stories/Subsystem/ComponentGraph/fixtures.d.ts.map +1 -0
- package/dist/stories/Subsystem/ComponentGraph/fixtures.js +116 -0
- package/dist/stories/Subsystem/ComponentGraph/fixtures.js.map +1 -0
- package/dist/subsystem/ComponentDeclaration.d.ts +2 -2
- package/dist/subsystem/ComponentDeclaration.d.ts.map +1 -1
- package/dist/subsystem/ComponentDeclaration.js +47 -24
- package/dist/subsystem/ComponentDeclaration.js.map +1 -1
- package/dist/subsystem/SubsystemComponentGraph.d.ts.map +1 -1
- package/dist/subsystem/SubsystemComponentGraph.js +23 -2
- package/dist/subsystem/SubsystemComponentGraph.js.map +1 -1
- package/dist/subsystem/formatDeclaration.d.ts.map +1 -1
- package/dist/subsystem/formatDeclaration.js +49 -10
- package/dist/subsystem/formatDeclaration.js.map +1 -1
- package/dist/subsystem/model.d.ts +57 -12
- package/dist/subsystem/model.d.ts.map +1 -1
- package/dist/subsystem/model.js +54 -24
- package/dist/subsystem/model.js.map +1 -1
- package/dist/subsystem/nodes.d.ts +4 -1
- package/dist/subsystem/nodes.d.ts.map +1 -1
- package/dist/subsystem/nodes.js +70 -21
- package/dist/subsystem/nodes.js.map +1 -1
- package/dist/subsystem/tokenizeComponent.d.ts +4 -3
- package/dist/subsystem/tokenizeComponent.d.ts.map +1 -1
- package/dist/subsystem/tokenizeComponent.js +7 -12
- package/dist/subsystem/tokenizeComponent.js.map +1 -1
- package/dist/subsystem/tokenizeFormatted.d.ts +3 -6
- package/dist/subsystem/tokenizeFormatted.d.ts.map +1 -1
- package/dist/subsystem/tokenizeFormatted.js +4 -75
- package/dist/subsystem/tokenizeFormatted.js.map +1 -1
- package/package.json +3 -1
- package/src/graphify/consolidated.ts +18 -1
- package/src/graphify/index.ts +1 -0
- package/src/graphify/kind.ts +7 -1
- package/src/index.ts +5 -3
- package/src/pierre/constructColors.test.ts +52 -0
- package/src/pierre/constructColors.ts +112 -0
- package/src/pierre/index.ts +5 -0
- package/src/pierre/pierreSyntaxTheme.ts +23 -0
- package/src/pierre/syntaxTokens.test.ts +35 -0
- package/src/pierre/syntaxTokens.ts +60 -0
- package/src/stories/{BoundaryNodes.stories.tsx → Audit/BoundaryNodes.stories.tsx} +1 -1
- package/src/stories/{CanvasEdgeTypes.stories.tsx → Audit/CanvasEdgeTypes.stories.tsx} +1 -1
- package/src/stories/{CanvasNodeTypes.stories.tsx → Audit/CanvasNodeTypes.stories.tsx} +1 -1
- package/src/stories/{ColorPriority.stories.tsx → Audit/ColorPriority.stories.tsx} +1 -1
- package/src/stories/{DiamondBadges.stories.tsx → Audit/DiamondBadges.stories.tsx} +1 -1
- package/src/stories/{NodeDimensionsTesting.stories.tsx → Audit/NodeDimensionsTesting.stories.tsx} +2 -2
- package/src/stories/{NodeFieldsAudit.stories.tsx → Audit/NodeFieldsAudit.stories.tsx} +1 -1
- package/src/stories/{NodeFontSizeTesting.stories.tsx → Audit/NodeFontSizeTesting.stories.tsx} +2 -2
- package/src/stories/{NodeShapes.stories.tsx → Audit/NodeShapes.stories.tsx} +1 -1
- package/src/stories/{WideNodesTesting.stories.tsx → Audit/WideNodesTesting.stories.tsx} +2 -2
- package/src/stories/{dashboard → Components}/DashboardRenderer.stories.tsx +2 -2
- package/src/stories/{GraphRenderer.stories.tsx → Components/GraphRenderer.stories.tsx} +2 -2
- package/src/stories/{MultiCanvasRenderer.stories.tsx → Components/MultiCanvasRenderer.stories.tsx} +2 -2
- package/src/stories/{SequenceDiagram.stories.tsx → Components/SequenceDiagram.stories.tsx} +2 -2
- package/src/stories/{StateView.stories.tsx → Components/StateView.stories.tsx} +2 -2
- package/src/stories/{TraceViewer.stories.tsx → Components/TraceViewer.stories.tsx} +3 -3
- package/src/stories/{WorkflowSequenceDiagram.stories.tsx → Components/WorkflowSequenceDiagram.stories.tsx} +1 -1
- package/src/stories/{AnimationWorkshop.stories.tsx → Features/AnimationWorkshop.stories.tsx} +5 -5
- package/src/stories/{ChangeTypeVisual.stories.tsx → Features/ChangeTypeVisual.stories.tsx} +2 -2
- package/src/stories/{EventDrivenAnimations.stories.tsx → Features/EventDrivenAnimations.stories.tsx} +2 -2
- package/src/stories/{MultiConfig.stories.tsx → Features/MultiConfig.stories.tsx} +2 -2
- package/src/stories/{ElkEdgeRouting.stories.tsx → Layout/ElkEdgeRouting.stories.tsx} +2 -2
- package/src/stories/{GraphOrientation.stories.tsx → Layout/GraphOrientation.stories.tsx} +3 -3
- package/src/stories/{MultiDirectionalConnections.stories.tsx → Layout/MultiDirectionalConnections.stories.tsx} +2 -2
- package/src/stories/{NodeDefinitionComparison.stories.tsx → Nodes/NodeDefinitionComparison.stories.tsx} +2 -2
- package/src/stories/{NodeNameFallbacks.stories.tsx → Nodes/NodeNameFallbacks.stories.tsx} +2 -2
- package/src/stories/{NumericColors.stories.tsx → Nodes/NumericColors.stories.tsx} +2 -2
- package/src/stories/{EventNameDisplay.stories.tsx → OTEL/EventNameDisplay.stories.tsx} +2 -2
- package/src/stories/{EventNameFallback.stories.tsx → OTEL/EventNameFallback.stories.tsx} +2 -2
- package/src/stories/{OtelComponents.stories.tsx → OTEL/OtelComponents.stories.tsx} +3 -3
- package/src/stories/{OtelNodeTypesPrototype.stories.tsx → OTEL/OtelNodeTypesPrototype.stories.tsx} +2 -2
- package/src/stories/{RawEventCards.stories.tsx → OTEL/RawEventCards.stories.tsx} +3 -3
- package/src/stories/{SpanBadges.stories.tsx → OTEL/SpanBadges.stories.tsx} +1 -1
- package/src/stories/{ValidationEventsCanvas.stories.tsx → OTEL/ValidationEventsCanvas.stories.tsx} +3 -3
- package/src/stories/{BacklogMdCanvases.stories.tsx → RealWorld/BacklogMdCanvases.stories.tsx} +2 -2
- package/src/stories/{FileCitySequence.stories.tsx → RealWorld/FileCitySequence.stories.tsx} +4 -4
- package/src/stories/{RealCanvasFiles.stories.tsx → RealWorld/RealCanvasFiles.stories.tsx} +7 -7
- package/src/stories/{ComponentDeclarationAudit.stories.tsx → Subsystem/ComponentDeclarationAudit.stories.tsx} +19 -20
- package/src/stories/Subsystem/ComponentGraph/Appearance.stories.tsx +365 -0
- package/src/stories/Subsystem/ComponentGraph/Basics.stories.tsx +137 -0
- package/src/stories/Subsystem/ComponentGraph/Captures.stories.tsx +238 -0
- package/src/stories/Subsystem/ComponentGraph/DetailPanel.stories.tsx +315 -0
- package/src/stories/Subsystem/ComponentGraph/Scenarios.stories.tsx +959 -0
- package/src/stories/Subsystem/ComponentGraph/Spotlights.stories.tsx +646 -0
- package/src/stories/Subsystem/ComponentGraph/fixtures.ts +129 -0
- package/src/subsystem/ComponentDeclaration.tsx +64 -26
- package/src/subsystem/SubsystemComponentGraph.tsx +26 -6
- package/src/subsystem/formatDeclaration.ts +57 -11
- package/src/subsystem/model.test.ts +38 -6
- package/src/subsystem/model.ts +110 -31
- package/src/subsystem/nodes.tsx +103 -27
- package/src/subsystem/tokenizeComponent.ts +12 -12
- package/src/subsystem/tokenizeFormatted.ts +9 -82
- package/src/stories/SubsystemComponentGraph.stories.tsx +0 -1225
- /package/src/stories/{dashboard/sample-dashboards → data}/activity-feed-analytics.dashboard.json +0 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import '@xyflow/react/dist/style.css';
|
|
3
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
4
|
+
import { ThemeProvider, defaultEditorTheme } from '@principal-ade/industry-theme';
|
|
5
|
+
import { SubsystemComponentGraph } from '../../../subsystem/SubsystemComponentGraph';
|
|
6
|
+
import type { SubsystemComponent, SubsystemComponentEdge } from '../../../subsystem/model';
|
|
7
|
+
import type { GraphifyComponentDetail } from '../../../graphify';
|
|
8
|
+
import { components, edges, readerDetail, investigateOnlyComponents, investigateOnlyEdges } from './fixtures';
|
|
9
|
+
|
|
10
|
+
const meta = {
|
|
11
|
+
title: 'Subsystem/ComponentGraph/Captures',
|
|
12
|
+
component: SubsystemComponentGraph,
|
|
13
|
+
parameters: {
|
|
14
|
+
layout: 'fullscreen',
|
|
15
|
+
},
|
|
16
|
+
tags: ['autodocs'],
|
|
17
|
+
decorators: [
|
|
18
|
+
(Story) => (
|
|
19
|
+
<ThemeProvider theme={defaultEditorTheme}>
|
|
20
|
+
<Story />
|
|
21
|
+
</ThemeProvider>
|
|
22
|
+
),
|
|
23
|
+
],
|
|
24
|
+
} satisfies Meta<typeof SubsystemComponentGraph>;
|
|
25
|
+
|
|
26
|
+
export default meta;
|
|
27
|
+
type Story = StoryObj<typeof meta>;
|
|
28
|
+
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Primary: opencode V2 event reader subsystem (agent-monitoring) + consumers
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
const v2ReaderComponents = components([
|
|
33
|
+
['capture', 'capture script', 'function', 'scripts/capture-session.ts', 'pkg:github/principal-ai/agent-monitoring', 'captures a real session for fixtures'],
|
|
34
|
+
['transcript', 'transcript', 'module', 'transcript.ts', 'pkg:github/principal-ai/agent-monitoring', 'parses session records + type guards'],
|
|
35
|
+
['paths', 'paths', 'module', 'paths.ts', 'pkg:github/principal-ai/agent-monitoring', 'extracts tool names + file paths'],
|
|
36
|
+
['reader', 'SessionReader', 'class', 'SessionReader.ts', 'pkg:github/principal-ai/agent-monitoring', 'normalizes a session into universal events', 'SessionReader.normalize', readerDetail],
|
|
37
|
+
['registry', 'supported-agents', 'module', 'supported-agents.ts', 'pkg:github/principal-ai/agent-monitoring', 'registry of supported agents (the shared seam)', 'registerAgent'],
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
const v2ReaderEdges = edges([
|
|
41
|
+
['transcript', 'reader', 'imports'],
|
|
42
|
+
['paths', 'reader', 'imports'],
|
|
43
|
+
['capture', 'reader', 'calls'],
|
|
44
|
+
['reader', 'registry', 'registers-into', ['supported-agents.ts']],
|
|
45
|
+
// Consumer packages - cross-package edges leave the subgraph
|
|
46
|
+
['reader', 'trail-viewer-host', 'imports'],
|
|
47
|
+
['reader', 'core-sessions', 'imports'],
|
|
48
|
+
['reader', 'cli-session', 'imports'],
|
|
49
|
+
]);
|
|
50
|
+
|
|
51
|
+
function V2ReaderDemo() {
|
|
52
|
+
const [selected, setSelected] = useState<string | null>(null);
|
|
53
|
+
const [selectedEdge, setSelectedEdge] = useState<SubsystemComponentEdge | null>(null);
|
|
54
|
+
return (
|
|
55
|
+
<div style={{ width: '100%', height: '100vh', display: 'flex', flexDirection: 'column' }}>
|
|
56
|
+
<SubsystemComponentGraph
|
|
57
|
+
components={v2ReaderComponents}
|
|
58
|
+
edges={v2ReaderEdges}
|
|
59
|
+
onSelect={(id) => setSelected(id)}
|
|
60
|
+
onEdgeSelect={(e) => setSelectedEdge(e)}
|
|
61
|
+
/>
|
|
62
|
+
<div style={{ marginTop: 8, fontFamily: 'monospace', fontSize: 12, color: '#aaa' }}>
|
|
63
|
+
{selectedEdge
|
|
64
|
+
? `edge: ${selectedEdge.from} --${selectedEdge.mechanism}--> ${selectedEdge.to}${selectedEdge.refs?.length ? ` [refs: ${selectedEdge.refs.join(', ')}]` : ''}`
|
|
65
|
+
: selected
|
|
66
|
+
? `selected: ${selected}`
|
|
67
|
+
: 'click a component or edge to select it'}
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export const V2ReaderSubsystem: Story = {
|
|
74
|
+
render: () => <V2ReaderDemo />,
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// Investigate-and-pin capture (fixture shared with Appearance/NarrowMaxWidth)
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
export const InvestigateOnly: Story = {
|
|
81
|
+
render: () => (
|
|
82
|
+
<div style={{ width: '100%', height: '100vh', display: 'flex', flexDirection: 'column' }}>
|
|
83
|
+
<SubsystemComponentGraph components={investigateOnlyComponents} edges={investigateOnlyEdges} />
|
|
84
|
+
</div>
|
|
85
|
+
),
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// Minimal (pre-graphify) vs Resolved (post-graphify) — the SAME subsystem,
|
|
90
|
+
// showing what the LLM emits (no detail) and what graphify enrichment adds.
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
|
|
93
|
+
/** The minimal LLM-authored substrate: symbols only, no `detail`. */
|
|
94
|
+
const minimalComponents = components([
|
|
95
|
+
['reader', 'SessionReader', 'class', 'SessionReader.ts', 'pkg:github/principal-ai/agent-monitoring', 'normalizes a session into universal events', 'SessionReader'],
|
|
96
|
+
['normalize', 'normalize', 'function', 'SessionReader.ts', 'pkg:github/principal-ai/agent-monitoring', 'maps a session into universal events', 'SessionReader.normalize'],
|
|
97
|
+
['record', 'SessionRecord', 'type', 'transcript.ts', 'pkg:github/principal-ai/agent-monitoring', 'the parsed codex session record', 'SessionRecord'],
|
|
98
|
+
['transcript', 'transcript', 'module', 'transcript.ts', 'pkg:github/principal-ai/agent-monitoring', 'parses session records + type guards', 'transcript'],
|
|
99
|
+
]);
|
|
100
|
+
|
|
101
|
+
const sharedEdges = edges([
|
|
102
|
+
['transcript', 'record', 'defines'],
|
|
103
|
+
['reader', 'normalize', 'method'],
|
|
104
|
+
['normalize', 'record', 'references'],
|
|
105
|
+
]);
|
|
106
|
+
|
|
107
|
+
/** The same subsystem after `resolveSubsystemToGraphify` populates `detail`. */
|
|
108
|
+
const resolvedComponents: SubsystemComponent[] = [
|
|
109
|
+
{ ...minimalComponents[0], detail: readerDetail },
|
|
110
|
+
{
|
|
111
|
+
...minimalComponents[1],
|
|
112
|
+
detail: {
|
|
113
|
+
kind: 'function',
|
|
114
|
+
parameters: [{ name: 'session', type: 'SessionRecord' }],
|
|
115
|
+
returnType: 'SessionEvent[]',
|
|
116
|
+
callers: [{ nodeId: 'c1', name: 'capture-session', source_location: 'L120' }],
|
|
117
|
+
callees: [{ nodeId: 'c2', name: 'toUniversalEvents', source_location: 'L64' }],
|
|
118
|
+
} satisfies GraphifyComponentDetail,
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
...minimalComponents[2],
|
|
122
|
+
detail: {
|
|
123
|
+
kind: 'type',
|
|
124
|
+
properties: [
|
|
125
|
+
{ name: 'id', type: 'string' },
|
|
126
|
+
{ name: 'type', type: 'string' },
|
|
127
|
+
],
|
|
128
|
+
usedBy: [{ nodeId: 'u1', name: 'normalize', context: 'type' }],
|
|
129
|
+
implementors: ['SessionReaderLike'],
|
|
130
|
+
} satisfies GraphifyComponentDetail,
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
...minimalComponents[3],
|
|
134
|
+
detail: {
|
|
135
|
+
kind: 'module',
|
|
136
|
+
exports: ['CodexRolloutRecord', 'CodexSessionMeta'],
|
|
137
|
+
imports: [{ nodeId: 'i1', name: 'paths', relation: 'imports_from' }],
|
|
138
|
+
symbols: ['CodexRolloutRecord', 'CodexSessionMeta'],
|
|
139
|
+
} satisfies GraphifyComponentDetail,
|
|
140
|
+
},
|
|
141
|
+
];
|
|
142
|
+
|
|
143
|
+
function MinimalVsResolvedDemo({ resolved }: { resolved: boolean }) {
|
|
144
|
+
const [, setSelected] = useState<string | null>(null);
|
|
145
|
+
return (
|
|
146
|
+
<div style={{ width: '100%', height: '100vh', display: 'flex', flexDirection: 'column' }}>
|
|
147
|
+
<SubsystemComponentGraph
|
|
148
|
+
components={resolved ? resolvedComponents : minimalComponents}
|
|
149
|
+
edges={sharedEdges}
|
|
150
|
+
onSelect={(id) => setSelected(id)}
|
|
151
|
+
/>
|
|
152
|
+
<div style={{ marginTop: 8, fontFamily: 'monospace', fontSize: 12, color: '#aaa' }}>
|
|
153
|
+
{resolved
|
|
154
|
+
? 'post-graphify: click a component to see the enriched GraphifyComponentDetail'
|
|
155
|
+
: 'pre-graphify: LLM-authored symbols only — no detail yet'}
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export const MinimalPreGraphify: Story = {
|
|
162
|
+
render: () => <MinimalVsResolvedDemo resolved={false} />,
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
export const ResolvedPostGraphify: Story = {
|
|
166
|
+
render: () => <MinimalVsResolvedDemo resolved />,
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
// Investigation-derived subsystem — grok session 019fd2a9 (t3code)
|
|
171
|
+
// Read-only analysis of "provider / event threading". Components are occupied
|
|
172
|
+
// (analyzed, not edited) — no code touched, but a coherent concept was worked.
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
const investigationComponents: SubsystemComponent[] = [
|
|
175
|
+
{
|
|
176
|
+
id: 'adapter',
|
|
177
|
+
name: 'OpenCodeAdapter',
|
|
178
|
+
construct: 'module',
|
|
179
|
+
file: 'apps/server/src/provider/Layers/OpenCodeAdapter.ts',
|
|
180
|
+
purl: 'pkg:github/t3code/t3code',
|
|
181
|
+
purpose: 'adapts opencode session/threads + events to the t3 runtime',
|
|
182
|
+
symbol: 'makeOpenCodeAdapter',
|
|
183
|
+
capture: 'analyzed',
|
|
184
|
+
detail: {
|
|
185
|
+
kind: 'module',
|
|
186
|
+
exports: ['makeOpenCodeAdapter', 'OpenCodeAdapterLiveOptions'],
|
|
187
|
+
imports: [{ nodeId: 'i1', name: 'orchestration', relation: 'imports_from' }],
|
|
188
|
+
symbols: ['makeOpenCodeAdapter', 'isOpenCodeNotFound', 'OpenCodeSessionContext'],
|
|
189
|
+
} satisfies GraphifyComponentDetail,
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
id: 'ingestion',
|
|
193
|
+
name: 'ProviderRuntimeIngestion',
|
|
194
|
+
construct: 'module',
|
|
195
|
+
file: 'apps/server/src/orchestration/Layers/ProviderRuntimeIngestion.ts',
|
|
196
|
+
purl: 'pkg:github/t3code/t3code',
|
|
197
|
+
purpose: 'ingests provider events into the runtime',
|
|
198
|
+
symbol: 'ProviderRuntimeIngestion',
|
|
199
|
+
capture: 'analyzed',
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
id: 'contracts',
|
|
203
|
+
name: 'orchestration',
|
|
204
|
+
construct: 'module',
|
|
205
|
+
file: 'packages/contracts/src/orchestration.ts',
|
|
206
|
+
purl: 'pkg:github/t3code/t3code',
|
|
207
|
+
purpose: 'contracts for orchestration/providers',
|
|
208
|
+
symbol: 'ORCHESTRATION_WS_METHODS',
|
|
209
|
+
capture: 'analyzed',
|
|
210
|
+
},
|
|
211
|
+
];
|
|
212
|
+
|
|
213
|
+
const investigationEdges = edges([
|
|
214
|
+
['adapter', 'contracts', 'imports_from'],
|
|
215
|
+
['ingestion', 'adapter', 'uses'],
|
|
216
|
+
['ingestion', 'contracts', 'references'],
|
|
217
|
+
]);
|
|
218
|
+
|
|
219
|
+
function InvestigationDemo() {
|
|
220
|
+
const [selected, setSelected] = useState<string | null>(null);
|
|
221
|
+
return (
|
|
222
|
+
<div style={{ width: '100%', height: '100vh', display: 'flex', flexDirection: 'column' }}>
|
|
223
|
+
<SubsystemComponentGraph
|
|
224
|
+
components={investigationComponents}
|
|
225
|
+
edges={investigationEdges}
|
|
226
|
+
onSelect={(id) => setSelected(id)}
|
|
227
|
+
/>
|
|
228
|
+
<div style={{ marginTop: 8, fontFamily: 'monospace', fontSize: 12, color: '#aaa' }}>
|
|
229
|
+
read-only investigation snapshot (grok 019fd2a9) — components analyzed, not edited
|
|
230
|
+
{selected ? ` · selected: ${selected}` : ''}
|
|
231
|
+
</div>
|
|
232
|
+
</div>
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export const InvestigationDerived: Story = {
|
|
237
|
+
render: () => <InvestigationDemo />,
|
|
238
|
+
};
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import '@xyflow/react/dist/style.css';
|
|
3
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
4
|
+
import { ThemeProvider, defaultEditorTheme } from '@principal-ade/industry-theme';
|
|
5
|
+
import { SubsystemComponentGraph } from '../../../subsystem/SubsystemComponentGraph';
|
|
6
|
+
import { PierreFileView, PierreSnippetView } from '../../../pierre';
|
|
7
|
+
import type { SubsystemComponent, SubsystemComponentEdge } from '../../../subsystem/model';
|
|
8
|
+
import type { SubsystemOpenFileOptions } from '../../../subsystem/declarationRef';
|
|
9
|
+
import type { GraphifyComponentDetail } from '../../../graphify';
|
|
10
|
+
import componentDeclarationSource from '../../../subsystem/ComponentDeclaration.tsx?raw';
|
|
11
|
+
import resolveSource from '../../../graphify/resolve.ts?raw';
|
|
12
|
+
import { readerDetail } from './fixtures';
|
|
13
|
+
|
|
14
|
+
const meta = {
|
|
15
|
+
title: 'Subsystem/ComponentGraph/DetailPanel',
|
|
16
|
+
component: SubsystemComponentGraph,
|
|
17
|
+
parameters: {
|
|
18
|
+
layout: 'fullscreen',
|
|
19
|
+
},
|
|
20
|
+
tags: ['autodocs'],
|
|
21
|
+
decorators: [
|
|
22
|
+
(Story) => (
|
|
23
|
+
<ThemeProvider theme={defaultEditorTheme}>
|
|
24
|
+
<Story />
|
|
25
|
+
</ThemeProvider>
|
|
26
|
+
),
|
|
27
|
+
],
|
|
28
|
+
} satisfies Meta<typeof SubsystemComponentGraph>;
|
|
29
|
+
|
|
30
|
+
export default meta;
|
|
31
|
+
type Story = StoryObj<typeof meta>;
|
|
32
|
+
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// One node per GraphifyComponentDetail kind — what each looks like + drills down
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
const detailKindComponents: SubsystemComponent[] = [
|
|
37
|
+
{
|
|
38
|
+
id: 'detail-class',
|
|
39
|
+
name: 'SessionReader',
|
|
40
|
+
construct: 'class',
|
|
41
|
+
file: 'src/session/SessionReader.ts',
|
|
42
|
+
purl: 'pkg:github/principal-ai/agent-monitoring',
|
|
43
|
+
purpose: 'class-like: owns outgoing method edges',
|
|
44
|
+
symbol: '',
|
|
45
|
+
detail: readerDetail,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: 'detail-method',
|
|
49
|
+
name: 'normalize',
|
|
50
|
+
construct: 'function',
|
|
51
|
+
file: 'src/session/SessionReader.ts',
|
|
52
|
+
purl: 'pkg:github/principal-ai/agent-monitoring',
|
|
53
|
+
purpose: 'a class method — the specific thing this session focused on',
|
|
54
|
+
symbol: 'SessionReader.normalize',
|
|
55
|
+
detail: {
|
|
56
|
+
kind: 'function',
|
|
57
|
+
parameters: [{ name: 'session', type: 'SessionRecord' }],
|
|
58
|
+
returnType: 'SessionEvent[]',
|
|
59
|
+
callers: [{ nodeId: 'c1', name: 'capture-session', source_location: 'L120' }],
|
|
60
|
+
callees: [{ nodeId: 'c2', name: 'toUniversalEvents', source_location: 'L64' }],
|
|
61
|
+
} satisfies GraphifyComponentDetail,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: 'detail-fn',
|
|
65
|
+
name: 'normalizeSession',
|
|
66
|
+
construct: 'function',
|
|
67
|
+
file: 'src/event-processing/normalize.ts',
|
|
68
|
+
purl: 'pkg:github/principal-ai/agent-monitoring',
|
|
69
|
+
purpose: 'function-like: label ends () with no method edges',
|
|
70
|
+
symbol: 'normalizeSession',
|
|
71
|
+
detail: {
|
|
72
|
+
kind: 'function',
|
|
73
|
+
parameters: [
|
|
74
|
+
{ name: 'session', type: 'SessionRecord' },
|
|
75
|
+
{ name: 'limit', type: 'number' },
|
|
76
|
+
],
|
|
77
|
+
returnType: 'SessionEvent[]',
|
|
78
|
+
callers: [{ nodeId: 'c1', name: 'SessionReader.normalize', source_location: 'L120' }],
|
|
79
|
+
callees: [{ nodeId: 'c2', name: 'toUniversalEvents', source_location: 'L64' }],
|
|
80
|
+
} satisfies GraphifyComponentDetail,
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: 'detail-fn-rich',
|
|
84
|
+
name: 'mergeSessions',
|
|
85
|
+
construct: 'function',
|
|
86
|
+
file: 'src/session/merge.ts',
|
|
87
|
+
purl: 'pkg:github/principal-ai/agent-monitoring',
|
|
88
|
+
purpose: 'multi-param signature — named, positional (graphify captures types only), union types, generic return',
|
|
89
|
+
symbol: 'mergeSessions',
|
|
90
|
+
detail: {
|
|
91
|
+
kind: 'function',
|
|
92
|
+
parameters: [
|
|
93
|
+
{ name: 'sessions', type: 'SessionRecord[]' },
|
|
94
|
+
{ type: 'MergeOptions' },
|
|
95
|
+
{ name: 'strategy', type: `'append' | 'replace' | 'skip'` },
|
|
96
|
+
{ name: 'onConflict', type: '((a: SessionRecord, b: SessionRecord) => SessionRecord)' },
|
|
97
|
+
],
|
|
98
|
+
returnType: 'Promise<Map<string, SessionEvent[]>>',
|
|
99
|
+
callers: [
|
|
100
|
+
{ nodeId: 'c1', name: 'capture-session', source_location: 'L88' },
|
|
101
|
+
{ nodeId: 'c3', name: 'backfill', source_location: 'L210' },
|
|
102
|
+
],
|
|
103
|
+
callees: [{ nodeId: 'c2', name: 'toUniversalEvents', source_location: 'L64' }],
|
|
104
|
+
} satisfies GraphifyComponentDetail,
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
id: 'detail-fn-void',
|
|
108
|
+
name: 'flush',
|
|
109
|
+
construct: 'function',
|
|
110
|
+
file: 'src/event-processing/sink.ts',
|
|
111
|
+
purl: 'pkg:github/principal-ai/agent-monitoring',
|
|
112
|
+
purpose: 'no parameters, no return type — the barest function signature',
|
|
113
|
+
symbol: 'flush',
|
|
114
|
+
detail: {
|
|
115
|
+
kind: 'function',
|
|
116
|
+
parameters: [],
|
|
117
|
+
callers: [{ nodeId: 'c4', name: 'EventProcessor.dispose', source_location: 'L142' }],
|
|
118
|
+
callees: [],
|
|
119
|
+
} satisfies GraphifyComponentDetail,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: 'detail-class-rich',
|
|
123
|
+
name: 'EventProcessor',
|
|
124
|
+
construct: 'class',
|
|
125
|
+
file: 'src/event-processing/EventProcessor.ts',
|
|
126
|
+
purl: 'pkg:github/principal-ai/agent-monitoring',
|
|
127
|
+
purpose: 'class with fully-typed members — method params + returns, field types, extends + implements',
|
|
128
|
+
symbol: 'EventProcessor',
|
|
129
|
+
detail: {
|
|
130
|
+
kind: 'class',
|
|
131
|
+
methods: [
|
|
132
|
+
{ nodeId: 'rm1', name: 'process', parameters: [{ type: 'RawEvent' }, { type: 'ProcessingOptions' }], returnType: 'ProcessedEvent' },
|
|
133
|
+
{ nodeId: 'rm2', name: 'batch', parameters: [{ type: 'RawEvent[]' }], returnType: 'Promise<ProcessedEvent[]>' },
|
|
134
|
+
{ nodeId: 'rm3', name: 'onError', parameters: [{ type: 'Error' }] },
|
|
135
|
+
{ nodeId: 'rm4', name: 'dispose' },
|
|
136
|
+
],
|
|
137
|
+
properties: [
|
|
138
|
+
{ name: 'queue', type: 'RawEvent[]' },
|
|
139
|
+
{ name: 'options', type: 'Required<ProcessingOptions>' },
|
|
140
|
+
{ name: 'retryLimit', type: 'number' },
|
|
141
|
+
],
|
|
142
|
+
extends: ['BaseProcessor'],
|
|
143
|
+
implements: ['Disposable', 'EventEmitterLike'],
|
|
144
|
+
instantiations: [
|
|
145
|
+
{ nodeId: 'x1', name: 'main' },
|
|
146
|
+
{ nodeId: 'x2', name: 'worker-pool' },
|
|
147
|
+
],
|
|
148
|
+
references: [{ nodeId: 'x3', name: 'pipeline', context: 'type' }],
|
|
149
|
+
} satisfies GraphifyComponentDetail,
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
id: 'detail-type',
|
|
153
|
+
name: 'SessionRecord',
|
|
154
|
+
construct: 'interface',
|
|
155
|
+
file: 'src/session/transcript.ts',
|
|
156
|
+
purl: 'pkg:github/principal-ai/agent-monitoring',
|
|
157
|
+
purpose: 'type-like: revealed by incoming implements edges',
|
|
158
|
+
symbol: 'SessionRecord',
|
|
159
|
+
detail: {
|
|
160
|
+
kind: 'type',
|
|
161
|
+
properties: [
|
|
162
|
+
{ name: 'id', type: 'string' },
|
|
163
|
+
{ name: 'admittedSeq', type: 'number' },
|
|
164
|
+
],
|
|
165
|
+
usedBy: [{ nodeId: 'u1', name: 'normalizeSession', context: 'type' }],
|
|
166
|
+
implementors: ['SessionReaderLike'],
|
|
167
|
+
} satisfies GraphifyComponentDetail,
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
id: 'detail-module',
|
|
171
|
+
name: 'CodexRolloutRecord',
|
|
172
|
+
construct: 'interface',
|
|
173
|
+
file: 'src/session/transcript.ts',
|
|
174
|
+
purl: 'pkg:github/principal-ai/agent-monitoring',
|
|
175
|
+
purpose: 'a type symbol that lives in the transcript module; the node is the symbol, the file is its location',
|
|
176
|
+
symbol: 'CodexRolloutRecord',
|
|
177
|
+
detail: {
|
|
178
|
+
kind: 'type',
|
|
179
|
+
properties: [
|
|
180
|
+
{ name: 'type', type: 'string' },
|
|
181
|
+
{ name: 'id', type: 'string' },
|
|
182
|
+
],
|
|
183
|
+
usedBy: [{ nodeId: 'u1', name: 'isCodexRolloutRecord', context: 'type' }],
|
|
184
|
+
implementors: [],
|
|
185
|
+
} satisfies GraphifyComponentDetail,
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
id: 'detail-external',
|
|
189
|
+
// name = the package's name after the namespace; namespace shown above.
|
|
190
|
+
name: 'trail-viewer',
|
|
191
|
+
construct: 'external',
|
|
192
|
+
file: '',
|
|
193
|
+
purl: 'pkg:npm/@principal-ai/trail-viewer',
|
|
194
|
+
purpose: 'an npm package consumer — the whole package as a node',
|
|
195
|
+
symbol: '',
|
|
196
|
+
detail: {
|
|
197
|
+
kind: 'external',
|
|
198
|
+
label: 'pkg:npm/@principal-ai/trail-viewer',
|
|
199
|
+
} satisfies GraphifyComponentDetail,
|
|
200
|
+
},
|
|
201
|
+
];
|
|
202
|
+
|
|
203
|
+
const detailKindEdges: SubsystemComponentEdge[] = [];
|
|
204
|
+
|
|
205
|
+
function DetailKindsDemo() {
|
|
206
|
+
const [selected, setSelected] = useState<string | null>(null);
|
|
207
|
+
return (
|
|
208
|
+
<div style={{ width: '100%', height: '100vh', display: 'flex', flexDirection: 'column' }}>
|
|
209
|
+
<SubsystemComponentGraph
|
|
210
|
+
components={detailKindComponents}
|
|
211
|
+
edges={detailKindEdges}
|
|
212
|
+
onSelect={(id) => setSelected(id)}
|
|
213
|
+
/>
|
|
214
|
+
<div style={{ marginTop: 8, fontFamily: 'monospace', fontSize: 12, color: '#aaa' }}>
|
|
215
|
+
{selected ? `selected: ${selected}` : 'click a component to see its GraphifyComponentDetail'}
|
|
216
|
+
</div>
|
|
217
|
+
</div>
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export const DetailKinds: Story = {
|
|
222
|
+
render: () => <DetailKindsDemo />,
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
// Declaration line open — Pierre snippet/file views + declarationRef.
|
|
227
|
+
// Click the ComponentDeclaration node → toggle file → click path or L251.
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
const storyFileContents: Record<string, string> = {
|
|
230
|
+
'packages/react/src/subsystem/ComponentDeclaration.tsx': componentDeclarationSource,
|
|
231
|
+
'packages/react/src/graphify/resolve.ts': resolveSource,
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
const declarationOpenComponents: SubsystemComponent[] = [
|
|
235
|
+
{
|
|
236
|
+
id: 'detail',
|
|
237
|
+
name: 'ComponentDeclaration',
|
|
238
|
+
construct: 'module',
|
|
239
|
+
file: 'packages/react/src/subsystem/ComponentDeclaration.tsx',
|
|
240
|
+
purl: 'pkg:github/principal-ai/principal-view-core-library',
|
|
241
|
+
purpose: 'declaration panel — click file or L251 to open the drawer at the export line',
|
|
242
|
+
symbol: 'ComponentDeclaration',
|
|
243
|
+
declarationRef: {
|
|
244
|
+
file: 'packages/react/src/subsystem/ComponentDeclaration.tsx',
|
|
245
|
+
startLine: 251,
|
|
246
|
+
lineHash: 'storybook-placeholder',
|
|
247
|
+
capturedAt: new Date(0).toISOString(),
|
|
248
|
+
},
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
id: 'resolver',
|
|
252
|
+
name: 'resolve.ts',
|
|
253
|
+
construct: 'module',
|
|
254
|
+
file: 'packages/react/src/graphify/resolve.ts',
|
|
255
|
+
purl: 'pkg:github/principal-ai/principal-view-core-library',
|
|
256
|
+
purpose: 'graphify type-ref resolver (second file for tree navigation)',
|
|
257
|
+
symbol: 'resolveGraphifyTypeRef',
|
|
258
|
+
declarationRef: {
|
|
259
|
+
file: 'packages/react/src/graphify/resolve.ts',
|
|
260
|
+
startLine: 1,
|
|
261
|
+
lineHash: 'storybook-placeholder',
|
|
262
|
+
capturedAt: new Date(0).toISOString(),
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
];
|
|
266
|
+
|
|
267
|
+
function readStoryFile(path: string): Promise<string> {
|
|
268
|
+
const content = storyFileContents[path];
|
|
269
|
+
if (content == null) {
|
|
270
|
+
return Promise.reject(new Error(`No story fixture for ${path}`));
|
|
271
|
+
}
|
|
272
|
+
return Promise.resolve(content);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function DeclarationLineOpenDemo() {
|
|
276
|
+
const renderFileViewer = (file: string, opts?: SubsystemOpenFileOptions) => {
|
|
277
|
+
const startLine = opts?.startLine;
|
|
278
|
+
if (startLine != null) {
|
|
279
|
+
return (
|
|
280
|
+
<PierreSnippetView
|
|
281
|
+
filePath={file}
|
|
282
|
+
fileName={file.split('/').pop() ?? file}
|
|
283
|
+
startLine={startLine}
|
|
284
|
+
endLine={startLine}
|
|
285
|
+
focusLine={startLine}
|
|
286
|
+
contextLines={40}
|
|
287
|
+
readFile={readStoryFile}
|
|
288
|
+
/>
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
return (
|
|
292
|
+
<PierreFileView
|
|
293
|
+
filePath={file}
|
|
294
|
+
fileName={file.split('/').pop() ?? file}
|
|
295
|
+
readFile={readStoryFile}
|
|
296
|
+
/>
|
|
297
|
+
);
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
return (
|
|
301
|
+
<div style={{ width: '100%', height: '100vh', display: 'flex', flexDirection: 'column' }}>
|
|
302
|
+
<SubsystemComponentGraph
|
|
303
|
+
title="Declaration line open (Storybook)"
|
|
304
|
+
description="Uses bundled ?raw fixtures + PierreSnippetView from this package. Select ComponentDeclaration, toggle file, click the path or L251."
|
|
305
|
+
components={declarationOpenComponents}
|
|
306
|
+
edges={[]}
|
|
307
|
+
renderFileViewer={renderFileViewer}
|
|
308
|
+
/>
|
|
309
|
+
</div>
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export const DeclarationLineOpen: Story = {
|
|
314
|
+
render: () => <DeclarationLineOpenDemo />,
|
|
315
|
+
};
|