@industry-theme/principal-view-panels 0.4.21 → 0.4.23

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.
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { PanelComponentProps } from '@principal-ade/panel-framework-core';
3
3
  import type { NarrativeTemplate } from '@principal-ai/principal-view-core/browser';
4
+ import type { FileInfo } from '@principal-ai/repository-abstraction';
4
5
  export type ViewMode = 'raw' | 'narrative' | 'summary';
5
6
  /**
6
7
  * Props for CanvasDetailPanel
@@ -21,6 +22,11 @@ export interface CanvasDetailPanelProps extends PanelComponentProps {
21
22
  * Optional canvas name for display.
22
23
  */
23
24
  canvasName?: string | null;
25
+ /**
26
+ * Optional canvas file info with metadata (size, lastModified, etc.).
27
+ * Used for detecting file changes and auto-reloading.
28
+ */
29
+ canvasFileInfo?: FileInfo | null;
24
30
  /**
25
31
  * Optional narrative ID to display.
26
32
  * If provided, the panel will display this narrative without showing the selector UI.
@@ -36,6 +42,11 @@ export interface CanvasDetailPanelProps extends PanelComponentProps {
36
42
  * If provided along with selectedNarrativeId, the panel will use this template directly.
37
43
  */
38
44
  narrativeTemplate?: NarrativeTemplate | null;
45
+ /**
46
+ * Optional narrative file info with metadata (size, lastModified, etc.).
47
+ * Used for detecting narrative file changes and auto-reloading.
48
+ */
49
+ narrativeFileInfo?: FileInfo | null;
39
50
  }
40
51
  /**
41
52
  * Canvas Detail Panel
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasDetailPanel.d.ts","sourceRoot":"","sources":["../../src/panels/CanvasDetailPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,OAAO,KAAK,EAAkB,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAkBnG,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,WAAW,GAAG,SAAS,CAAC;AA8LvD;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEjC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC9C;AA8BD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAspC9D,CAAC"}
1
+ {"version":3,"file":"CanvasDetailPanel.d.ts","sourceRoot":"","sources":["../../src/panels/CanvasDetailPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG/E,OAAO,KAAK,EAAkB,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAEnG,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAiB/E,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,WAAW,GAAG,SAAS,CAAC;AA8LvD;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEjC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B;;;OAGG;IACH,cAAc,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAEjC;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE9B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAE7C;;;OAGG;IACH,iBAAiB,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;CACrC;AA8BD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAwuC9D,CAAC"}
@@ -35,9 +35,11 @@ declare const meta: {
35
35
  selectedCanvasId?: string | null | undefined;
36
36
  canvasPath?: string | null | undefined;
37
37
  canvasName?: string | null | undefined;
38
+ canvasFileInfo?: (import("@principal-ai/repository-abstraction").FileInfo | null) | undefined;
38
39
  selectedNarrativeId?: string | null | undefined;
39
40
  narrativePath?: string | null | undefined;
40
41
  narrativeTemplate?: (NarrativeTemplate | null) | undefined;
42
+ narrativeFileInfo?: (import("@principal-ai/repository-abstraction").FileInfo | null) | undefined;
41
43
  context: import("@principal-ade/panel-framework-core").PanelContextValue;
42
44
  actions: import("@principal-ade/panel-framework-core").PanelActions;
43
45
  events: import("@principal-ade/panel-framework-core").PanelEventEmitter;
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasDetailPanel.stories.d.ts","sourceRoot":"","sources":["../../src/panels/CanvasDetailPanel.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAEnF;;;;;;;;;;;;;;;;;GAiBG;AACH,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;CAsBgC,CAAC;AAE3C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0wBnC;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAiC9B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,EAAE,KAyCxC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,KA+CtC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,KA+CtC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,EAAE,KA+C5C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,KA+C9B,CAAC"}
1
+ {"version":3,"file":"CanvasDetailPanel.stories.d.ts","sourceRoot":"","sources":["../../src/panels/CanvasDetailPanel.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAEnF;;;;;;;;;;;;;;;;;GAiBG;AACH,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;CAsBgC,CAAC;AAE3C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0wBnC;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAiC9B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,EAAE,KAyCxC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,KA+CtC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,KA+CtC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,EAAE,KA+C5C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,KA+C9B,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { PanelComponentProps } from '@principal-ade/panel-framework-core';
3
+ import type { FileInfo } from '@principal-ai/repository-abstraction';
3
4
  /**
4
5
  * Props for CanvasEditorPanel
5
6
  */
