@ryanfw/prompt-orchestration-pipeline 0.12.0 → 0.13.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 (60) hide show
  1. package/package.json +10 -1
  2. package/src/cli/analyze-task.js +51 -0
  3. package/src/cli/index.js +8 -0
  4. package/src/components/AddPipelineSidebar.jsx +144 -0
  5. package/src/components/AnalysisProgressTray.jsx +87 -0
  6. package/src/components/JobTable.jsx +4 -3
  7. package/src/components/Layout.jsx +142 -139
  8. package/src/components/MarkdownRenderer.jsx +149 -0
  9. package/src/components/PipelineDAGGrid.jsx +404 -0
  10. package/src/components/PipelineTypeTaskSidebar.jsx +96 -0
  11. package/src/components/SchemaPreviewPanel.jsx +97 -0
  12. package/src/components/StageTimeline.jsx +36 -0
  13. package/src/components/TaskAnalysisDisplay.jsx +227 -0
  14. package/src/components/TaskCreationSidebar.jsx +447 -0
  15. package/src/components/TaskDetailSidebar.jsx +119 -117
  16. package/src/components/TaskFilePane.jsx +94 -39
  17. package/src/components/ui/button.jsx +59 -27
  18. package/src/components/ui/sidebar.jsx +118 -0
  19. package/src/config/models.js +99 -67
  20. package/src/core/config.js +4 -1
  21. package/src/llm/index.js +129 -9
  22. package/src/pages/PipelineDetail.jsx +6 -6
  23. package/src/pages/PipelineList.jsx +214 -0
  24. package/src/pages/PipelineTypeDetail.jsx +234 -0
  25. package/src/providers/deepseek.js +76 -16
  26. package/src/providers/openai.js +61 -34
  27. package/src/task-analysis/enrichers/analysis-writer.js +62 -0
  28. package/src/task-analysis/enrichers/schema-deducer.js +145 -0
  29. package/src/task-analysis/enrichers/schema-writer.js +74 -0
  30. package/src/task-analysis/extractors/artifacts.js +137 -0
  31. package/src/task-analysis/extractors/llm-calls.js +176 -0
  32. package/src/task-analysis/extractors/stages.js +51 -0
  33. package/src/task-analysis/index.js +103 -0
  34. package/src/task-analysis/parser.js +28 -0
  35. package/src/task-analysis/utils/ast.js +43 -0
  36. package/src/ui/client/hooks/useAnalysisProgress.js +145 -0
  37. package/src/ui/client/index.css +64 -0
  38. package/src/ui/client/main.jsx +4 -0
  39. package/src/ui/client/sse-fetch.js +120 -0
  40. package/src/ui/dist/assets/index-cjHV9mYW.js +82578 -0
  41. package/src/ui/dist/assets/index-cjHV9mYW.js.map +1 -0
  42. package/src/ui/dist/assets/style-CoM9SoQF.css +180 -0
  43. package/src/ui/dist/index.html +2 -2
  44. package/src/ui/endpoints/create-pipeline-endpoint.js +194 -0
  45. package/src/ui/endpoints/pipeline-analysis-endpoint.js +246 -0
  46. package/src/ui/endpoints/pipeline-type-detail-endpoint.js +181 -0
  47. package/src/ui/endpoints/pipelines-endpoint.js +133 -0
  48. package/src/ui/endpoints/schema-file-endpoint.js +105 -0
  49. package/src/ui/endpoints/task-analysis-endpoint.js +104 -0
  50. package/src/ui/endpoints/task-creation-endpoint.js +114 -0
  51. package/src/ui/endpoints/task-save-endpoint.js +101 -0
  52. package/src/ui/express-app.js +45 -0
  53. package/src/ui/lib/analysis-lock.js +67 -0
  54. package/src/ui/lib/sse.js +30 -0
  55. package/src/ui/server.js +4 -0
  56. package/src/ui/utils/slug.js +31 -0
  57. package/src/ui/watcher.js +28 -2
  58. package/src/ui/dist/assets/index-B320avRx.js +0 -26613
  59. package/src/ui/dist/assets/index-B320avRx.js.map +0 -1
  60. package/src/ui/dist/assets/style-BYCoLBnK.css +0 -62
