@principal-ai/principal-view-core 0.6.3 → 0.7.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 (92) hide show
  1. package/dist/ConfigurationLoader.js +2 -1
  2. package/dist/ConfigurationLoader.js.map +1 -1
  3. package/dist/ConfigurationValidator.js.map +1 -1
  4. package/dist/EventProcessor.js.map +1 -1
  5. package/dist/EventRecorderService.js.map +1 -1
  6. package/dist/LibraryLoader.js.map +1 -1
  7. package/dist/PathBasedEventProcessor.js.map +1 -1
  8. package/dist/SessionManager.js +1 -1
  9. package/dist/SessionManager.js.map +1 -1
  10. package/dist/ValidationEngine.js.map +1 -1
  11. package/dist/cli/codegen.js.map +1 -1
  12. package/dist/codegen/type-generator.js.map +1 -1
  13. package/dist/codegen/usage-example.js.map +1 -1
  14. package/dist/helpers/GraphInstrumentationHelper.js +2 -2
  15. package/dist/helpers/GraphInstrumentationHelper.js.map +1 -1
  16. package/dist/index.d.ts +2 -2
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +2 -2
  19. package/dist/index.js.map +1 -1
  20. package/dist/narrative/example.d.ts +11 -0
  21. package/dist/narrative/example.d.ts.map +1 -0
  22. package/dist/narrative/example.js +331 -0
  23. package/dist/narrative/example.js.map +1 -0
  24. package/dist/narrative/index.d.ts +12 -0
  25. package/dist/narrative/index.d.ts.map +1 -0
  26. package/dist/narrative/index.js +14 -0
  27. package/dist/narrative/index.js.map +1 -0
  28. package/dist/narrative/scenario-matcher.d.ts +87 -0
  29. package/dist/narrative/scenario-matcher.d.ts.map +1 -0
  30. package/dist/narrative/scenario-matcher.js +269 -0
  31. package/dist/narrative/scenario-matcher.js.map +1 -0
  32. package/dist/narrative/template-parser.d.ts +33 -0
  33. package/dist/narrative/template-parser.d.ts.map +1 -0
  34. package/dist/narrative/template-parser.js +288 -0
  35. package/dist/narrative/template-parser.js.map +1 -0
  36. package/dist/narrative/template-renderer.d.ts +18 -0
  37. package/dist/narrative/template-renderer.d.ts.map +1 -0
  38. package/dist/narrative/template-renderer.js +367 -0
  39. package/dist/narrative/template-renderer.js.map +1 -0
  40. package/dist/narrative/types.d.ts +268 -0
  41. package/dist/narrative/types.d.ts.map +1 -0
  42. package/dist/narrative/types.js +10 -0
  43. package/dist/narrative/types.js.map +1 -0
  44. package/dist/rules/config.js.map +1 -1
  45. package/dist/rules/engine.js.map +1 -1
  46. package/dist/rules/implementations/connection-type-references.js.map +1 -1
  47. package/dist/rules/implementations/dead-end-states.js.map +1 -1
  48. package/dist/rules/implementations/library-node-type-match.js.map +1 -1
  49. package/dist/rules/implementations/minimum-node-sources.js.map +1 -1
  50. package/dist/rules/implementations/no-unknown-fields.js.map +1 -1
  51. package/dist/rules/implementations/orphaned-edge-types.js.map +1 -1
  52. package/dist/rules/implementations/orphaned-node-types.js.map +1 -1
  53. package/dist/rules/implementations/required-metadata.js.map +1 -1
  54. package/dist/rules/implementations/state-transition-references.js.map +1 -1
  55. package/dist/rules/implementations/unreachable-states.js.map +1 -1
  56. package/dist/rules/implementations/valid-action-patterns.js.map +1 -1
  57. package/dist/rules/implementations/valid-color-format.js.map +1 -1
  58. package/dist/rules/implementations/valid-edge-types.js.map +1 -1
  59. package/dist/rules/implementations/valid-node-types.js.map +1 -1
  60. package/dist/rules/types.js.map +1 -1
  61. package/dist/telemetry/coverage.js.map +1 -1
  62. package/dist/telemetry/event-validator.js.map +1 -1
  63. package/dist/types/audit.js.map +1 -1
  64. package/dist/types/canvas.js +5 -5
  65. package/dist/types/canvas.js.map +1 -1
  66. package/dist/types/otel.js.map +1 -1
  67. package/dist/types/resource-match.js.map +1 -1
  68. package/dist/utils/CanvasConverter.js.map +1 -1
  69. package/dist/utils/GraphConverter.js.map +1 -1
  70. package/dist/utils/LibraryConverter.js.map +1 -1
  71. package/dist/utils/PathMatcher.js.map +1 -1
  72. package/dist/utils/TraceToCanvas.js +7 -7
  73. package/dist/utils/TraceToCanvas.js.map +1 -1
  74. package/dist/utils/YamlParser.js.map +1 -1
  75. package/package.json +15 -15
  76. package/src/index.ts +31 -13
  77. package/src/narrative/README.md +381 -0
  78. package/src/narrative/__tests__/scenario-matcher.test.ts +368 -0
  79. package/src/narrative/__tests__/template-parser.test.ts +235 -0
  80. package/src/narrative/__tests__/template-renderer.test.ts +377 -0
  81. package/src/narrative/example.ts +349 -0
  82. package/src/narrative/index.ts +35 -0
  83. package/src/narrative/scenario-matcher.ts +331 -0
  84. package/src/narrative/template-parser.ts +298 -0
  85. package/src/narrative/template-renderer.ts +423 -0
  86. package/src/narrative/types.ts +368 -0
  87. package/src/utils/GraphConverter.test.ts +0 -79
  88. package/dist/utils/ExecutionFileDiscovery.d.ts +0 -206
  89. package/dist/utils/ExecutionFileDiscovery.d.ts.map +0 -1
  90. package/dist/utils/ExecutionFileDiscovery.js +0 -340
  91. package/dist/utils/ExecutionFileDiscovery.js.map +0 -1
  92. package/src/utils/ExecutionFileDiscovery.ts +0 -522