@@ -16,6 +17,11 @@ export interface CanvasEditorPanelProps extends PanelComponentProps {
16
17
  * Canvas display name.
17
18
  */
18
19
  canvasName?: string;
20
+ /**
21
+ * Optional canvas file info with metadata (size, lastModified, etc.).
22
+ * Used for detecting file changes and auto-reloading.
23
+ */
24
+ canvasFileInfo?: FileInfo | null;
19
25
  }
20
26
  /**
21
27
  * Principal View Graph Panel
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasEditorPanel.d.ts","sourceRoot":"","sources":["../../src/panels/CanvasEditorPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AA2B/E;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAmwB9D,CAAC"}
1
+ {"version":3,"file":"CanvasEditorPanel.d.ts","sourceRoot":"","sources":["../../src/panels/CanvasEditorPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAS/E,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAmB/E;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,cAAc,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;CAClC;AAED;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAuwB9D,CAAC"}
@@ -20,6 +20,7 @@ declare const meta: {
20
20
  selectedConfigId?: string | undefined;
21
21
  canvasPath?: string | undefined;
22
22
  canvasName?: string | undefined;
23
+ canvasFileInfo?: (import("@principal-ai/repository-abstraction").FileInfo | null) | undefined;
23
24
  context: import("@principal-ade/panel-framework-core").PanelContextValue;
24
25
  actions: import("@principal-ade/panel-framework-core").PanelActions;
25
26
  events: import("@principal-ade/panel-framework-core").PanelEventEmitter;
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasEditorPanel.stories.d.ts","sourceRoot":"","sources":["../../src/panels/CanvasEditorPanel.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAA2B,MAAM,OAAO,CAAC;AAQhD;;;GAGG;AACH,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;CAsBgC,CAAC;AAE3C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0HnC,eAAO,MAAM,mBAAmB,EAAE,KAGjC,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAgErB,CAAC"}
1
+ {"version":3,"file":"CanvasEditorPanel.stories.d.ts","sourceRoot":"","sources":["../../src/panels/CanvasEditorPanel.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAA2B,MAAM,OAAO,CAAC;AAQhD;;;GAGG;AACH,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;CAsBgC,CAAC;AAE3C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0HnC,eAAO,MAAM,mBAAmB,EAAE,KAGjC,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAgErB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasListPanel.d.ts","sourceRoot":"","sources":["../../src/panels/CanvasListPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiD,MAAM,OAAO,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAU/E;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAykBzD,CAAC"}
1
+ {"version":3,"file":"CanvasListPanel.d.ts","sourceRoot":"","sources":["../../src/panels/CanvasListPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiD,MAAM,OAAO,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAW/E;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA4nBzD,CAAC"}
@@ -49,6 +49,11 @@ export declare const ManyCanvases: Story;
49
49
  * Shows canvas files from both root and package-level .principal-views/ directories
50
50
  */
51
51
  export declare const MonorepoWithPackages: Story;