@@ -0,0 +1,118 @@
1
+ import * as Dialog from "@radix-ui/react-dialog";
2
+ import { X } from "lucide-react";
3
+ import { forwardRef } from "react";
4
+
5
+ /**
6
+ * Unified Sidebar Component
7
+ *
8
+ * A consistent, accessible slide-over panel with:
9
+ * - Unified styling and animations
10
+ * - Focus trap and keyboard navigation
11
+ * - Backdrop with click-to-close
12
+ * - Consistent z-index management
13
+ * - Steel Terminal theme compliance
14
+ *
15
+ * @param {Object} props - Component props
16
+ * @param {boolean} props.open - Whether sidebar is open
17
+ * @param {Function} props.onOpenChange - Callback when open state changes
18
+ * @param {ReactNode} props.title - Sidebar title
19
+ * @param {string} props.description - Optional description
20
+ * @param {ReactNode} props.children - Sidebar content
21
+ * @param {string} props.className - Additional classes for content area
22
+ * @param {string} props.contentClassName - Additional classes for sidebar panel
23
+ * @param {string} props.headerClassName - Additional classes for header
24
+ * @param {boolean} props.showHeaderBorder - Whether to show header border (default: true)
25
+ */
26
+ export const Sidebar = forwardRef(
27
+ (
28
+ {
29
+ open,
30
+ onOpenChange,
31
+ title,
32
+ description,
33
+ children,
34
+ className,
35
+ contentClassName,
36
+ headerClassName,
37
+ showHeaderBorder = true,
38
+ ...props
39
+ },
40
+ ref
41
+ ) => {
42
+ return (
43
+ <Dialog.Root open={open} onOpenChange={onOpenChange}>
44
+ <Dialog.Portal>
45
+ <Dialog.Overlay className="fixed inset-0 bg-black/40 backdrop-blur-sm z-[1999] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0" />
46
+ <Dialog.Content
47
+ ref={ref}
48
+ style={{ backgroundColor: "white" }}
49
+ className={`fixed inset-y-0 right-0 z-[2000] w-full max-w-[900px] min-w-[384px] bg-card shadow-2xl transform transition-all duration-300 ease-in-out data-[state=closed]:translate-x-full data-[state=open]:translate-x-0 data-[state=closed]:animate-out data-[state=open]:animate-in ${contentClassName}`}
50
+ {...props}
51
+ >
52
+ {/* Header */}
53
+ <Dialog.Title
54
+ className={`px-6 py-4 text-lg font-semibold text-foreground ${
55
+ showHeaderBorder ? "border-b" : ""
56
+ } ${headerClassName}`}
57
+ >
58
+ {title}
59
+ </Dialog.Title>
60
+
61
+ {description && (
62
+ <Dialog.Description className="px-6 pb-4 pt-3 text-sm text-muted-foreground">
63
+ {description}
64
+ </Dialog.Description>
65
+ )}
66
+
67
+ {/* Close button */}
68
+ <Dialog.Close asChild>
69
+ <button
70
+ type="button"
71
+ className="absolute top-4 right-4 text-muted-foreground hover:text-foreground transition-colors p-2 rounded-md hover:bg-muted"
72
+ aria-label="Close"
73
+ >
74
+ <X className="h-5 w-5" />
75
+ </button>
76
+ </Dialog.Close>
77
+
78
+ {/* Content */}
79
+ <div className={`flex-1 overflow-y-auto ${className}`}>
80
+ {children}
81
+ </div>
82
+ </Dialog.Content>
83
+ </Dialog.Portal>
84
+ </Dialog.Root>
85
+ );
86
+ }
87
+ );
88
+
89
+ Sidebar.displayName = "Sidebar";
90
+
91
+ /**
92
+ * SidebarFooter - Standard footer area for sidebars
93
+ * Use for action buttons at the bottom of sidebars
94
+ */
95
+ export const SidebarFooter = ({ children, className }) => {
96
+ return (
97
+ <div className={`border-t p-6 bg-card flex gap-3 ${className}`}>
98
+ {children}
99
+ </div>
100
+ );
101
+ };
102
+
103
+ /**
104
+ * SidebarSection - Standard section wrapper
105
+ * Use for grouping related content in sidebars
106
+ */
107
+ export const SidebarSection = ({ title, children, className }) => {
108
+ return (
109
+ <div className={`p-6 ${className}`}>
110
+ {title && (
111
+ <h3 className="text-base font-semibold text-foreground mb-4">
112
+ {title}
113
+ </h3>
114
+ )}
115
+ {children}
116
+ </div>
117
+ );
118
+ };
@@ -1,77 +1,90 @@
1
1
  /**
2
2
  * Canonical model configuration for prompt orchestration pipeline.
3
3
  * This module serves as single source of truth for all model metadata.
4
+ *
5
+ * Last updated: December 2025
4
6
  */
