@principal-ai/principal-view-react 0.7.14 → 0.7.16
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/README.md +9 -24
- package/dist/components/ConfigurationSelector.d.ts +1 -1
- package/dist/components/ConfigurationSelector.d.ts.map +1 -1
- package/dist/components/ConfigurationSelector.js +6 -10
- package/dist/components/ConfigurationSelector.js.map +1 -1
- package/dist/components/EdgeInfoPanel.d.ts +1 -1
- package/dist/components/EdgeInfoPanel.d.ts.map +1 -1
- package/dist/components/EdgeInfoPanel.js +14 -18
- package/dist/components/EdgeInfoPanel.js.map +1 -1
- package/dist/components/GraphRenderer.d.ts +1 -1
- package/dist/components/GraphRenderer.d.ts.map +1 -1
- package/dist/components/GraphRenderer.js +89 -92
- package/dist/components/GraphRenderer.js.map +1 -1
- package/dist/components/NarrativeRenderer.d.ts +19 -0
- package/dist/components/NarrativeRenderer.d.ts.map +1 -0
- package/dist/components/NarrativeRenderer.js +103 -0
- package/dist/components/NarrativeRenderer.js.map +1 -0
- package/dist/components/NodeInfoPanel.d.ts +1 -1
- package/dist/components/NodeInfoPanel.d.ts.map +1 -1
- package/dist/components/NodeInfoPanel.js +33 -37
- package/dist/components/NodeInfoPanel.js.map +1 -1
- package/dist/components/NodeTooltip.js +15 -19
- package/dist/components/NodeTooltip.js.map +1 -1
- package/dist/components/SelectionSidebar.d.ts +1 -1
- package/dist/components/SelectionSidebar.d.ts.map +1 -1
- package/dist/components/SelectionSidebar.js +26 -30
- package/dist/components/SelectionSidebar.js.map +1 -1
- package/dist/components/TestEventPanel.d.ts +6 -0
- package/dist/components/TestEventPanel.d.ts.map +1 -1
- package/dist/components/TestEventPanel.js +157 -160
- package/dist/components/TestEventPanel.js.map +1 -1
- package/dist/edges/CustomEdge.d.ts +1 -1
- package/dist/edges/CustomEdge.d.ts.map +1 -1
- package/dist/edges/CustomEdge.js +18 -22
- package/dist/edges/CustomEdge.js.map +1 -1
- package/dist/edges/GenericEdge.d.ts +1 -1
- package/dist/edges/GenericEdge.d.ts.map +1 -1
- package/dist/edges/GenericEdge.js +3 -7
- package/dist/edges/GenericEdge.js.map +1 -1
- package/dist/hooks/usePathBasedEvents.d.ts +1 -1
- package/dist/hooks/usePathBasedEvents.d.ts.map +1 -1
- package/dist/hooks/usePathBasedEvents.js +14 -18
- package/dist/hooks/usePathBasedEvents.js.map +1 -1
- package/dist/index.d.ts +1 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -33
- package/dist/index.js.map +1 -1
- package/dist/nodes/CustomNode.d.ts +1 -1
- package/dist/nodes/CustomNode.d.ts.map +1 -1
- package/dist/nodes/CustomNode.js +22 -26
- package/dist/nodes/CustomNode.js.map +1 -1
- package/dist/nodes/GenericNode.d.ts +1 -1
- package/dist/nodes/GenericNode.d.ts.map +1 -1
- package/dist/nodes/GenericNode.js +4 -8
- package/dist/nodes/GenericNode.js.map +1 -1
- package/dist/utils/animationMapping.d.ts +1 -1
- package/dist/utils/animationMapping.d.ts.map +1 -1
- package/dist/utils/animationMapping.js +6 -13
- package/dist/utils/animationMapping.js.map +1 -1
- package/dist/utils/graphConverter.d.ts +1 -1
- package/dist/utils/graphConverter.d.ts.map +1 -1
- package/dist/utils/graphConverter.js +4 -8
- package/dist/utils/graphConverter.js.map +1 -1
- package/dist/utils/iconResolver.js +7 -45
- package/dist/utils/iconResolver.js.map +1 -1
- package/dist/utils/narrative-converter.d.ts +45 -0
- package/dist/utils/narrative-converter.d.ts.map +1 -0
- package/dist/utils/narrative-converter.js +113 -0
- package/dist/utils/narrative-converter.js.map +1 -0
- package/dist/utils/narrative-loader.d.ts +53 -0
- package/dist/utils/narrative-loader.d.ts.map +1 -0
- package/dist/utils/narrative-loader.js +163 -0
- package/dist/utils/narrative-loader.js.map +1 -0
- package/package.json +22 -25
- package/src/components/ConfigurationSelector.tsx +1 -1
- package/src/components/EdgeInfoPanel.tsx +1 -1
- package/src/components/GraphRenderer.test.tsx +1 -1
- package/src/components/GraphRenderer.tsx +2 -2
- package/src/components/NarrativeRenderer.tsx +171 -0
- package/src/components/NodeInfoPanel.tsx +1 -1
- package/src/components/NodeTooltip.tsx +3 -3
- package/src/components/PendingChanges.test.tsx +1 -1
- package/src/components/SelectionSidebar.tsx +1 -1
- package/src/components/TestEventPanel.tsx +145 -121
- package/src/edges/CustomEdge.tsx +1 -1
- package/src/edges/GenericEdge.tsx +1 -1
- package/src/hooks/usePathBasedEvents.ts +1 -1
- package/src/index.ts +1 -7
- package/src/nodes/CustomNode.tsx +1 -1
- package/src/nodes/GenericNode.tsx +1 -1
- package/src/stories/AnimationWorkshop.stories.tsx +1 -1
- package/src/stories/CanvasEdgeTypes.stories.tsx +1 -1
- package/src/stories/CanvasNodeTypes.stories.tsx +1 -1
- package/src/stories/ColorPriority.stories.tsx +1 -1
- package/src/stories/EventDrivenAnimations.stories.tsx +1 -1
- package/src/stories/GraphRenderer.stories.tsx +1 -1
- package/src/stories/Introduction.mdx +4 -21
- package/src/stories/MultiConfig.stories.tsx +1 -1
- package/src/stories/MultiDirectionalConnections.stories.tsx +1 -1
- package/src/stories/NodeFieldsAudit.stories.tsx +1 -1
- package/src/stories/NodeShapes.stories.tsx +1 -1
- package/src/stories/OtelComponents.stories.tsx +1 -1
- package/src/stories/RealTestExecution.stories.tsx +111 -1
- package/src/stories/TraceViewer.stories.tsx +1 -1
- package/src/stories/ValidatedExecution.stories.tsx +1 -1
- package/src/stories/data/graph-converter-test-execution.json +204 -326
- package/src/stories/data/graph-converter-test.narrative.json +106 -0
- package/src/stories/data/graph-converter-validated-execution.json +6 -6
- package/src/utils/animationMapping.ts +1 -1
- package/src/utils/graphConverter.ts +1 -1
- package/src/utils/narrative-converter.ts +147 -0
- package/src/utils/narrative-loader.ts +172 -0
- package/dist/components/EventLog.d.ts +0 -20
- package/dist/components/EventLog.d.ts.map +0 -1
- package/dist/components/EventLog.js +0 -13
- package/dist/components/EventLog.js.map +0 -1
- package/dist/components/EventLog.test.d.ts +0 -2
- package/dist/components/EventLog.test.d.ts.map +0 -1
- package/dist/components/EventLog.test.js +0 -73
- package/dist/components/EventLog.test.js.map +0 -1
- package/dist/components/GraphRenderer.test.d.ts +0 -2
- package/dist/components/GraphRenderer.test.d.ts.map +0 -1
- package/dist/components/GraphRenderer.test.js +0 -88
- package/dist/components/GraphRenderer.test.js.map +0 -1
- package/dist/components/LayerPanel.d.ts +0 -31
- package/dist/components/LayerPanel.d.ts.map +0 -1
- package/dist/components/LayerPanel.js +0 -207
- package/dist/components/LayerPanel.js.map +0 -1
- package/dist/components/MetricsDashboard.d.ts +0 -14
- package/dist/components/MetricsDashboard.d.ts.map +0 -1
- package/dist/components/MetricsDashboard.js +0 -13
- package/dist/components/MetricsDashboard.js.map +0 -1
- package/src/components/EventLog.test.tsx +0 -85
- package/src/components/EventLog.tsx +0 -51
- package/src/components/MetricsDashboard.tsx +0 -40
- package/src/stories/EventLog.stories.tsx +0 -161
- package/src/stories/IndustryThemes.stories.tsx +0 -483
- package/src/stories/MetricsDashboard.stories.tsx +0 -227
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GenericNode.js","sourceRoot":"","sources":["../../src/nodes/GenericNode.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GenericNode.js","sourceRoot":"","sources":["../../src/nodes/GenericNode.tsx"],"names":[],"mappings":";AAoBA;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAA+B,CAAC,EACtD,EAAE,EACF,cAAc,EACd,KAAK,EACL,aAAa,GACd,EAAE,EAAE;IACH,sCAAsC;IACtC,MAAM,KAAK,GACT,KAAK,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK;QAC5C,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK;QACpC,CAAC,CAAC,cAAc,CAAC,KAAK,IAAI,MAAM,CAAC;IAErC,OAAO,CACL,eACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,MAAM,EAAE,aAAa,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;YACpD,YAAY,EAAE,cAAc,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;YAC/D,eAAe,EAAE,OAAO;YACxB,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,QAAQ;SACpB,aAED,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAG,EAAE,GAAO,EAC/D,KAAK,IAAI,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAG,KAAK,GAAO,EACxE,eAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,aAC9B,qCAAsB,6BAClB,IACF,CACP,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Maps log levels and component events to appropriate animations
|
|
5
5
|
* for Milestone 1 default visualization behavior
|
|
6
6
|
*/
|
|
7
|
-
import type { LogLevel } from '@principal-ai/principal-view-core';
|
|
7
|
+
import type { LogLevel } from '@principal-ai/principal-view-core/browser';
|
|
8
8
|
/**
|
|
9
9
|
* Node animation configuration
|
|
10
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animationMapping.d.ts","sourceRoot":"","sources":["../../src/utils/animationMapping.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"animationMapping.d.ts","sourceRoot":"","sources":["../../src/utils/animationMapping.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2CAA2C,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,eAAe,CAAC;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,QAAQ,GAAG,aAAa,CAkCtE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAiDpF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,aAAa,GAAG,aAAa,CAShG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAE,QAAiB,GAAG,OAAO,CAMnF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,MAAa,GACzB,MAAM,CAIR"}
|
|
@@ -1,16 +1,9 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Animation mapping utilities
|
|
4
3
|
*
|
|
5
4
|
* Maps log levels and component events to appropriate animations
|
|
6
5
|
* for Milestone 1 default visualization behavior
|
|
7
6
|
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.logLevelToNodeAnimation = logLevelToNodeAnimation;
|
|
10
|
-
exports.actionToNodeAnimation = actionToNodeAnimation;
|
|
11
|
-
exports.actionToEdgeAnimation = actionToEdgeAnimation;
|
|
12
|
-
exports.shouldAnimate = shouldAnimate;
|
|
13
|
-
exports.calculateIntensity = calculateIntensity;
|
|
14
7
|
/**
|
|
15
8
|
* Map log level to node animation
|
|
16
9
|
*
|
|
@@ -20,7 +13,7 @@ exports.calculateIntensity = calculateIntensity;
|
|
|
20
13
|
* - warn: amber pulse (high intensity)
|
|
21
14
|
* - error: red flash + shake
|
|
22
15
|
*/
|
|
23
|
-
function logLevelToNodeAnimation(level) {
|
|
16
|
+
export function logLevelToNodeAnimation(level) {
|
|
24
17
|
switch (level) {
|
|
25
18
|
case 'debug':
|
|
26
19
|
return {
|
|
@@ -45,7 +38,7 @@ function logLevelToNodeAnimation(level) {
|
|
|
45
38
|
};
|
|
46
39
|
case 'error':
|
|
47
40
|
return {
|
|
48
|
-
type: 'flash',
|
|
41
|
+
type: 'flash',
|
|
49
42
|
duration: 1500,
|
|
50
43
|
intensity: 1.0,
|
|
51
44
|
color: '#ef4444', // red-500
|
|
@@ -55,7 +48,7 @@ function logLevelToNodeAnimation(level) {
|
|
|
55
48
|
/**
|
|
56
49
|
* Map component action to node animation (Milestone 2)
|
|
57
50
|
*/
|
|
58
|
-
function actionToNodeAnimation(_action, state) {
|
|
51
|
+
export function actionToNodeAnimation(_action, state) {
|
|
59
52
|
// Default mapping - can be overridden by configuration
|
|
60
53
|
switch (state) {
|
|
61
54
|
case 'acquired':
|
|
@@ -104,7 +97,7 @@ function actionToNodeAnimation(_action, state) {
|
|
|
104
97
|
/**
|
|
105
98
|
* Get animation config for edge based on action (Milestone 2)
|
|
106
99
|
*/
|
|
107
|
-
function actionToEdgeAnimation(_action, edgeConfig) {
|
|
100
|
+
export function actionToEdgeAnimation(_action, edgeConfig) {
|
|
108
101
|
// Use edge config if provided, otherwise default
|
|
109
102
|
return (edgeConfig || {
|
|
110
103
|
type: 'flow',
|
|
@@ -115,7 +108,7 @@ function actionToEdgeAnimation(_action, edgeConfig) {
|
|
|
115
108
|
/**
|
|
116
109
|
* Check if log level should trigger animation
|
|
117
110
|
*/
|
|
118
|
-
function shouldAnimate(level, minLevel = 'info') {
|
|
111
|
+
export function shouldAnimate(level, minLevel = 'info') {
|
|
119
112
|
const levels = ['debug', 'info', 'warn', 'error'];
|
|
120
113
|
const minIndex = levels.indexOf(minLevel);
|
|
121
114
|
const currentIndex = levels.indexOf(level);
|
|
@@ -125,7 +118,7 @@ function shouldAnimate(level, minLevel = 'info') {
|
|
|
125
118
|
* Calculate animation intensity based on frequency
|
|
126
119
|
* Used to adjust animation intensity when multiple logs occur rapidly
|
|
127
120
|
*/
|
|
128
|
-
function calculateIntensity(baseIntensity, eventCount, _timeWindow = 1000) {
|
|
121
|
+
export function calculateIntensity(baseIntensity, eventCount, _timeWindow = 1000) {
|
|
129
122
|
// Reduce intensity if too many events in time window
|
|
130
123
|
const scaleFactor = Math.min(1.0, 5.0 / eventCount);
|
|
131
124
|
return Math.max(0.2, baseIntensity * scaleFactor);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animationMapping.js","sourceRoot":"","sources":["../../src/utils/animationMapping.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"animationMapping.js","sourceRoot":"","sources":["../../src/utils/animationMapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Node, type Edge } from '@xyflow/react';
|
|
2
|
-
import type { NodeState, EdgeState, GraphConfiguration, Violation } from '@principal-ai/principal-view-core';
|
|
2
|
+
import type { NodeState, EdgeState, GraphConfiguration, Violation } from '@principal-ai/principal-view-core/browser';
|
|
3
3
|
import type { CustomNodeData } from '../nodes/CustomNode';
|
|
4
4
|
import type { CustomEdgeData } from '../edges/CustomEdge';
|
|
5
5
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphConverter.d.ts","sourceRoot":"","sources":["../../src/utils/graphConverter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,SAAS,EACV,MAAM,
|
|
1
|
+
{"version":3,"file":"graphConverter.d.ts","sourceRoot":"","sources":["../../src/utils/graphConverter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,SAAS,EACV,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAAE,EAClB,aAAa,EAAE,kBAAkB,EACjC,UAAU,GAAE,SAAS,EAAO,GAC3B,IAAI,CAAC,cAAc,CAAC,EAAE,CAgCxB;AAED,yEAAyE;AACzE,MAAM,WAAW,oBAAqB,SAAQ,SAAS;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmBD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,CAAC,SAAS,GAAG,oBAAoB,CAAC,EAAE,EAC3C,aAAa,EAAE,kBAAkB,EACjC,UAAU,GAAE,SAAS,EAAO,GAC3B,IAAI,CAAC,cAAc,CAAC,EAAE,CAgDxB"}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.convertToXYFlowNodes = convertToXYFlowNodes;
|
|
4
|
-
exports.convertToXYFlowEdges = convertToXYFlowEdges;
|
|
5
|
-
const react_1 = require("@xyflow/react");
|
|
1
|
+
import { MarkerType } from '@xyflow/react';
|
|
6
2
|
/**
|
|
7
3
|
* Convert our NodeState to xyflow Node format
|
|
8
4
|
*/
|
|
9
|
-
function convertToXYFlowNodes(nodes, configuration, violations = []) {
|
|
5
|
+
export function convertToXYFlowNodes(nodes, configuration, violations = []) {
|
|
10
6
|
return nodes.map((node) => {
|
|
11
7
|
const typeDefinition = configuration.nodeTypes[node.type];
|
|
12
8
|
// Warn if node type is not defined in configuration
|
|
@@ -54,7 +50,7 @@ function sideToTargetHandle(side) {
|
|
|
54
50
|
/**
|
|
55
51
|
* Convert our EdgeState to xyflow Edge format
|
|
56
52
|
*/
|
|
57
|
-
function convertToXYFlowEdges(edges, configuration, violations = []) {
|
|
53
|
+
export function convertToXYFlowEdges(edges, configuration, violations = []) {
|
|
58
54
|
return edges.map((edge) => {
|
|
59
55
|
const typeDefinition = configuration.edgeTypes[edge.type];
|
|
60
56
|
// Warn if edge type is not defined in configuration
|
|
@@ -73,7 +69,7 @@ function convertToXYFlowEdges(edges, configuration, violations = []) {
|
|
|
73
69
|
const edgeColor = edge.data?.color;
|
|
74
70
|
const markerEnd = typeDefinition?.directed !== false
|
|
75
71
|
? {
|
|
76
|
-
type:
|
|
72
|
+
type: MarkerType.ArrowClosed,
|
|
77
73
|
color: edgeColor || typeDefinition?.color || '#888',
|
|
78
74
|
width: 20,
|
|
79
75
|
height: 20,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphConverter.js","sourceRoot":"","sources":["../../src/utils/graphConverter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graphConverter.js","sourceRoot":"","sources":["../../src/utils/graphConverter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,42 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.Icon = void 0;
|
|
37
|
-
exports.resolveIcon = resolveIcon;
|
|
38
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
39
|
-
const LucideIcons = __importStar(require("lucide-react"));
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import * as LucideIcons from 'lucide-react';
|
|
40
3
|
/**
|
|
41
4
|
* Resolves an icon string to a React element
|
|
42
5
|
*
|
|
@@ -45,7 +8,7 @@ const LucideIcons = __importStar(require("lucide-react"));
|
|
|
45
8
|
* @param className - Optional CSS class
|
|
46
9
|
* @returns React element or null
|
|
47
10
|
*/
|
|
48
|
-
function resolveIcon(icon, size = 20, className) {
|
|
11
|
+
export function resolveIcon(icon, size = 20, className) {
|
|
49
12
|
if (!icon)
|
|
50
13
|
return null;
|
|
51
14
|
// Try to resolve as Lucide icon first
|
|
@@ -53,16 +16,15 @@ function resolveIcon(icon, size = 20, className) {
|
|
|
53
16
|
const LucideIcon = LucideIcons[icon];
|
|
54
17
|
// Check if it's a valid React component (function or object with $$typeof)
|
|
55
18
|
if (LucideIcon && (typeof LucideIcon === 'function' || typeof LucideIcon === 'object')) {
|
|
56
|
-
return (
|
|
19
|
+
return _jsx(LucideIcon, { size: size, className: className });
|
|
57
20
|
}
|
|
58
21
|
// Fall back to rendering as text (emoji or unicode)
|
|
59
|
-
return ((
|
|
22
|
+
return (_jsx("span", { className: className, style: { fontSize: `${size}px` }, children: icon }));
|
|
60
23
|
}
|
|
61
24
|
/**
|
|
62
25
|
* Icon component that resolves icon strings
|
|
63
26
|
*/
|
|
64
|
-
const Icon = ({ icon, size = 20, className }) => {
|
|
65
|
-
return (
|
|
27
|
+
export const Icon = ({ icon, size = 20, className }) => {
|
|
28
|
+
return _jsx(_Fragment, { children: resolveIcon(icon, size, className) });
|
|
66
29
|
};
|
|
67
|
-
exports.Icon = Icon;
|
|
68
30
|
//# sourceMappingURL=iconResolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iconResolver.js","sourceRoot":"","sources":["../../src/utils/iconResolver.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"iconResolver.js","sourceRoot":"","sources":["../../src/utils/iconResolver.tsx"],"names":[],"mappings":";AACA,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAkB5C;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,IAAa,EAAE,OAAe,EAAE,EAAE,SAAkB;IAC9E,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,sCAAsC;IACtC,8DAA8D;IAC9D,MAAM,UAAU,GAAI,WAAmB,CAAC,IAAI,CAAC,CAAC;IAE9C,2EAA2E;IAC3E,IAAI,UAAU,IAAI,CAAC,OAAO,UAAU,KAAK,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,CAAC,EAAE;QACtF,OAAO,KAAC,UAAU,IAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,GAAI,CAAC;KACzD;IAED,oDAAoD;IACpD,OAAO,CACL,eAAM,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,IAAI,EAAE,YACzD,IAAI,GACA,CACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;IAC1E,OAAO,4BAAG,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,GAAI,CAAC;AACnD,CAAC,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for converting TestEventPanel data to OtelEvent format
|
|
3
|
+
* for use with the narrative renderer
|
|
4
|
+
*/
|
|
5
|
+
import type { OtelEvent } from '@principal-ai/principal-view-core';
|
|
6
|
+
import type { OtelLog } from '../components/TestEventPanel';
|
|
7
|
+
interface SpanEvent {
|
|
8
|
+
time: number;
|
|
9
|
+
name: string;
|
|
10
|
+
attributes: Record<string, string | number | boolean>;
|
|
11
|
+
}
|
|
12
|
+
interface TestSpan {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
startTime: number;
|
|
16
|
+
endTime?: number;
|
|
17
|
+
duration?: number;
|
|
18
|
+
attributes: Record<string, string | number | boolean>;
|
|
19
|
+
events: SpanEvent[];
|
|
20
|
+
status: 'OK' | 'ERROR';
|
|
21
|
+
errorMessage?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Convert TestSpan and OtelLogs to OtelEvent array
|
|
25
|
+
*
|
|
26
|
+
* @param span - The test span to convert
|
|
27
|
+
* @param logs - Optional OTEL logs to include
|
|
28
|
+
* @returns Array of OtelEvents in chronological order
|
|
29
|
+
*/
|
|
30
|
+
export declare function convertToOtelEvents(span: TestSpan, logs?: OtelLog[]): OtelEvent[];
|
|
31
|
+
/**
|
|
32
|
+
* Convert all TestSpans to OtelEvents
|
|
33
|
+
*
|
|
34
|
+
* @param spans - Array of test spans
|
|
35
|
+
* @param logs - Optional OTEL logs to include
|
|
36
|
+
* @returns Array of OtelEvents for all spans
|
|
37
|
+
*/
|
|
38
|
+
export declare function convertAllSpansToOtelEvents(spans: TestSpan[], logs?: OtelLog[]): OtelEvent[];
|
|
39
|
+
/**
|
|
40
|
+
* Extract test result attributes from TestSpan
|
|
41
|
+
* Useful for narrative templates that check assertions
|
|
42
|
+
*/
|
|
43
|
+
export declare function extractTestAttributes(span: TestSpan): Record<string, unknown>;
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=narrative-converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"narrative-converter.d.ts","sourceRoot":"","sources":["../../src/utils/narrative-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,8BAA8B,CAAC;AAG1E,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CACvD;AAED,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACtD,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmDD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAE,OAAO,EAAO,GAAG,SAAS,EAAE,CAerF;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,IAAI,GAAE,OAAO,EAAO,GAAG,SAAS,EAAE,CAchG;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmB7E"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for converting TestEventPanel data to OtelEvent format
|
|
3
|
+
* for use with the narrative renderer
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert OtelSeverity to severity number (OpenTelemetry spec)
|
|
7
|
+
*/
|
|
8
|
+
function severityToNumber(severity) {
|
|
9
|
+
const severityMap = {
|
|
10
|
+
TRACE: 1,
|
|
11
|
+
DEBUG: 5,
|
|
12
|
+
INFO: 9,
|
|
13
|
+
WARN: 13,
|
|
14
|
+
ERROR: 17,
|
|
15
|
+
FATAL: 21,
|
|
16
|
+
};
|
|
17
|
+
return severityMap[severity] || 9;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Convert TestSpan events to OtelEvent spans
|
|
21
|
+
*/
|
|
22
|
+
function convertSpanEvents(span) {
|
|
23
|
+
return span.events.map((event) => ({
|
|
24
|
+
name: event.name,
|
|
25
|
+
timestamp: event.time,
|
|
26
|
+
type: 'span',
|
|
27
|
+
spanId: span.id,
|
|
28
|
+
traceId: span.id,
|
|
29
|
+
attributes: event.attributes,
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Convert OtelLogs to OtelEvent logs
|
|
34
|
+
*/
|
|
35
|
+
function convertLogs(logs) {
|
|
36
|
+
return logs.map((log) => ({
|
|
37
|
+
name: 'log',
|
|
38
|
+
timestamp: typeof log.timestamp === 'number' ? log.timestamp : new Date(log.timestamp).getTime(),
|
|
39
|
+
type: 'log',
|
|
40
|
+
spanId: log.spanId,
|
|
41
|
+
traceId: log.traceId,
|
|
42
|
+
severityText: log.severity,
|
|
43
|
+
severityNumber: severityToNumber(log.severity),
|
|
44
|
+
body: typeof log.body === 'string' ? log.body : JSON.stringify(log.body),
|
|
45
|
+
attributes: {
|
|
46
|
+
...log.attributes,
|
|
47
|
+
...log.resource,
|
|
48
|
+
},
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Convert TestSpan and OtelLogs to OtelEvent array
|
|
53
|
+
*
|
|
54
|
+
* @param span - The test span to convert
|
|
55
|
+
* @param logs - Optional OTEL logs to include
|
|
56
|
+
* @returns Array of OtelEvents in chronological order
|
|
57
|
+
*/
|
|
58
|
+
export function convertToOtelEvents(span, logs = []) {
|
|
59
|
+
const spanEvents = convertSpanEvents(span);
|
|
60
|
+
// Filter logs for this specific span
|
|
61
|
+
const spanLogs = logs.filter((log) => log.spanId === span.id || log.traceId === span.id);
|
|
62
|
+
const logEvents = convertLogs(spanLogs);
|
|
63
|
+
// Combine and sort by timestamp
|
|
64
|
+
const allEvents = [...spanEvents, ...logEvents].sort((a, b) => {
|
|
65
|
+
const aTime = typeof a.timestamp === 'number' ? a.timestamp : new Date(a.timestamp).getTime();
|
|
66
|
+
const bTime = typeof b.timestamp === 'number' ? b.timestamp : new Date(b.timestamp).getTime();
|
|
67
|
+
return aTime - bTime;
|
|
68
|
+
});
|
|
69
|
+
return allEvents;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Convert all TestSpans to OtelEvents
|
|
73
|
+
*
|
|
74
|
+
* @param spans - Array of test spans
|
|
75
|
+
* @param logs - Optional OTEL logs to include
|
|
76
|
+
* @returns Array of OtelEvents for all spans
|
|
77
|
+
*/
|
|
78
|
+
export function convertAllSpansToOtelEvents(spans, logs = []) {
|
|
79
|
+
const allEvents = [];
|
|
80
|
+
for (const span of spans) {
|
|
81
|
+
const spanEvents = convertToOtelEvents(span, logs);
|
|
82
|
+
allEvents.push(...spanEvents);
|
|
83
|
+
}
|
|
84
|
+
// Sort all events chronologically
|
|
85
|
+
return allEvents.sort((a, b) => {
|
|
86
|
+
const aTime = typeof a.timestamp === 'number' ? a.timestamp : new Date(a.timestamp).getTime();
|
|
87
|
+
const bTime = typeof b.timestamp === 'number' ? b.timestamp : new Date(b.timestamp).getTime();
|
|
88
|
+
return aTime - bTime;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Extract test result attributes from TestSpan
|
|
93
|
+
* Useful for narrative templates that check assertions
|
|
94
|
+
*/
|
|
95
|
+
export function extractTestAttributes(span) {
|
|
96
|
+
// Find assertion.complete event
|
|
97
|
+
const assertionComplete = span.events.find((e) => e.name === 'assertion.complete');
|
|
98
|
+
if (assertionComplete) {
|
|
99
|
+
return {
|
|
100
|
+
'assertions.passed': assertionComplete.attributes['assertions.passed'] || 0,
|
|
101
|
+
'assertions.failed': assertionComplete.attributes['assertions.failed'] || 0,
|
|
102
|
+
'test.status': span.status,
|
|
103
|
+
'test.name': span.name,
|
|
104
|
+
...span.attributes,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
'test.status': span.status,
|
|
109
|
+
'test.name': span.name,
|
|
110
|
+
...span.attributes,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=narrative-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"narrative-converter.js","sourceRoot":"","sources":["../../src/utils/narrative-converter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for loading and managing narrative templates
|
|
3
|
+
*/
|
|
4
|
+
import type { NarrativeTemplate } from '@principal-ai/principal-view-core';
|
|
5
|
+
/**
|
|
6
|
+
* Load a narrative template from a URL or file path
|
|
7
|
+
*
|
|
8
|
+
* Note: In most cases, you should import templates directly:
|
|
9
|
+
* import template from './my-template.narrative.json';
|
|
10
|
+
*
|
|
11
|
+
* This function is useful when you need to dynamically load templates.
|
|
12
|
+
*
|
|
13
|
+
* @param path - Path to the narrative template JSON file
|
|
14
|
+
* @returns Promise resolving to the narrative template, or null if not found
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadNarrativeTemplate(path: string): Promise<NarrativeTemplate | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Auto-discover narrative template for a given canvas path
|
|
19
|
+
*
|
|
20
|
+
* Example:
|
|
21
|
+
* Canvas: "/path/to/graph-converter.otel.canvas"
|
|
22
|
+
* Narrative: "/path/to/graph-converter.narrative.json"
|
|
23
|
+
*
|
|
24
|
+
* @param canvasPath - Path to the .otel.canvas file
|
|
25
|
+
* @returns Promise resolving to the narrative template, or null if not found
|
|
26
|
+
*/
|
|
27
|
+
export declare function discoverNarrativeTemplate(canvasPath: string): Promise<NarrativeTemplate | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Validate a narrative template has required fields
|
|
30
|
+
*
|
|
31
|
+
* @param template - Template to validate
|
|
32
|
+
* @returns True if valid, false otherwise
|
|
33
|
+
*/
|
|
34
|
+
export declare function validateNarrativeTemplate(template: unknown): template is NarrativeTemplate;
|
|
35
|
+
/**
|
|
36
|
+
* Get a user-friendly error message for invalid templates
|
|
37
|
+
*
|
|
38
|
+
* @param template - Template to check
|
|
39
|
+
* @returns Error message, or null if valid
|
|
40
|
+
*/
|
|
41
|
+
export declare function getNarrativeTemplateError(template: unknown): string | null;
|
|
42
|
+
/**
|
|
43
|
+
* React hook for loading narrative templates
|
|
44
|
+
*
|
|
45
|
+
* @param templatePath - Path to template, or null to skip loading
|
|
46
|
+
* @returns {template, loading, error}
|
|
47
|
+
*/
|
|
48
|
+
export declare function useNarrativeTemplate(templatePath: string | null): {
|
|
49
|
+
template: NarrativeTemplate | null;
|
|
50
|
+
loading: boolean;
|
|
51
|
+
error: string | null;
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=narrative-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"narrative-loader.d.ts","sourceRoot":"","sources":["../../src/utils/narrative-loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAE3E;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAa3F;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAGrG;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,iBAAiB,CAyB1F;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CA+B1E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;;;;EA0C/D"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for loading and managing narrative templates
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Load a narrative template from a URL or file path
|
|
6
|
+
*
|
|
7
|
+
* Note: In most cases, you should import templates directly:
|
|
8
|
+
* import template from './my-template.narrative.json';
|
|
9
|
+
*
|
|
10
|
+
* This function is useful when you need to dynamically load templates.
|
|
11
|
+
*
|
|
12
|
+
* @param path - Path to the narrative template JSON file
|
|
13
|
+
* @returns Promise resolving to the narrative template, or null if not found
|
|
14
|
+
*/
|
|
15
|
+
export async function loadNarrativeTemplate(path) {
|
|
16
|
+
try {
|
|
17
|
+
const response = await fetch(path);
|
|
18
|
+
if (!response.ok) {
|
|
19
|
+
console.warn(`Narrative template not found: ${path}`);
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const template = await response.json();
|
|
23
|
+
return template;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
console.warn(`Failed to load narrative template from ${path}:`, error);
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Auto-discover narrative template for a given canvas path
|
|
32
|
+
*
|
|
33
|
+
* Example:
|
|
34
|
+
* Canvas: "/path/to/graph-converter.otel.canvas"
|
|
35
|
+
* Narrative: "/path/to/graph-converter.narrative.json"
|
|
36
|
+
*
|
|
37
|
+
* @param canvasPath - Path to the .otel.canvas file
|
|
38
|
+
* @returns Promise resolving to the narrative template, or null if not found
|
|
39
|
+
*/
|
|
40
|
+
export async function discoverNarrativeTemplate(canvasPath) {
|
|
41
|
+
const narrativePath = canvasPath.replace('.otel.canvas', '.narrative.json');
|
|
42
|
+
return loadNarrativeTemplate(narrativePath);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Validate a narrative template has required fields
|
|
46
|
+
*
|
|
47
|
+
* @param template - Template to validate
|
|
48
|
+
* @returns True if valid, false otherwise
|
|
49
|
+
*/
|
|
50
|
+
export function validateNarrativeTemplate(template) {
|
|
51
|
+
if (!template || typeof template !== 'object') {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
const t = template;
|
|
55
|
+
// Check required fields
|
|
56
|
+
if (!t.version || !t.canvas || !t.name || !t.mode || !t.scenarioSelection || !t.scenarios) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
// Check scenarios array
|
|
60
|
+
if (!Array.isArray(t.scenarios) || t.scenarios.length === 0) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
// Check each scenario has required fields
|
|
64
|
+
for (const scenario of t.scenarios) {
|
|
65
|
+
if (!scenario.id || !scenario.priority || !scenario.condition || !scenario.template) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get a user-friendly error message for invalid templates
|
|
73
|
+
*
|
|
74
|
+
* @param template - Template to check
|
|
75
|
+
* @returns Error message, or null if valid
|
|
76
|
+
*/
|
|
77
|
+
export function getNarrativeTemplateError(template) {
|
|
78
|
+
if (!template || typeof template !== 'object') {
|
|
79
|
+
return 'Template must be a valid JSON object';
|
|
80
|
+
}
|
|
81
|
+
const t = template;
|
|
82
|
+
if (!t.version)
|
|
83
|
+
return 'Missing required field: version';
|
|
84
|
+
if (!t.canvas)
|
|
85
|
+
return 'Missing required field: canvas';
|
|
86
|
+
if (!t.name)
|
|
87
|
+
return 'Missing required field: name';
|
|
88
|
+
if (!t.mode)
|
|
89
|
+
return 'Missing required field: mode';
|
|
90
|
+
if (!t.scenarioSelection)
|
|
91
|
+
return 'Missing required field: scenarioSelection';
|
|
92
|
+
if (!t.scenarios)
|
|
93
|
+
return 'Missing required field: scenarios';
|
|
94
|
+
if (!Array.isArray(t.scenarios)) {
|
|
95
|
+
return 'Field "scenarios" must be an array';
|
|
96
|
+
}
|
|
97
|
+
if (t.scenarios.length === 0) {
|
|
98
|
+
return 'Template must have at least one scenario';
|
|
99
|
+
}
|
|
100
|
+
for (let i = 0; i < t.scenarios.length; i++) {
|
|
101
|
+
const scenario = t.scenarios[i];
|
|
102
|
+
if (!scenario.id)
|
|
103
|
+
return `Scenario ${i}: missing required field "id"`;
|
|
104
|
+
if (scenario.priority === undefined)
|
|
105
|
+
return `Scenario ${i}: missing required field "priority"`;
|
|
106
|
+
if (!scenario.condition)
|
|
107
|
+
return `Scenario ${i}: missing required field "condition"`;
|
|
108
|
+
if (!scenario.template)
|
|
109
|
+
return `Scenario ${i}: missing required field "template"`;
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* React hook for loading narrative templates
|
|
115
|
+
*
|
|
116
|
+
* @param templatePath - Path to template, or null to skip loading
|
|
117
|
+
* @returns {template, loading, error}
|
|
118
|
+
*/
|
|
119
|
+
export function useNarrativeTemplate(templatePath) {
|
|
120
|
+
const [template, setTemplate] = React.useState(null);
|
|
121
|
+
const [loading, setLoading] = React.useState(false);
|
|
122
|
+
const [error, setError] = React.useState(null);
|
|
123
|
+
React.useEffect(() => {
|
|
124
|
+
if (!templatePath) {
|
|
125
|
+
setTemplate(null);
|
|
126
|
+
setLoading(false);
|
|
127
|
+
setError(null);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
setLoading(true);
|
|
131
|
+
setError(null);
|
|
132
|
+
loadNarrativeTemplate(templatePath)
|
|
133
|
+
.then((loadedTemplate) => {
|
|
134
|
+
if (loadedTemplate) {
|
|
135
|
+
const validationError = getNarrativeTemplateError(loadedTemplate);
|
|
136
|
+
if (validationError) {
|
|
137
|
+
setError(validationError);
|
|
138
|
+
setTemplate(null);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
setTemplate(loadedTemplate);
|
|
142
|
+
setError(null);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
setError('Template not found');
|
|
147
|
+
setTemplate(null);
|
|
148
|
+
}
|
|
149
|
+
})
|
|
150
|
+
.catch((err) => {
|
|
151
|
+
setError(err instanceof Error ? err.message : 'Unknown error');
|
|
152
|
+
setTemplate(null);
|
|
153
|
+
})
|
|
154
|
+
.finally(() => {
|
|
155
|
+
setLoading(false);
|
|
156
|
+
});
|
|
157
|
+
}, [templatePath]);
|
|
158
|
+
return { template, loading, error };
|
|
159
|
+
}
|
|
160
|
+
// Note: React import is expected to be available in the React package
|
|
161
|
+
// If this causes issues, we can remove the hook and export it separately
|
|
162
|
+
import React from 'react';
|
|
163
|
+
//# sourceMappingURL=narrative-loader.js.map
|