52
+ /**
53
+ * With Narratives - Shows canvases with associated narrative templates
54
+ * Demonstrates the tree structure with expandable narratives
55
+ */
56
+ export declare const WithNarratives: Story;
52
57
  /**
53
58
  * Change Detection Test - Interactive story for testing SHA-based change detection
54
59
  * Demonstrates how the panel responds to file tree changes and manual refresh
@@ -1 +1 @@
1
- {"version":3,"file":"CanvasListPanel.stories.d.ts","sourceRoot":"","sources":["../../src/panels/CanvasListPanel.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAmB,MAAM,OAAO,CAAC;AAMxC,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;CAsB8B,CAAC;AAEzC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA4EnC;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,KAkBrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,KAmBrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,KAAK,EAAE,KAkBnB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAuC/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,KA2B1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,KA2B1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAmIlC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,KA0KjC,CAAC"}
1
+ {"version":3,"file":"CanvasListPanel.stories.d.ts","sourceRoot":"","sources":["../../src/panels/CanvasListPanel.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAmB,MAAM,OAAO,CAAC;AAMxC,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;CAsB8B,CAAC;AAEzC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA4EnC;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,KAkBrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,EAAE,KAmBrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,KAAK,EAAE,KAkBnB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAuC/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,KA2B1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,KA2B1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAmIlC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,KA8P5B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,KA0KjC,CAAC"}
@@ -22,9 +22,11 @@ declare const meta: {
22
22
  selectedCanvasId?: string | null | undefined;
23
23
  canvasPath?: string | null | undefined;
24
24
  canvasName?: string | null | undefined;
25
+ canvasFileInfo?: (import("@principal-ai/repository-abstraction").FileInfo | null) | undefined;
25
26
  selectedNarrativeId?: string | null | undefined;
26
27
  narrativePath?: string | null | undefined;
27
28
  narrativeTemplate?: (import("@principal-ai/principal-view-core").NarrativeTemplate | null) | undefined;
29
+ narrativeFileInfo?: (import("@principal-ai/repository-abstraction").FileInfo | null) | undefined;
28
30
  context: import("@principal-ade/panel-framework-core").PanelContextValue;
29
31
  actions: import("@principal-ade/panel-framework-core").PanelActions;
30
32
  events: import("@principal-ade/panel-framework-core").PanelEventEmitter;
@@ -1 +1 @@
1
- {"version":3,"file":"SkillInstallation.stories.d.ts","sourceRoot":"","sources":["../../src/panels/SkillInstallation.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B;;;;;GAKG;AACH,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;CAsBgC,CAAC;AAE3C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0UnC;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,EAAE,KAkDpC,CAAC"}
1
+ {"version":3,"file":"SkillInstallation.stories.d.ts","sourceRoot":"","sources":["../../src/panels/SkillInstallation.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B;;;;;GAKG;AACH,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;CAsBgC,CAAC;AAE3C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0UnC;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,EAAE,KAkDpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useCanvasData.d.ts","sourceRoot":"","sources":["../../../../src/panels/canvas-list/hooks/useCanvasData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAGnG,UAAU,mBAAmB;IAC3B,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAKD;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,cAE3B,mBAAmB,KAAG,mBAgGxB,CAAC"}
1
+ {"version":3,"file":"useCanvasData.d.ts","sourceRoot":"","sources":["../../../../src/panels/canvas-list/hooks/useCanvasData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAGnG,UAAU,mBAAmB;IAC3B,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAKD;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,cAE3B,mBAAmB,KAAG,mBAiFxB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useCanvasNarrativeData.d.ts","sourceRoot":"","sources":["../../../../src/panels/canvas-list/hooks/useCanvasNarrativeData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAG7F,UAAU,4BAA4B;IACpC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,UAAU,4BAA4B;IACpC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,QAAQ,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAC;IACxE,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAKD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,uBAGpC,4BAA4B,KAAG,4BAuHjC,CAAC"}
1
+ {"version":3,"file":"useCanvasNarrativeData.d.ts","sourceRoot":"","sources":["../../../../src/panels/canvas-list/hooks/useCanvasNarrativeData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAEnF,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAG7F,UAAU,4BAA4B;IACpC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,UAAU,4BAA4B;IACpC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,QAAQ,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAC;IACxE,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAKD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,uBAGpC,4BAA4B,KAAG,4BAoHjC,CAAC"}
@@ -47490,7 +47490,8 @@ const CanvasEditorPanel = ({
47490
47490
  events,
47491
47491
  selectedConfigId,
47492
47492
  canvasPath,
47493
- canvasName
47493
+ canvasName,
47494
+ canvasFileInfo
47494
47495
  }) => {
47495
47496
  var _a, _b;
47496
47497
  const { theme } = useTheme$1();
@@ -47516,6 +47517,7 @@ const CanvasEditorPanel = ({
47516
47517
  actionsRef.current = actions2;
47517
47518
  eventsRef.current = events;
47518
47519
  const skipNextFileChangeRef = useRef(false);
47520
+ const canvasFileTimestampRef = useRef(null);
47519
47521
  const [pathCopied, setPathCopied] = useState(false);
47520
47522
  const containerRef = useCallback((container) => {
47521
47523
  if (resizeObserverRef.current) {
@@ -47568,10 +47570,10 @@ const CanvasEditorPanel = ({
47568
47570
  const canvas = ConfigLoader.parseCanvas(configContent);
47569
47571
  let library = null;
47570
47572
  if (ctx.hasSlice("fileTree") && !ctx.isSliceLoading("fileTree")) {
47571
- const fileTreeSlice2 = ctx.getSlice("fileTree");
47572
- const fileTreeData2 = fileTreeSlice2 == null ? void 0 : fileTreeSlice2.data;
47573
- if (fileTreeData2 == null ? void 0 : fileTreeData2.allFiles) {
47574
- const libraryPath = ConfigLoader.findLibraryPath(fileTreeData2.allFiles);
47573
+ const fileTreeSlice = ctx.getSlice("fileTree");
47574
+ const fileTreeData = fileTreeSlice == null ? void 0 : fileTreeSlice.data;
47575
+ if (fileTreeData == null ? void 0 : fileTreeData.allFiles) {
47576
+ const libraryPath = ConfigLoader.findLibraryPath(fileTreeData.allFiles);
47575
47577
  if (libraryPath) {
47576
47578
  try {
47577
47579
  const libraryFullPath = `${repositoryPath}/${libraryPath}`;
@@ -47701,39 +47703,44 @@ const CanvasEditorPanel = ({
47701
47703
  useEffect(() => {
47702
47704
  loadConfiguration();
47703
47705
  }, [canvasPath, loadConfiguration]);
47704
- const fileTreeSlice = context.hasSlice("fileTree") ? context.getSlice("fileTree") : null;
47705
- const fileTreeData = fileTreeSlice == null ? void 0 : fileTreeSlice.data;
47706
- const fileTreeDataRef = useRef(fileTreeData);
47707
47706
  useEffect(() => {
47708
- const prevData = fileTreeDataRef.current;
47709
- fileTreeDataRef.current = fileTreeData;
47710
- if (prevData === null) {
47711
- return;
47707
+ if (canvasFileInfo == null ? void 0 : canvasFileInfo.lastModified) {
47708
+ canvasFileTimestampRef.current = canvasFileInfo.lastModified.getTime();
47712
47709
  }
47713
- if (skipNextFileChangeRef.current) {
47714
- skipNextFileChangeRef.current = false;
47715
- return;
47716
- }
47717
- if (prevData !== fileTreeData && fileTreeData !== null) {
47718
- const prevFiles = prevData.allFiles || [];
47719
- const newFiles = fileTreeData.allFiles || [];
47720
- const prevConfigFile = prevFiles.find((f) => (f.path || f.relativePath) === canvasPath);
47721
- const newConfigFile = newFiles.find((f) => (f.path || f.relativePath) === canvasPath);
47722
- const libraryPath = ConfigLoader.findLibraryPath(newFiles);
47723
- const prevLibraryFile = libraryPath ? prevFiles.find((f) => (f.path || f.relativePath) === libraryPath) : null;
47724
- const newLibraryFile = libraryPath ? newFiles.find((f) => (f.path || f.relativePath) === libraryPath) : null;
47725
- const configChanged = prevConfigFile !== newConfigFile;
47726
- const libraryChanged = prevLibraryFile !== newLibraryFile;
47727
- if (configChanged || libraryChanged) {
47728
- console.log("[PrincipalViewGraph] Current canvas or library changed, reloading...", {
47729
- configChanged,
47730
- libraryChanged,
47731
- canvasPath
47732
- });
47733
- loadConfiguration();
47710
+ }, [canvasFileInfo]);
47711
+ useEffect(() => {
47712
+ if (!events || !canvasPath) return;
47713
+ const handleWorkspaceChange = () => {
47714
+ if (skipNextFileChangeRef.current) {
47715
+ skipNextFileChangeRef.current = false;
47716
+ return;
47734
47717
  }
47735
- }
47736
- }, [fileTreeData, loadConfiguration, canvasPath]);
47718
+ const ctx = contextRef.current;
47719
+ if (!ctx.hasSlice("fileTree")) return;
47720
+ const fileTreeSlice = ctx.getSlice("fileTree");
47721
+ const fileTreeData = fileTreeSlice == null ? void 0 : fileTreeSlice.data;
47722
+ if (!(fileTreeData == null ? void 0 : fileTreeData.allFiles)) return;
47723
+ const canvasFile = fileTreeData.allFiles.find(
47724
+ (f) => f.path === canvasPath || f.relativePath === canvasPath
47725
+ );
47726
+ if (canvasFile == null ? void 0 : canvasFile.lastModified) {
47727
+ const currentTimestamp = canvasFile.lastModified.getTime();
47728
+ if (canvasFileTimestampRef.current && currentTimestamp !== canvasFileTimestampRef.current) {
47729
+ console.log("[CanvasEditorPanel] Canvas file modified, reloading...", {
47730
+ path: canvasPath,
47731
+ lastLoaded: new Date(canvasFileTimestampRef.current),
47732
+ current: new Date(currentTimestamp)
47733
+ });
47734
+ loadConfiguration();
47735
+ canvasFileTimestampRef.current = currentTimestamp;
47736
+ }
47737
+ }
47738
+ };
47739
+ events.on("workspace:changed", handleWorkspaceChange);
47740
+ return () => {
47741
+ events.off("workspace:changed", handleWorkspaceChange);
47742
+ };
47743
+ }, [events, canvasPath, loadConfiguration]);
47737
47744
  useEffect(() => {
47738
47745
  const unsubscribe = eventsRef.current.on("data:refresh", () => {
47739
47746
  loadConfiguration();
@@ -50890,9 +50897,11 @@ const CanvasDetailPanel = ({
50890
50897
  selectedCanvasId: selectedCanvasIdProp,
50891
50898
  canvasPath: canvasPathProp,
50892
50899
  canvasName: canvasNameProp,
50900
+ canvasFileInfo: canvasFileInfoProp,
50893
50901
  selectedNarrativeId: selectedNarrativeIdProp,
50894
50902
  narrativePath: narrativePathProp,
50895
- narrativeTemplate: narrativeTemplateProp
50903
+ narrativeTemplate: narrativeTemplateProp,
50904
+ narrativeFileInfo: narrativeFileInfoProp
50896
50905
  }) => {
50897
50906
  var _a;
50898
50907
  const { theme } = useTheme$1();
@@ -50931,6 +50940,8 @@ const CanvasDetailPanel = ({
50931
50940
  eventsRef.current = events;
50932
50941
  const playbackTimerRef = useRef(null);
50933
50942
  const eventNodeMapRef = useRef(/* @__PURE__ */ new Map());