5
7
 
6
8
  // Model alias constants grouped by provider
7
9
  export const ModelAlias = Object.freeze({
8
- // DeepSeek
10
+ // DeepSeek (V3.2-Exp unified pricing as of Sept 2025)
9
11
  DEEPSEEK_CHAT: "deepseek:chat",
10
12
  DEEPSEEK_REASONER: "deepseek:reasoner",
11
13
 
12
- // OpenAI
13
- OPENAI_GPT_5: "openai:gpt-5",
14
- OPENAI_GPT_5_CORE: "openai:gpt-5-core",
15
- OPENAI_GPT_5_CHAT: "openai:gpt-5-chat",
16
- OPENAI_GPT_5_PRO: "openai:gpt-5-pro",
14
+ // OpenAI (GPT-5.2 flagship as of Dec 2025)
15
+ OPENAI_GPT_5_2: "openai:gpt-5.2", // NEW: Current flagship
16
+ OPENAI_GPT_5_2_PRO: "openai:gpt-5.2-pro", // NEW: High-compute tier
17
+ OPENAI_GPT_5_1: "openai:gpt-5.1", // NEW: Previous flagship (being sunset)
18
+ OPENAI_GPT_5: "openai:gpt-5", // Stable, still available
17
19
  OPENAI_GPT_5_MINI: "openai:gpt-5-mini",
18
20
  OPENAI_GPT_5_NANO: "openai:gpt-5-nano",
19
21
 
20
22
  // Legacy aliases for backward compatibility (tests)
23
+ OPENAI_GPT_4_1: "openai:gpt-4.1", // Updated: GPT-4.1 replaced GPT-4 Turbo
21
24
  OPENAI_GPT_4: "openai:gpt-4",
22
- OPENAI_GPT_4_TURBO: "openai:gpt-4-turbo",
23
25
 
24
- // Google Gemini
26
+ // Google Gemini (Gemini 3 series released Dec 2025)
27
+ GEMINI_3_PRO: "gemini:pro-3", // NEW: Latest flagship
28
+ GEMINI_3_FLASH: "gemini:flash-3", // NEW: Released Dec 17, 2025
25
29
  GEMINI_2_5_PRO: "gemini:pro-2.5",
26
30
  GEMINI_2_5_FLASH: "gemini:flash-2.5",
27
31
  GEMINI_2_5_FLASH_LITE: "gemini:flash-2.5-lite",
28
- GEMINI_2_5_FLASH_IMAGE: "gemini:flash-2.5-image",
29
32
 
30
- // Z.ai (formerly Zhipu) - standardized to "zhipu" provider
33
+ // Z.ai (formerly Zhipu) - GLM-4.6V released Dec 2025
34
+ ZAI_GLM_4_6V: "zhipu:glm-4.6v", // NEW: Vision-language model
31
35
  ZAI_GLM_4_6: "zhipu:glm-4.6",
32
36
  ZAI_GLM_4_5: "zhipu:glm-4.5",
33
37
  ZAI_GLM_4_5_AIR: "zhipu:glm-4.5-air",
34
38
 
35
- // Anthropic
39
+ // Anthropic (Opus 4.5 released Nov 2025)
40
+ ANTHROPIC_OPUS_4_5: "anthropic:opus-4-5", // NEW: Current flagship
36
41
  ANTHROPIC_SONNET_4_5: "anthropic:sonnet-4-5",
37
42
  ANTHROPIC_HAIKU_4_5: "anthropic:haiku-4-5",
38
- ANTHROPIC_OPUS_4_1: "anthropic:opus-4-1",
43
+ ANTHROPIC_OPUS_4_1: "anthropic:opus-4-1", // Legacy, still available
39
44
  });
40
45
 
41
46
  // Consolidated model configuration with pricing metadata