@@ -0,0 +1,367 @@
1
+ /**
2
+ * Template Renderer
3
+ *
4
+ * Renders narrative templates into human-readable text using
5
+ * OTEL events, selected scenarios, and template expressions.
6
+ */
7
+ import { parseTemplate } from './template-parser';
8
+ import { selectScenario, computeAggregates } from './scenario-matcher';
9
+ /**
10
+ * Render a narrative from a template and events
11
+ *
12
+ * Main entry point for narrative generation.
13
+ *
14
+ * @param template - Narrative template
15
+ * @param events - Collected OTEL events
16
+ * @returns Rendered narrative
17
+ */
18
+ export function renderNarrative(template, events) {
19
+ // Compute aggregates for scenario matching and templates
20
+ const aggregates = computeAggregates(events);
21
+ // Select scenario
22
+ const matchResult = selectScenario(template, events, aggregates);
23
+ // Build context
24
+ const context = {
25
+ template,
26
+ scenario: matchResult.scenario,
27
+ events,
28
+ aggregates,
29
+ formatting: {
30
+ indentPerLevel: ' ',
31
+ timestampFormat: 'HH:mm:ss.SSS',
32
+ showTimestamps: false,
33
+ showDuration: true,
34
+ showSpanIds: false,
35
+ showAttributes: 'matched',
36
+ ...template.formatting,
37
+ },
38
+ };
39
+ // Build span tree if needed
40
+ if (template.mode === 'span-tree') {
41
+ context.spanTree = buildSpanTree(events, template.showLogsPerSpan);
42
+ }
43
+ // Render narrative
44
+ const text = renderScenario(context);
45
+ // Build metadata
46
+ const spans = events.filter((e) => e.type === 'span');
47
+ const logs = events.filter((e) => e.type === 'log');
48
+ const timestamps = events.map((e) => normalizeTimestamp(e.timestamp)).filter((t) => !isNaN(t));
49
+ return {
50
+ text,
51
+ scenarioId: matchResult.scenario.id,
52
+ metadata: {
53
+ eventCount: events.length,
54
+ spanCount: spans.length,
55
+ logCount: logs.length,
56
+ timeRange: timestamps.length > 0
57
+ ? {
58
+ start: Math.min(...timestamps),
59
+ end: Math.max(...timestamps),
60
+ }
61
+ : undefined,
62
+ },
63
+ };
64
+ }
65
+ /**
66
+ * Render a scenario template
67
+ *
68
+ * @param context - Narrative context
69
+ * @returns Rendered text
70
+ */
71
+ function renderScenario(context) {
72
+ const { scenario, template, events, aggregates, formatting } = context;
73
+ const parts = [];
74
+ // Create template evaluation context (merge aggregates and events)
75
+ const evalContext = {
76
+ ...aggregates,
77
+ events,
78
+ totalEvents: events.length,
79
+ };
80
+ // Introduction
81
+ if (scenario.template.introduction) {
82
+ parts.push(parseTemplate(scenario.template.introduction, evalContext));
83
+ parts.push(''); // Blank line
84
+ }
85
+ // Main content based on mode
86
+ switch (template.mode) {
87
+ case 'span-tree':
88
+ if (context.spanTree) {
89
+ parts.push(renderSpanTree(context.spanTree, scenario, evalContext, formatting));
90
+ }
91
+ break;
92
+ case 'timeline':
93
+ parts.push(renderTimeline(events, scenario, evalContext, formatting));
94
+ break;
95
+ case 'summary-only':
96
+ // Only introduction and summary, no event details
97
+ break;
98
+ }
99
+ // Flow directives
100
+ if (scenario.template.flow) {
101
+ parts.push(renderFlow(scenario.template.flow, evalContext));
102
+ }
103
+ // Summary
104
+ if (scenario.template.summary) {
105
+ if (parts.length > 0) {
106
+ parts.push(''); // Blank line before summary
107
+ }
108
+ parts.push(parseTemplate(scenario.template.summary, evalContext));
109
+ }
110
+ return parts.join('\n');
111
+ }
112
+ /**
113
+ * Render span tree (hierarchical view)
114
+ *
115
+ * @param tree - Span tree nodes
116
+ * @param scenario - Scenario being rendered
117
+ * @param context - Evaluation context
118
+ * @param formatting - Formatting options
119
+ * @returns Rendered tree text
120
+ */
121
+ function renderSpanTree(tree, scenario, context, formatting) {
122
+ const parts = [];
123
+ for (const node of tree) {
124
+ const indent = (formatting.indentPerLevel || ' ').repeat(node.depth);
125
+ const eventContext = { ...context, ...node.span.attributes, span: node.span };
126
+ // Render span
127
+ if (scenario.template.span) {
128
+ const spanText = parseTemplate(scenario.template.span, eventContext);
129
+ parts.push(indent + spanText);
130
+ }
131
+ else if (scenario.template.events?.[node.span.name]) {
132
+ const eventTemplate = scenario.template.events[node.span.name];
133
+ const eventText = parseTemplate(eventTemplate, eventContext);
134
+ parts.push(indent + eventText);
135
+ }
136
+ else {
137
+ // Default span rendering
138
+ parts.push(indent + `→ ${node.span.name}`);
139
+ }
140
+ // Render associated logs
141
+ if (node.logs && node.logs.length > 0) {
142
+ for (const log of node.logs) {
143
+ const logContext = { ...context, log };
144
+ const logText = renderLog(log, scenario, logContext, formatting);
145
+ if (logText) {
146
+ parts.push(indent + (formatting.indentPerLevel || ' ') + logText);
147
+ }
148
+ }
149
+ }
150
+ // Render children
151
+ if (node.children.length > 0 && scenario.template.children !== 'ignore') {
152
+ parts.push(renderSpanTree(node.children, scenario, context, formatting));
153
+ }
154
+ }
155
+ return parts.join('\n');
156
+ }
157
+ /**
158
+ * Render timeline (chronological view)
159
+ *
160
+ * @param events - Events in chronological order
161
+ * @param scenario - Scenario being rendered
162
+ * @param context - Evaluation context
163
+ * @param formatting - Formatting options
164
+ * @returns Rendered timeline text
165
+ */
166
+ function renderTimeline(events, scenario, context, formatting) {
167
+ const parts = [];
168
+ // Sort events by timestamp
169
+ const sorted = [...events].sort((a, b) => {
170
+ const aTime = normalizeTimestamp(a.timestamp);
171
+ const bTime = normalizeTimestamp(b.timestamp);
172
+ return aTime - bTime;
173
+ });
174
+ for (const event of sorted) {
175
+ const eventContext = { ...context, ...event.attributes };
176
+ let eventText;
177
+ if (event.type === 'log') {
178
+ eventText = renderLog(event, scenario, { ...eventContext, log: event }, formatting);
179
+ }
180
+ else if (scenario.template.events?.[event.name]) {
181
+ eventText = parseTemplate(scenario.template.events[event.name], eventContext);
182
+ }
183
+ if (eventText) {
184
+ if (formatting.showTimestamps) {
185
+ const timestamp = formatTimestamp(event.timestamp, formatting.timestampFormat || 'HH:mm:ss.SSS');
186
+ parts.push(`[${timestamp}] ${eventText}`);
187
+ }
188
+ else {
189
+ parts.push(eventText);
190
+ }
191
+ }
192
+ }
193
+ return parts.join('\n');
194
+ }
195
+ /**
196
+ * Render a log event
197
+ *
198
+ * @param log - Log event
199
+ * @param scenario - Scenario being rendered
200
+ * @param context - Evaluation context
201
+ * @param formatting - Formatting options
202
+ * @returns Rendered log text
203
+ */
204
+ function renderLog(log, scenario, context, formatting) {
205
+ // Check for severity-specific template
206
+ if (scenario.template.logs) {
207
+ const severity = getSeverityLevel(log.severityNumber);
208
+ const logTemplate = scenario.template.logs[severity] || scenario.template.logs.default;
209
+ if (logTemplate) {
210
+ return parseTemplate(logTemplate, context);
211
+ }
212
+ }
213
+ // Check for event-specific template
214
+ if (scenario.template.events?.[`log.${log.severityText?.toLowerCase()}`]) {
215
+ return parseTemplate(scenario.template.events[`log.${log.severityText?.toLowerCase()}`], context);
216
+ }
217
+ // Default log rendering
218
+ return `[${log.severityText || 'LOG'}] ${log.body}`;
219
+ }
220
+ /**
221
+ * Get severity level name from severity number
222
+ *
223
+ * @param severityNumber - OTEL severity number (1-24)
224
+ * @returns Severity level name
225
+ */
226
+ function getSeverityLevel(severityNumber) {
227
+ if (!severityNumber)
228
+ return 'info';
229
+ if (severityNumber >= 21)
230
+ return 'fatal';
231
+ if (severityNumber >= 17)
232
+ return 'error';
233
+ if (severityNumber >= 13)
234
+ return 'warn';
235
+ if (severityNumber >= 9)
236
+ return 'info';
237
+ if (severityNumber >= 5)
238
+ return 'debug';
239
+ return 'trace';
240
+ }
241
+ /**
242
+ * Render flow directives
243
+ *
244
+ * @param flow - Flow directives
245
+ * @param context - Evaluation context
246
+ * @returns Rendered flow text
247
+ */
248
+ function renderFlow(flow, context) {
249
+ const parts = [];
250
+ for (const item of flow) {
251
+ if (typeof item === 'string') {
252
+ // Simple string template
253
+ parts.push(parseTemplate(item, context));
254
+ }
255
+ else {
256
+ // Flow directive
257
+ if (item.forEach && item.template) {
258
+ // Iteration
259
+ const collection = context[item.forEach];
260
+ if (Array.isArray(collection)) {
261
+ for (let i = 0; i < collection.length; i++) {
262
+ const collectionItem = collection[i];
263
+ const itemContext = {
264
+ ...context,
265
+ ...(typeof collectionItem === 'object' && collectionItem !== null ? collectionItem : {}),
266
+ index: i,
267
+ };
268
+ parts.push(parseTemplate(item.template, itemContext));
269
+ }
270
+ }
271
+ }
272
+ else if (item.if) {
273
+ // Conditional
274
+ const condition = parseTemplate(item.if, context);
275
+ if (condition === 'true' || condition === '1') {
276
+ if (item.then) {
277
+ parts.push(parseTemplate(item.then, context));
278
+ }
279
+ }
280
+ else {
281
+ if (item.else) {
282
+ parts.push(parseTemplate(item.else, context));
283
+ }
284
+ }
285
+ }
286
+ }
287
+ }
288
+ return parts.join('\n');
289
+ }
290
+ /**
291
+ * Build span tree from events
292
+ *
293
+ * @param events - All events
294
+ * @param includeLogsPerSpan - Whether to attach logs to spans
295
+ * @returns Span tree
296
+ */
297
+ function buildSpanTree(events, includeLogsPerSpan = false) {
298
+ const spans = events.filter((e) => e.type === 'span');
299
+ const logs = includeLogsPerSpan ? events.filter((e) => e.type === 'log') : [];
300
+ // Build map of spans by ID
301
+ const spanMap = new Map();
302
+ for (const span of spans) {
303
+ if (span.spanId) {
304
+ spanMap.set(span.spanId, {
305
+ span,
306
+ children: [],
307
+ logs: [],
308
+ depth: 0,
309
+ });
310
+ }
311
+ }
312
+ // Attach logs to spans
313
+ if (includeLogsPerSpan) {
314
+ for (const log of logs) {
315
+ if (log.spanId && spanMap.has(log.spanId)) {
316
+ spanMap.get(log.spanId).logs.push(log);
317
+ }
318
+ }
319
+ }
320
+ // Build tree structure
321
+ const roots = [];
322
+ for (const node of spanMap.values()) {
323
+ if (node.span.parentSpanId && spanMap.has(node.span.parentSpanId)) {
324
+ const parent = spanMap.get(node.span.parentSpanId);
325
+ parent.children.push(node);
326
+ node.depth = parent.depth + 1;
327
+ }
328
+ else {
329
+ roots.push(node);
330
+ }
331
+ }
332
+ return roots;
333
+ }
334
+ /**
335
+ * Normalize timestamp to milliseconds
336
+ *
337
+ * @param timestamp - Timestamp (number or ISO string)
338
+ * @returns Milliseconds since epoch
339
+ */
340
+ function normalizeTimestamp(timestamp) {
341
+ if (typeof timestamp === 'number') {
342
+ // Assume milliseconds if < 10^12, otherwise nanoseconds
343
+ return timestamp < 1e12 ? timestamp : timestamp / 1e6;
344
+ }
345
+ return new Date(timestamp).getTime();
346
+ }
347
+ /**
348
+ * Format timestamp
349
+ *
350
+ * @param timestamp - Timestamp to format
351
+ * @param format - Format string (simplified, only supports HH:mm:ss.SSS)
352
+ * @returns Formatted timestamp
353
+ */
354
+ function formatTimestamp(timestamp, format) {
355
+ const ms = normalizeTimestamp(timestamp);
356
+ const date = new Date(ms);
357
+ if (format === 'HH:mm:ss.SSS') {
358
+ const hours = String(date.getHours()).padStart(2, '0');
359
+ const minutes = String(date.getMinutes()).padStart(2, '0');
360
+ const seconds = String(date.getSeconds()).padStart(2, '0');
361
+ const milliseconds = String(date.getMilliseconds()).padStart(3, '0');
362
+ return `${hours}:${minutes}:${seconds}.${milliseconds}`;
363
+ }
364
+ // Fallback to ISO string
365
+ return date.toISOString();
366
+ }
367
+ //# sourceMappingURL=template-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-renderer.js","sourceRoot":"","sources":["../../src/narrative/template-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,268 @@
1
+ /**
2
+ * Narrative Template System Types
3
+ *
4
+ * Types for transforming OpenTelemetry event streams into human-readable
5
+ * execution narratives based on OTEL canvas definitions.
6
+ *
7
+ * @see docs/NARRATIVE_TEMPLATES_DESIGN.md
8
+ */
9
+ import type { OtelLog, OtelSpan } from '../types/otel';
10
+ /**
11
+ * Combined OTEL signal type for narrative processing
12
+ */
13
+ export type OtelSignal = OtelSpan | OtelLog | OtelEvent;
14
+ /**
15
+ * Generic OTEL event (spans can also be treated as events)
16
+ */
17
+ export interface OtelEvent {
18
+ /** Event name (e.g., "conversion.started", "log.error") */
19
+ name: string;
20
+ /** Event timestamp */
21
+ timestamp: string | number;
22
+ /** Event type (span, log, metric) */
23
+ type?: 'span' | 'log' | 'metric';
24
+ /** Event attributes */
25
+ attributes?: Record<string, string | number | boolean>;
26
+ /** Trace correlation */
27
+ traceId?: string;
28
+ spanId?: string;
29
+ parentSpanId?: string;
30
+ /** For logs: severity information */
31
+ severityText?: string;
32
+ severityNumber?: number;
33
+ /** For logs: message body */
34
+ body?: string | Record<string, unknown>;
35
+ /** For spans: duration */
36
+ duration?: number;
37
+ }
38
+ /**
39
+ * Narrative template definition
40
+ *
41
+ * References an .otel.canvas file and defines how to render
42
+ * execution events into human-readable narratives.
43
+ */
44
+ export interface NarrativeTemplate {
45
+ /** Schema version (e.g., "1.0.0") */
46
+ version: string;
47
+ /** Reference to .otel.canvas file */
48
+ canvas: string;
49
+ /** Human-readable template name */
50
+ name: string;
51
+ /** Purpose of this narrative view */
52
+ description: string;
53
+ /** How to structure the narrative */
54
+ mode: NarrativeMode;
55
+ /** Scenario selection strategy */
56
+ scenarioSelection: 'first-match' | 'manual';
57
+ /** Show logs associated with each span (span-tree mode) */
58
+ showLogsPerSpan?: boolean;
59
+ /** Mix spans/logs by timestamp (timeline mode) */
60
+ interleaveSignals?: boolean;
61
+ /** Mutually exclusive narrative scenarios */
62
+ scenarios: NarrativeScenario[];
63
+ /** Display formatting preferences */
64
+ formatting?: FormattingOptions;
65
+ }
66
+ /**
67
+ * Narrative rendering mode
68
+ */
69
+ export type NarrativeMode = 'span-tree' | 'timeline' | 'summary-only';
70
+ /**
71
+ * Narrative scenario definition
72
+ *
73
+ * Scenarios are mutually exclusive narrative templates selected
74
+ * based on which events occurred during execution.
75
+ */
76
+ export interface NarrativeScenario {
77
+ /** Unique scenario identifier (kebab-case) */
78
+ id: string;
79
+ /** Selection priority (lower = higher priority, 1 = highest) */
80
+ priority: number;
81
+ /** What this scenario represents */
82
+ description: string;
83
+ /** Conditions that must be met for this scenario to match */
84
+ condition: ScenarioCondition;
85
+ /** Narrative template content */
86
+ template: ScenarioTemplate;
87
+ }
88
+ /**
89
+ * Scenario matching conditions
90
+ */
91
+ export interface ScenarioCondition {
92
+ /** Must have these events (supports glob patterns like "*.error") */
93
+ requires?: string[];
94
+ /** Must NOT have these events (supports glob patterns) */
95
+ excludes?: string[];
96
+ /** Assertions on event attributes */
97
+ assertions?: Record<string, Assertion>;
98
+ /** Always matches (use as fallback) */
99
+ default?: boolean;
100
+ /** Match if ANY requires condition met (instead of ALL) */
101
+ any?: boolean;
102
+ }
103
+ /**
104
+ * Attribute assertion operators
105
+ */
106
+ export interface Assertion {
107
+ /** Greater than */
108
+ $gt?: number;
109
+ /** Greater than or equal */
110
+ $gte?: number;
111
+ /** Less than */
112
+ $lt?: number;
113
+ /** Less than or equal */
114
+ $lte?: number;
115
+ /** Equal to */
116
+ $eq?: string | number | boolean;
117
+ /** Not equal to */
118
+ $ne?: string | number | boolean;
119
+ /** Attribute exists/doesn't exist */
120
+ $exists?: boolean;
121
+ /** Value in array */
122
+ $in?: (string | number | boolean)[];
123
+ /** Value not in array */
124
+ $nin?: (string | number | boolean)[];
125
+ }
126
+ /**
127
+ * Scenario template content
128
+ */
129
+ export interface ScenarioTemplate {
130
+ /** Opening text */
131
+ introduction?: string;
132
+ /** Event/log name -> template mapping */
133
+ events?: Record<string, string>;
134
+ /** Optional: separate log templates by severity */
135
+ logs?: LogTemplates;
136
+ /** Narrative flow steps */
137
+ flow?: Array<string | FlowDirective>;
138
+ /** Closing text */
139
+ summary?: string;
140
+ /** For span-tree mode: span rendering template */
141
+ span?: string;
142
+ /** For span-tree mode: how to recurse into children */
143
+ children?: 'recurse' | 'ignore';
144
+ }
145
+ /**
146
+ * Log templates by severity level
147
+ */
148
+ export interface LogTemplates {
149
+ /** Template for TRACE logs (severity 1-4) */
150
+ trace?: string;
151
+ /** Template for DEBUG logs (severity 5-8) */
152
+ debug?: string;
153
+ /** Template for INFO logs (severity 9-12) */
154
+ info?: string;
155
+ /** Template for WARN logs (severity 13-16) */
156
+ warn?: string;
157
+ /** Template for ERROR logs (severity 17-20) */
158
+ error?: string;
159
+ /** Template for FATAL logs (severity 21-24) */
160
+ fatal?: string;
161
+ /** Fallback for any log */
162
+ default?: string;
163
+ }
164
+ /**
165
+ * Flow directive for narrative generation
166
+ */
167
+ export interface FlowDirective {
168
+ /** Iterate over collection (e.g., "violations", "logs.filter(l => l.severityNumber >= 17)") */
169
+ forEach?: string;
170
+ /** Template for each item in iteration */
171
+ template?: string;
172
+ /** Conditional expression */
173
+ if?: string;
174
+ /** Template if condition true */
175
+ then?: string;
176
+ /** Template if condition false */
177
+ else?: string;
178
+ }
179
+ /**
180
+ * Formatting options for narrative rendering
181
+ */
182
+ export interface FormattingOptions {
183
+ /** Indentation per hierarchy level (default: " ") */
184
+ indentPerLevel?: string;
185
+ /** Timestamp format (default: "HH:mm:ss.SSS") */
186
+ timestampFormat?: string;
187
+ /** Show timestamps in output (default: false) */
188
+ showTimestamps?: boolean;
189
+ /** Show duration information (default: true) */
190
+ showDuration?: boolean;
191
+ /** Show span IDs (useful for debugging) (default: false) */
192
+ showSpanIds?: boolean;
193
+ /** Which attributes to show: none, matched (from template), or all (default: 'matched') */
194
+ showAttributes?: 'none' | 'matched' | 'all';
195
+ }
196
+ /**
197
+ * Narrative rendering context
198
+ *
199
+ * Contains all data needed to render a narrative from events.
200
+ */
201
+ export interface NarrativeContext {
202
+ /** The narrative template being used */
203
+ template: NarrativeTemplate;
204
+ /** Selected scenario */
205
+ scenario: NarrativeScenario;
206
+ /** All collected events */
207
+ events: OtelEvent[];
208
+ /** Span tree (for span-tree mode) */
209
+ spanTree?: SpanTreeNode[];
210
+ /** Computed aggregate values */
211
+ aggregates?: Record<string, unknown>;
212
+ /** Formatting options */
213
+ formatting: FormattingOptions;
214
+ }
215
+ /**
216
+ * Span tree node for hierarchical rendering
217
+ */
218
+ export interface SpanTreeNode {
219
+ /** The span event */
220
+ span: OtelEvent;
221
+ /** Child spans */
222
+ children: SpanTreeNode[];
223
+ /** Associated logs (if showLogsPerSpan is true) */
224
+ logs?: OtelEvent[];
225
+ /** Depth in tree (for indentation) */
226
+ depth: number;
227
+ }
228
+ /**
229
+ * Narrative rendering result
230
+ */
231
+ export interface NarrativeResult {
232
+ /** Rendered narrative text */
233
+ text: string;
234
+ /** Scenario that was selected */
235
+ scenarioId: string;
236
+ /** Metadata about the rendering */
237
+ metadata: {
238
+ /** Number of events processed */
239
+ eventCount: number;
240
+ /** Number of spans */
241
+ spanCount: number;
242
+ /** Number of logs */
243
+ logCount: number;
244
+ /** Time range of events */
245
+ timeRange?: {
246
+ start: string | number;
247
+ end: string | number;
248
+ };
249
+ /** Any errors encountered during rendering */
250
+ errors?: string[];
251
+ /** Any warnings encountered during rendering */
252
+ warnings?: string[];
253
+ };
254
+ }
255
+ /**
256
+ * Scenario matching result
257
+ */
258
+ export interface ScenarioMatchResult {
259
+ /** The matched scenario */
260
+ scenario: NarrativeScenario;
261
+ /** Whether this was the default/fallback scenario */
262
+ isDefault: boolean;
263
+ /** All applicable scenarios (for manual selection UI) */
264
+ applicableScenarios: NarrativeScenario[];
265
+ /** Reasons why other scenarios didn't match */
266
+ matchReasons?: Record<string, string>;
267
+ }
268
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/narrative/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Narrative Template System Types
3
+ *
4
+ * Types for transforming OpenTelemetry event streams into human-readable
5
+ * execution narratives based on OTEL canvas definitions.
6
+ *
7
+ * @see docs/NARRATIVE_TEMPLATES_DESIGN.md
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/narrative/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}