50943
+ const canvasFileTimestampRef = useRef(null);
50944
+ const narrativeFileTimestampRef = useRef(null);
50934
50945
  const loadCanvas = useCallback(async (canvasId, canvasPath) => {
50935
50946
  setState((prev) => ({ ...prev, loading: true, error: null }));
50936
50947
  try {
@@ -51066,6 +51077,65 @@ const CanvasDetailPanel = ({
51066
51077
  events.off("custom", handleEvent);
51067
51078
  };
51068
51079
  }, [events, loadCanvas, selectedCanvasIdProp, canvasPathProp]);
51080
+ useEffect(() => {
51081
+ if (canvasFileInfoProp == null ? void 0 : canvasFileInfoProp.lastModified) {
51082
+ canvasFileTimestampRef.current = canvasFileInfoProp.lastModified.getTime();
51083
+ }
51084
+ }, [canvasFileInfoProp]);
51085
+ useEffect(() => {
51086
+ if (narrativeFileInfoProp == null ? void 0 : narrativeFileInfoProp.lastModified) {
51087
+ narrativeFileTimestampRef.current = narrativeFileInfoProp.lastModified.getTime();
51088
+ }
51089
+ }, [narrativeFileInfoProp]);
51090
+ useEffect(() => {
51091
+ if (!events || !canvasPathProp) return;
51092
+ const handleWorkspaceChange = (event) => {
51093
+ const ctx = contextRef.current;
51094
+ if (!ctx.hasSlice("fileTree")) return;
51095
+ const fileTreeSlice = ctx.getSlice("fileTree");
51096
+ const fileTreeData = fileTreeSlice == null ? void 0 : fileTreeSlice.data;
51097
+ if (!(fileTreeData == null ? void 0 : fileTreeData.allFiles)) return;
51098
+ if (canvasPathProp) {
51099
+ const canvasFile = fileTreeData.allFiles.find(
51100
+ (f) => f.path === canvasPathProp || f.relativePath === canvasPathProp
51101
+ );
51102
+ if (canvasFile == null ? void 0 : canvasFile.lastModified) {
51103
+ const currentTimestamp = canvasFile.lastModified.getTime();
51104
+ if (canvasFileTimestampRef.current && currentTimestamp !== canvasFileTimestampRef.current) {
51105
+ console.log("[CanvasDetailPanel] Canvas file modified, reloading...", {
51106
+ path: canvasPathProp,
51107
+ lastLoaded: new Date(canvasFileTimestampRef.current),
51108
+ current: new Date(currentTimestamp)
51109
+ });
51110
+ if (selectedCanvasIdProp) {
51111
+ loadCanvas(selectedCanvasIdProp, canvasPathProp);
51112
+ }
51113
+ canvasFileTimestampRef.current = currentTimestamp;
51114
+ }
51115
+ }
51116
+ }
51117
+ if (narrativePathProp) {
51118
+ const narrativeFile = fileTreeData.allFiles.find(
51119
+ (f) => f.path === narrativePathProp || f.relativePath === narrativePathProp
51120
+ );
51121
+ if (narrativeFile == null ? void 0 : narrativeFile.lastModified) {
51122
+ const currentTimestamp = narrativeFile.lastModified.getTime();
51123
+ if (narrativeFileTimestampRef.current && currentTimestamp !== narrativeFileTimestampRef.current) {
51124
+ console.log("[CanvasDetailPanel] Narrative file modified, reloading...", {
51125
+ path: narrativePathProp,
51126
+ lastLoaded: new Date(narrativeFileTimestampRef.current),
51127
+ current: new Date(currentTimestamp)
51128
+ });
51129
+ narrativeFileTimestampRef.current = currentTimestamp;
51130
+ }
51131
+ }
51132
+ }
51133
+ };
51134
+ events.on("workspace:changed", handleWorkspaceChange);
51135
+ return () => {
51136
+ events.off("workspace:changed", handleWorkspaceChange);
51137
+ };
51138
+ }, [events, canvasPathProp, narrativePathProp, selectedCanvasIdProp, loadCanvas]);
51069
51139
  const handleToggleGrid = useCallback(() => {
51070
51140
  setState((prev) => ({ ...prev, showGrid: !prev.showGrid }));
51071
51141
  }, []);
@@ -51248,7 +51318,7 @@ const CanvasDetailPanel = ({
51248
51318
  }));
51249
51319
  }, []);