42
47
  export const MODEL_CONFIG = Object.freeze({
43
- // DeepSeek (2025)
48
+ // ─── DeepSeek (2025) ───
49
+ // V3.2-Exp unified pricing as of Sept 29, 2025 - 50% price reduction
44
50
  [ModelAlias.DEEPSEEK_CHAT]: {
45
51
  provider: "deepseek",
46
- model: "deepseek-chat", // V3.2 Exp (non-thinking) under the hood
47
- tokenCostInPerMillion: 0.27,
48
- tokenCostOutPerMillion: 1.1,
52
+ model: "deepseek-chat", // V3.2-Exp (non-thinking mode)
53
+ tokenCostInPerMillion: 0.28, // Updated: cache miss price
54
+ tokenCostOutPerMillion: 0.42, // Updated: unified output price
49
55
  },
50
56
  [ModelAlias.DEEPSEEK_REASONER]: {
51
57
  provider: "deepseek",
52
- model: "deepseek-reasoner", // R1 family
53
- tokenCostInPerMillion: 0.55,
54
- tokenCostOutPerMillion: 2.19,
58
+ model: "deepseek-reasoner", // V3.2-Exp (thinking mode)
59
+ tokenCostInPerMillion: 0.28, // Updated: same as chat now
60
+ tokenCostOutPerMillion: 0.42, // Updated: unified pricing
55
61
  },
56
62
 
57
- // OpenAI (2025)
58
- [ModelAlias.OPENAI_GPT_5]: {
63
+ // ─── OpenAI (2025) ───
64
+ // GPT-5.2 released Dec 2025 as new flagship
65
+ [ModelAlias.OPENAI_GPT_5_2]: {
59
66
  provider: "openai",
60
- model: "gpt-5", // stable flagship
61
- tokenCostInPerMillion: 1.25,
62
- tokenCostOutPerMillion: 10.0,
67
+ model: "gpt-5.2", // Current flagship for coding/agentic tasks
68
+ tokenCostInPerMillion: 1.75,
69
+ tokenCostOutPerMillion: 14.0,
63
70
  },
64
- [ModelAlias.OPENAI_GPT_5_CHAT]: {
71
+ [ModelAlias.OPENAI_GPT_5_2_PRO]: {
65
72
  provider: "openai",
66
- model: "gpt-5-chat-latest", // Chat variant
67
- tokenCostInPerMillion: 1.25,
68
- tokenCostOutPerMillion: 10.0,
73
+ model: "gpt-5.2-pro", // Maximum intelligence tier
74
+ tokenCostInPerMillion: 17.5, // Estimated based on prior Pro pricing
75
+ tokenCostOutPerMillion: 140.0,
69
76
  },
70
- [ModelAlias.OPENAI_GPT_5_PRO]: {
77
+ [ModelAlias.OPENAI_GPT_5_1]: {
71
78
  provider: "openai",
72
- model: "gpt-5-pro", // higher-compute tier
73
- tokenCostInPerMillion: 15.0,
74
- tokenCostOutPerMillion: 120.0,
79
+ model: "gpt-5.1", // Previous flagship, being sunset from ChatGPT
80
+ tokenCostInPerMillion: 1.5,
81
+ tokenCostOutPerMillion: 12.0,
82
+ },
83
+ [ModelAlias.OPENAI_GPT_5]: {
84
+ provider: "openai",
85
+ model: "gpt-5", // Stable, still available
86
+ tokenCostInPerMillion: 1.25,
87
+ tokenCostOutPerMillion: 10.0,
75
88
  },
76
89
  [ModelAlias.OPENAI_GPT_5_MINI]: {
77
90
  provider: "openai",
@@ -86,24 +99,37 @@ export const MODEL_CONFIG = Object.freeze({
86
99
  tokenCostOutPerMillion: 0.4,
87
100
  },
88
101
 
89
- // Legacy models for backward compatibility (tests)
102
+ // Legacy models for backward compatibility
103
+ [ModelAlias.OPENAI_GPT_4_1]: {
104
+ provider: "openai",
105
+ model: "gpt-4.1", // Replaced GPT-4 Turbo
106
+ tokenCostInPerMillion: 2.0,
107
+ tokenCostOutPerMillion: 8.0,
108
+ },
90
109
  [ModelAlias.OPENAI_GPT_4]: {
91
110
  provider: "openai",
92
111
  model: "gpt-4",
93
112
  tokenCostInPerMillion: 0.5,
94
113
  tokenCostOutPerMillion: 2.0,
95
114
  },
96
- [ModelAlias.OPENAI_GPT_4_TURBO]: {
97
- provider: "openai",
98
- model: "gpt-4-turbo",
99
- tokenCostInPerMillion: 0.3,
100
- tokenCostOutPerMillion: 1.0,
101
- },
102
115
 
103
- // Google Gemini (2025)
116
+ // ─── Google Gemini (2025) ───
117
+ // Gemini 3 series released Nov-Dec 2025
118
+ [ModelAlias.GEMINI_3_PRO]: {
119
+ provider: "gemini",
120
+ model: "gemini-3-pro-preview", // Most intelligent model
121
+ tokenCostInPerMillion: 2.0, // ≤200k tokens
122
+ tokenCostOutPerMillion: 12.0,
123
+ },
124
+ [ModelAlias.GEMINI_3_FLASH]: {
125
+ provider: "gemini",
126
+ model: "gemini-3-flash-preview", // Released Dec 17, 2025
127
+ tokenCostInPerMillion: 0.5,
128
+ tokenCostOutPerMillion: 3.0,
129
+ },
104
130
  [ModelAlias.GEMINI_2_5_PRO]: {
105
131
  provider: "gemini",
106
- model: "gemini-2.5-pro", // ≤200k input tier shown; >200k is higher
132
+ model: "gemini-2.5-pro", // ≤200k input tier; >200k is 2x
107
133
  tokenCostInPerMillion: 1.25,
108
134
  tokenCostOutPerMillion: 10.0,
109
135
  },
@@ -119,51 +145,57 @@ export const MODEL_CONFIG = Object.freeze({
119
145
  tokenCostInPerMillion: 0.1,
120
146
  tokenCostOutPerMillion: 0.4,
121
147
  },
122
- [ModelAlias.GEMINI_2_5_FLASH_IMAGE]: {
123
- provider: "gemini",
124
- model: "gemini-2.5-flash-image",
125
- // Inputs follow 2.5 Flash text pricing; outputs are **image tokens** at $30/M (≈$0.039 per 1024² image)
148
+
149
+ // ─── Z.ai (formerly Zhipu) ───
150
+ // GLM-4.6V released Dec 8, 2025 with 50% API price cut
151
+ [ModelAlias.ZAI_GLM_4_6V]: {
152
+ provider: "zhipu",
153
+ model: "glm-4.6v", // Vision-language model (106B)
126
154
  tokenCostInPerMillion: 0.3,
127
- tokenCostOutPerMillion: 30.0,
155
+ tokenCostOutPerMillion: 0.9,
128
156
  },
129
-
130
- // — Z.ai (formerly Zhipu) —
131
157
  [ModelAlias.ZAI_GLM_4_6]: {
132
158
  provider: "zhipu",
133
- model: "glm-4.6",
134
- tokenCostInPerMillion: 0.6,
135
- tokenCostOutPerMillion: 2.2,
159
+ model: "glm-4.6", // Released Sept 2025
160
+ tokenCostInPerMillion: 0.3, // Updated: price cuts
161
+ tokenCostOutPerMillion: 0.9,
136
162
  },
137
163
  [ModelAlias.ZAI_GLM_4_5]: {
138
164
  provider: "zhipu",
139
165
  model: "glm-4.5",
140
- tokenCostInPerMillion: 0.6,
141
- tokenCostOutPerMillion: 2.2,
166
+ tokenCostInPerMillion: 0.11, // Updated: aggressive pricing
167
+ tokenCostOutPerMillion: 0.28,
142
168
  },
143
169
  [ModelAlias.ZAI_GLM_4_5_AIR]: {
144
170
  provider: "zhipu",
145
- model: "glm-4.5-air",
146
- tokenCostInPerMillion: 0.2,
147
- tokenCostOutPerMillion: 1.1,
171
+ model: "glm-4.5-air", // Lightweight variant
172
+ tokenCostInPerMillion: 0.05,
173
+ tokenCostOutPerMillion: 0.15,
148
174
  },
149
175
 
150
- // Anthropic
151
- // current (Claude 4.5 / 4.1)
176
+ // ─── Anthropic ───
177
+ // Claude Opus 4.5 released Nov 24, 2025
178
+ [ModelAlias.ANTHROPIC_OPUS_4_5]: {
179
+ provider: "anthropic",
180
+ model: "claude-opus-4-5-20251101", // Current flagship
181
+ tokenCostInPerMillion: 5.0, // Significant reduction from Opus 4.1
182
+ tokenCostOutPerMillion: 25.0,
183
+ },
152
184
  [ModelAlias.ANTHROPIC_SONNET_4_5]: {
153
185
  provider: "anthropic",
154
- model: "claude-sonnet-4-5-20250929", // Use actual model ID
186
+ model: "claude-sonnet-4-5-20250929",
155
187
  tokenCostInPerMillion: 3.0,
156
188
  tokenCostOutPerMillion: 15.0,
157
189
  },
158
190
  [ModelAlias.ANTHROPIC_HAIKU_4_5]: {
159
191
  provider: "anthropic",
160
- model: "claude-haiku-4-5-20250929", // Use actual model ID
161
- tokenCostInPerMillion: 0.25, // Correct pricing
162
- tokenCostOutPerMillion: 1.25, // Correct pricing
192
+ model: "claude-haiku-4-5-20251001",
193
+ tokenCostInPerMillion: 1.0, // Updated from 0.25
194
+ tokenCostOutPerMillion: 5.0, // Updated from 1.25
163
195
  },
164
196
  [ModelAlias.ANTHROPIC_OPUS_4_1]: {
165
197
  provider: "anthropic",
166
- model: "claude-opus-4-1-20240229", // Use actual model ID
198
+ model: "claude-opus-4-1-20250805", // Legacy, still available
167
199
  tokenCostInPerMillion: 15.0,
168
200
  tokenCostOutPerMillion: 75.0,
169
201
  },
@@ -175,10 +207,10 @@ export const VALID_MODEL_ALIASES = new Set(Object.keys(MODEL_CONFIG));
175
207
  // Default model alias for each provider (used when no model specified)
176
208
  export const DEFAULT_MODEL_BY_PROVIDER = Object.freeze({
177
209
  deepseek: ModelAlias.DEEPSEEK_CHAT,
178
- openai: ModelAlias.OPENAI_GPT_5,
179
- gemini: ModelAlias.GEMINI_2_5_FLASH,
210
+ openai: ModelAlias.OPENAI_GPT_5_2, // Updated: GPT-5.2 is new default
211
+ gemini: ModelAlias.GEMINI_3_FLASH, // Updated: Gemini 3 Flash is new default
180
212
  zhipu: ModelAlias.ZAI_GLM_4_6,
181
- anthropic: ModelAlias.ANTHROPIC_SONNET_4_5,
213
+ anthropic: ModelAlias.ANTHROPIC_OPUS_4_5, // Updated: Opus 4.5 available at better price
182
214
  });
183
215
 
184
216
  /**
@@ -245,7 +277,7 @@ export function buildProviderFunctionsIndex() {
245
277
 
246
278
  /**
247
279
  * Pre-built provider functions index for convenience.
248
- * Uses dotted style: llm.anthropic.sonnet45, llm.openai.gpt5, etc.
280
+ * Uses dotted style: llm.anthropic.opus45, llm.openai.gpt52, etc.
249
281
  */
250
282
  export const PROVIDER_FUNCTIONS = buildProviderFunctionsIndex();
251
283
 
@@ -39,9 +39,12 @@ function resolveWithBase(rootDir, maybePath) {
39
39
  }
40
40
 
41
41
  function normalizeRegistryEntry(slug, entry, rootDir) {
42
+ // Support both pipelinePath (legacy) and pipelineJsonPath fields
42
43
  const pipelineJsonPath = entry?.pipelineJsonPath
43
44
  ? resolveWithBase(rootDir, entry.pipelineJsonPath)
44
- : undefined;
45
+ : entry?.pipelinePath
46
+ ? resolveWithBase(rootDir, entry.pipelinePath)
47
+ : undefined;
45
48
 
46
49
  const configDir = entry?.configDir
47
50
  ? resolveWithBase(rootDir, entry.configDir)