51250
51320
  const activeNodeIds = useMemo(() => {
51251
- var _a2, _b;
51321
+ var _a2;
51252
51322
  if (!state.canvas) return null;
51253
51323
  if (state.hoveredExecution) {
51254
51324
  const spans = ExecutionLoader.getSpans(state.hoveredExecution);
@@ -51277,7 +51347,7 @@ const CanvasDetailPanel = ({
51277
51347
  const activeIds = /* @__PURE__ */ new Set();
51278
51348
  for (const node of state.canvas.nodes || []) {
51279
51349
  const nodePv = node.pv || ((_a2 = node.data) == null ? void 0 : _a2.pv);
51280
- const nodeEventName = (_b = nodePv == null ? void 0 : nodePv.event) == null ? void 0 : _b.name;
51350
+ const nodeEventName = nodePv == null ? void 0 : nodePv.event;
51281
51351
  if (nodeEventName && state.hoveredScenarioEventNames.includes(nodeEventName)) {
51282
51352
  activeIds.add(node.id);
51283
51353
  }
@@ -53966,18 +54036,12 @@ const useCanvasData = ({
53966
54036
  setIsLoading(true);
53967
54037
  setError(null);
53968
54038
  try {
53969
- let fileTree = null;
53970
- if (fileTreeData == null ? void 0 : fileTreeData.fileTree) {
53971
- fileTree = fileTreeData.fileTree;
53972
- } else if (fileTreeData == null ? void 0 : fileTreeData.allFiles) {
53973
- fileTree = convertToFileTree(fileTreeData.allFiles, fileTreeSha || "unknown");
53974
- }
53975
- if (!fileTree) {
54039
+ if (!fileTreeData) {
53976
54040
  setCanvases(EMPTY_CANVAS_ARRAY);
53977
54041
  lastLoadedSha.current = fileTreeSha;
53978
54042
  return;
53979
54043
  }
53980
- const result = await discovery.current.discover(fileTree, {
54044
+ const result = await discovery.current.discover(fileTreeData, {
53981
54045
  // Don't include content - just metadata for listing
53982
54046
  includeContent: false
53983
54047
  });
@@ -54013,43 +54077,6 @@ const useCanvasData = ({
54013
54077
  refreshCanvases
54014
54078
  };
54015
54079
  };
54016
- function convertToFileTree(allFiles, sha) {
54017
- const fileInfos = allFiles.map((file) => ({
54018
- path: file.path || file.relativePath || "",
54019
- relativePath: file.relativePath || file.path || "",
54020
- name: file.name || (file.relativePath || file.path || "").split("/").pop() || "",
54021
- extension: (file.name || "").split(".").pop() || "",
54022
- size: 0,
54023
- lastModified: /* @__PURE__ */ new Date(),
54024
- isDirectory: false
54025
- }));
54026
- return {
54027
- sha,
54028
- root: {
54029
- path: "/",
54030
- name: "",
54031
- relativePath: "",
54032
- children: [],
54033
- fileCount: fileInfos.length,
54034
- totalSize: 0,
54035
- depth: 0
54036
- },
54037
- allFiles: fileInfos,
54038
- allDirectories: [],
54039
- stats: {
54040
- totalFiles: fileInfos.length,
54041
- totalDirectories: 0,
54042
- totalSize: 0,
54043
- maxDepth: 0
54044
- },
54045
- metadata: {
54046
- id: "panel-context",
54047
- timestamp: /* @__PURE__ */ new Date(),
54048
- sourceType: "panel",
54049
- sourceInfo: {}
54050
- }
54051
- };
54052
- }
54053
54080
  const EMPTY_NARRATIVES_ARRAY = [];
54054
54081
  const useCanvasNarrativeData = ({
54055
54082
  context,
@@ -61535,6 +61562,13 @@ const CanvasListPanel = ({
61535
61562
  const [showHelp, setShowHelp] = useState(false);
61536
61563
  const [cliCommandCopied, setCliCommandCopied] = useState(false);
61537
61564
  const { canvases, narratives, isLoading, error, refreshData } = useCanvasNarrativeData({ context, actions: actions2 });
61565
+ const fileTreeSlice = context.getSlice("fileTree");
61566
+ const fileTreeData = fileTreeSlice == null ? void 0 : fileTreeSlice.data;
61567
+ const getCanvasFileInfo = useCallback((canvasPath) => {
61568
+ return fileTreeData == null ? void 0 : fileTreeData.allFiles.find(
61569
+ (f) => f.path === canvasPath || f.relativePath === canvasPath
61570
+ );
61571
+ }, [fileTreeData]);
61538
61572
  const availablePackages = useMemo(() => {
61539
61573
  const packages = /* @__PURE__ */ new Set();
61540
61574
  canvases.forEach((canvas) => {
@@ -61576,6 +61610,7 @@ const CanvasListPanel = ({
61576
61610
  if (node.type === "canvas" && node.canvas) {
61577
61611
  setSelectedCanvasId(node.canvas.id);
61578
61612
  if (events) {
61613
+ const canvasFileInfo = getCanvasFileInfo(node.canvas.path);
61579
61614
  events.emit({
61580
61615
  type: "custom",
61581
61616
  source: "canvas-list-panel",
@@ -61583,13 +61618,16 @@ const CanvasListPanel = ({
61583
61618
  payload: {
61584
61619
  action: "selectCanvas",
61585
61620
  canvasId: node.canvas.id,
61586
- canvas: node.canvas
61621
+ canvas: node.canvas,
61622
+ canvasFileInfo
61587
61623
  }
61588
61624
  });
61589
61625
  }
61590
61626
  } else if (node.type === "narrative" && node.narrative && node.canvas) {
61591
61627
  setSelectedCanvasId(node.canvas.id);
61592
61628
  if (events) {
61629
+ const canvasFileInfo = getCanvasFileInfo(node.canvas.path);
61630
+ const narrativeFileInfo = getCanvasFileInfo(node.narrative.path);
61593
61631
  events.emit({
61594
61632
  type: "custom",
61595
61633
  source: "canvas-list-panel",
@@ -61598,14 +61636,35 @@ const CanvasListPanel = ({
61598
61636
  action: "selectCanvas",
61599
61637
  canvasId: node.canvas.id,
61600
61638
  canvas: node.canvas,
61639
+ canvasFileInfo,
61601
61640
  narrativeId: node.narrative.id,
61602
61641
  narrative: node.narrative,
61603
- narrativeTemplate: node.narrativeTemplate
61642
+ narrativeTemplate: node.narrativeTemplate,
61643
+ narrativeFileInfo
61604
61644
  }
61605
61645
  });
61606
61646
  }
61607
61647
  }
61608
- }, [events]);
61648
+ }, [events, getCanvasFileInfo]);
61649
+ const handleOpenCanvas = useCallback((canvas) => {
61650
+ if (actions2 == null ? void 0 : actions2.openFile) {
61651
+ actions2.openFile(canvas.path);
61652
+ }
61653
+ if (events) {
61654
+ const canvasFileInfo = getCanvasFileInfo(canvas.path);
61655
+ events.emit({
61656
+ type: "custom",
61657
+ source: "canvas-list-panel",
61658
+ timestamp: Date.now(),
61659
+ payload: {
61660
+ action: "openCanvas",
61661
+ canvasId: canvas.id,
61662
+ canvas,
61663
+ canvasFileInfo
61664
+ }
61665
+ });
61666
+ }
61667
+ }, [actions2, events, getCanvasFileInfo]);
61609
61668
  const handleRefresh = async () => {
61610
61669
  setIsRefreshing(true);
61611
61670
  if (events) {
@@ -61639,7 +61698,8 @@ const CanvasListPanel = ({
61639
61698
  tabIndex: -1,
61640
61699
  style: {
61641
61700
  position: "relative",
61642
- padding: "clamp(12px, 3vw, 20px)",
61701
+ paddingTop: "clamp(12px, 3vw, 20px)",
61702
+ paddingBottom: "clamp(12px, 3vw, 20px)",
61643
61703
  fontFamily: theme.fonts.body,
61644
61704
  height: "100%",
61645
61705
  boxSizing: "border-box",
@@ -61661,6 +61721,8 @@ const CanvasListPanel = ({
61661
61721
  alignItems: "center",
61662
61722
  justifyContent: "space-between",
61663
61723
  gap: "12px",
61724
+ paddingLeft: "clamp(12px, 3vw, 20px)",
61725
+ paddingRight: "clamp(12px, 3vw, 20px)",
61664
61726
  flexWrap: "wrap"
61665
61727
  },
61666
61728
  children: [
@@ -61847,6 +61909,8 @@ const CanvasListPanel = ({
61847
61909
  style: {
61848
61910
  flexShrink: 0,
61849
61911
  padding: "12px",
61912
+ marginLeft: "clamp(12px, 3vw, 20px)",
61913
+ marginRight: "clamp(12px, 3vw, 20px)",
61850
61914
  background: `${theme.colors.error}20`,
61851
61915
  border: `1px solid ${theme.colors.error}`,
61852
61916
  borderRadius: theme.radii[2],
@@ -61911,6 +61975,7 @@ const CanvasListPanel = ({
61911
61975
  narratives,
61912
61976
  theme,
61913
61977
  onClick: handleTreeNodeClick,
61978
+ onOpenCanvas: handleOpenCanvas,
61914
61979
  selectedNodeId: selectedCanvasId ? `canvas:${selectedCanvasId}` : void 0,
61915
61980
  defaultOpen: false
61916
61981
  }