@portel/photon 1.18.0 → 1.19.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.
- package/dist/auto-ui/beam.d.ts.map +1 -1
- package/dist/auto-ui/beam.js +14 -4
- package/dist/auto-ui/beam.js.map +1 -1
- package/dist/beam-form.bundle.js +5 -3
- package/dist/beam-form.bundle.js.map +2 -2
- package/dist/beam.bundle.js +686 -30
- package/dist/beam.bundle.js.map +3 -3
- package/dist/claude-code-plugin.js +1 -1
- package/dist/cli/commands/beam.d.ts.map +1 -1
- package/dist/cli/commands/beam.js +8 -2
- package/dist/cli/commands/beam.js.map +1 -1
- package/dist/cli/commands/changelog.d.ts +9 -0
- package/dist/cli/commands/changelog.d.ts.map +1 -0
- package/dist/cli/commands/changelog.js +133 -0
- package/dist/cli/commands/changelog.js.map +1 -0
- package/dist/cli/commands/maker.d.ts.map +1 -1
- package/dist/cli/commands/maker.js +23 -2
- package/dist/cli/commands/maker.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +53 -0
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/package.d.ts.map +1 -1
- package/dist/cli/commands/package.js +18 -2
- package/dist/cli/commands/package.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +1 -0
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/update.d.ts +3 -2
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +50 -43
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +16 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli-alias.js +1 -1
- package/dist/cli-alias.js.map +1 -1
- package/dist/context-store.d.ts +23 -33
- package/dist/context-store.d.ts.map +1 -1
- package/dist/context-store.js +147 -97
- package/dist/context-store.js.map +1 -1
- package/dist/context.d.ts +15 -10
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +37 -13
- package/dist/context.js.map +1 -1
- package/dist/daemon/server.js +4 -2
- package/dist/daemon/server.js.map +1 -1
- package/dist/data-migration.d.ts +27 -0
- package/dist/data-migration.d.ts.map +1 -0
- package/dist/data-migration.js +307 -0
- package/dist/data-migration.js.map +1 -0
- package/dist/editor-support/docblock-tag-catalog.d.ts.map +1 -1
- package/dist/editor-support/docblock-tag-catalog.js +6 -0
- package/dist/editor-support/docblock-tag-catalog.js.map +1 -1
- package/dist/loader.d.ts +10 -0
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +97 -12
- package/dist/loader.js.map +1 -1
- package/dist/marketplace-manager.d.ts.map +1 -1
- package/dist/marketplace-manager.js +25 -5
- package/dist/marketplace-manager.js.map +1 -1
- package/dist/photon-cli-runner.d.ts.map +1 -1
- package/dist/photon-cli-runner.js +47 -21
- package/dist/photon-cli-runner.js.map +1 -1
- package/dist/photon-doc-extractor.d.ts +1 -0
- package/dist/photon-doc-extractor.d.ts.map +1 -1
- package/dist/photon-doc-extractor.js +6 -0
- package/dist/photon-doc-extractor.js.map +1 -1
- package/dist/readme-syncer.d.ts.map +1 -1
- package/dist/readme-syncer.js +6 -1
- package/dist/readme-syncer.js.map +1 -1
- package/dist/server.d.ts +40 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +143 -28
- package/dist/server.js.map +1 -1
- package/dist/shared/audit.js +4 -4
- package/dist/shared/audit.js.map +1 -1
- package/dist/tasks/store.d.ts.map +1 -1
- package/dist/tasks/store.js +6 -2
- package/dist/tasks/store.js.map +1 -1
- package/dist/version-notify.d.ts +27 -0
- package/dist/version-notify.d.ts.map +1 -0
- package/dist/version-notify.js +142 -0
- package/dist/version-notify.js.map +1 -0
- package/package.json +2 -2
- package/dist/auto-ui/bridge/openai-shim.d.ts +0 -20
- package/dist/auto-ui/bridge/openai-shim.d.ts.map +0 -1
- package/dist/auto-ui/bridge/openai-shim.js +0 -231
- package/dist/auto-ui/bridge/openai-shim.js.map +0 -1
- package/dist/auto-ui/bridge/photon-app.d.ts +0 -162
- package/dist/auto-ui/bridge/photon-app.d.ts.map +0 -1
- package/dist/auto-ui/bridge/photon-app.js +0 -460
- package/dist/auto-ui/bridge/photon-app.js.map +0 -1
- package/dist/auto-ui/daemon-tools.d.ts +0 -45
- package/dist/auto-ui/daemon-tools.d.ts.map +0 -1
- package/dist/auto-ui/daemon-tools.js +0 -581
- package/dist/auto-ui/daemon-tools.js.map +0 -1
- package/dist/auto-ui/design-system/index.d.ts +0 -21
- package/dist/auto-ui/design-system/index.d.ts.map +0 -1
- package/dist/auto-ui/design-system/index.js +0 -27
- package/dist/auto-ui/design-system/index.js.map +0 -1
- package/dist/auto-ui/design-system/transaction-ui.d.ts +0 -70
- package/dist/auto-ui/design-system/transaction-ui.d.ts.map +0 -1
- package/dist/auto-ui/design-system/transaction-ui.js +0 -982
- package/dist/auto-ui/design-system/transaction-ui.js.map +0 -1
- package/dist/auto-ui/playground-server.d.ts +0 -7
- package/dist/auto-ui/playground-server.d.ts.map +0 -1
- package/dist/auto-ui/playground-server.js +0 -840
- package/dist/auto-ui/playground-server.js.map +0 -1
- package/dist/auto-ui/rendering/components.d.ts +0 -29
- package/dist/auto-ui/rendering/components.d.ts.map +0 -1
- package/dist/auto-ui/rendering/components.js +0 -1341
- package/dist/auto-ui/rendering/components.js.map +0 -1
- package/dist/auto-ui/rendering/field-analyzer.d.ts +0 -104
- package/dist/auto-ui/rendering/field-analyzer.d.ts.map +0 -1
- package/dist/auto-ui/rendering/field-analyzer.js +0 -447
- package/dist/auto-ui/rendering/field-analyzer.js.map +0 -1
- package/dist/auto-ui/rendering/field-renderers.d.ts +0 -64
- package/dist/auto-ui/rendering/field-renderers.d.ts.map +0 -1
- package/dist/auto-ui/rendering/field-renderers.js +0 -317
- package/dist/auto-ui/rendering/field-renderers.js.map +0 -1
- package/dist/auto-ui/rendering/index.d.ts +0 -28
- package/dist/auto-ui/rendering/index.d.ts.map +0 -1
- package/dist/auto-ui/rendering/index.js +0 -60
- package/dist/auto-ui/rendering/index.js.map +0 -1
- package/dist/auto-ui/rendering/layout-selector.d.ts +0 -60
- package/dist/auto-ui/rendering/layout-selector.d.ts.map +0 -1
- package/dist/auto-ui/rendering/layout-selector.js +0 -476
- package/dist/auto-ui/rendering/layout-selector.js.map +0 -1
- package/dist/markdown-utils.d.ts +0 -8
- package/dist/markdown-utils.d.ts.map +0 -1
- package/dist/markdown-utils.js +0 -64
- package/dist/markdown-utils.js.map +0 -1
- package/dist/mcp-client.d.ts +0 -9
- package/dist/mcp-client.d.ts.map +0 -1
- package/dist/mcp-client.js +0 -11
- package/dist/mcp-client.js.map +0 -1
- package/dist/mcp-elicitation.d.ts +0 -32
- package/dist/mcp-elicitation.d.ts.map +0 -1
- package/dist/mcp-elicitation.js +0 -26
- package/dist/mcp-elicitation.js.map +0 -1
- package/dist/photons/builder-compass.photon.d.ts +0 -167
- package/dist/photons/builder-compass.photon.d.ts.map +0 -1
- package/dist/photons/builder-compass.photon.js +0 -816
- package/dist/photons/builder-compass.photon.js.map +0 -1
- package/dist/photons/builder-compass.photon.ts +0 -1129
- package/dist/photons/docs/ui/docs.html +0 -441
- package/dist/photons/docs.photon.d.ts +0 -237
- package/dist/photons/docs.photon.d.ts.map +0 -1
- package/dist/photons/docs.photon.js +0 -483
- package/dist/photons/docs.photon.js.map +0 -1
- package/dist/photons/docs.photon.ts +0 -536
- package/dist/photons/slides.photon.d.ts +0 -212
- package/dist/photons/slides.photon.d.ts.map +0 -1
- package/dist/photons/slides.photon.js +0 -355
- package/dist/photons/slides.photon.js.map +0 -1
- package/dist/photons/slides.photon.ts +0 -370
- package/dist/photons/spreadsheet/ui/spreadsheet.html +0 -779
- package/dist/photons/spreadsheet.photon.d.ts +0 -554
- package/dist/photons/spreadsheet.photon.d.ts.map +0 -1
- package/dist/photons/spreadsheet.photon.js +0 -1050
- package/dist/photons/spreadsheet.photon.js.map +0 -1
- package/dist/photons/spreadsheet.photon.ts +0 -1239
- package/dist/photons/ui/builder-compass.html +0 -1199
- package/dist/photons/ui/builder-compass.photon.html +0 -380
- package/dist/security-scanner.d.ts +0 -52
- package/dist/security-scanner.d.ts.map +0 -1
- package/dist/security-scanner.js +0 -181
- package/dist/security-scanner.js.map +0 -1
- package/dist/shared/performance.d.ts +0 -65
- package/dist/shared/performance.d.ts.map +0 -1
- package/dist/shared/performance.js +0 -136
- package/dist/shared/performance.js.map +0 -1
|
@@ -1,476 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Layout Selector - Auto-detect best layout for data
|
|
3
|
-
*
|
|
4
|
-
* Determines the optimal component/layout to render data based on:
|
|
5
|
-
* 1. Explicit @format annotation (highest priority)
|
|
6
|
-
* 2. Data shape (array vs object vs primitive)
|
|
7
|
-
* 3. Data content (has images -> grid, charts -> chart, etc.)
|
|
8
|
-
*/
|
|
9
|
-
import { isChartShaped, isMetricShaped, isGaugeShaped, isTimelineShaped, isDashboardShaped, isCartShaped, } from './field-analyzer.js';
|
|
10
|
-
// Map legacy @format values to new layout types
|
|
11
|
-
const FORMAT_TO_LAYOUT = {
|
|
12
|
-
table: 'list', // table -> list (smart rendering)
|
|
13
|
-
list: 'list',
|
|
14
|
-
grid: 'grid',
|
|
15
|
-
card: 'card',
|
|
16
|
-
kv: 'kv',
|
|
17
|
-
tree: 'tree',
|
|
18
|
-
json: 'json',
|
|
19
|
-
markdown: 'markdown',
|
|
20
|
-
mermaid: 'mermaid',
|
|
21
|
-
code: 'code',
|
|
22
|
-
text: 'text',
|
|
23
|
-
primitive: 'text',
|
|
24
|
-
chips: 'chips',
|
|
25
|
-
html: 'html',
|
|
26
|
-
chart: 'chart',
|
|
27
|
-
metric: 'metric',
|
|
28
|
-
gauge: 'gauge',
|
|
29
|
-
timeline: 'timeline',
|
|
30
|
-
dashboard: 'dashboard',
|
|
31
|
-
cart: 'cart',
|
|
32
|
-
panels: 'panels',
|
|
33
|
-
tabs: 'tabs',
|
|
34
|
-
accordion: 'accordion',
|
|
35
|
-
stack: 'stack',
|
|
36
|
-
columns: 'columns',
|
|
37
|
-
};
|
|
38
|
-
/**
|
|
39
|
-
* Select the best layout type for given data
|
|
40
|
-
*/
|
|
41
|
-
export function selectLayout(data, format, hints) {
|
|
42
|
-
// 1. Explicit format takes precedence (backward compat)
|
|
43
|
-
if (format) {
|
|
44
|
-
// Handle code:language format
|
|
45
|
-
if (format.startsWith('code:'))
|
|
46
|
-
return 'code';
|
|
47
|
-
// Handle chart:subtype format (e.g., chart:bar, chart:pie)
|
|
48
|
-
if (format.startsWith('chart:'))
|
|
49
|
-
return 'chart';
|
|
50
|
-
const layout = FORMAT_TO_LAYOUT[format] || 'json';
|
|
51
|
-
// Smart fallback: if list/table format but data is not an array, use card
|
|
52
|
-
if ((layout === 'list' || format === 'table') &&
|
|
53
|
-
!Array.isArray(data) &&
|
|
54
|
-
typeof data === 'object' &&
|
|
55
|
-
data !== null) {
|
|
56
|
-
return 'card';
|
|
57
|
-
}
|
|
58
|
-
return layout;
|
|
59
|
-
}
|
|
60
|
-
// 2. Null/undefined
|
|
61
|
-
if (data === null || data === undefined) {
|
|
62
|
-
return 'text';
|
|
63
|
-
}
|
|
64
|
-
// 3. Primitives
|
|
65
|
-
if (typeof data === 'string') {
|
|
66
|
-
// Check if it looks like markdown
|
|
67
|
-
if (hasMarkdownSyntax(data))
|
|
68
|
-
return 'markdown';
|
|
69
|
-
// Check if it looks like mermaid
|
|
70
|
-
if (data.trim().startsWith('graph ') || data.trim().startsWith('flowchart ')) {
|
|
71
|
-
return 'mermaid';
|
|
72
|
-
}
|
|
73
|
-
return 'text';
|
|
74
|
-
}
|
|
75
|
-
if (typeof data === 'number' || typeof data === 'boolean') {
|
|
76
|
-
return 'text';
|
|
77
|
-
}
|
|
78
|
-
// 4. Arrays
|
|
79
|
-
if (Array.isArray(data)) {
|
|
80
|
-
if (data.length === 0)
|
|
81
|
-
return 'text'; // Empty array
|
|
82
|
-
const first = data[0];
|
|
83
|
-
// Array of strings -> chips
|
|
84
|
-
if (typeof first === 'string') {
|
|
85
|
-
return 'chips';
|
|
86
|
-
}
|
|
87
|
-
// Array of objects
|
|
88
|
-
if (typeof first === 'object' && first !== null) {
|
|
89
|
-
// Check if cart-shaped (before image/timeline — more specific)
|
|
90
|
-
if (isCartShaped(data)) {
|
|
91
|
-
return 'cart';
|
|
92
|
-
}
|
|
93
|
-
// Check if items have image fields -> grid
|
|
94
|
-
if (hasImageFields(first)) {
|
|
95
|
-
return 'grid';
|
|
96
|
-
}
|
|
97
|
-
// Check if timeline-shaped (before chart — more specific)
|
|
98
|
-
if (isTimelineShaped(data)) {
|
|
99
|
-
return 'timeline';
|
|
100
|
-
}
|
|
101
|
-
// Check if chart-shaped (date+numbers or label+value pairs)
|
|
102
|
-
if (isChartShaped(data)) {
|
|
103
|
-
return 'chart';
|
|
104
|
-
}
|
|
105
|
-
// Default: list
|
|
106
|
-
return 'list';
|
|
107
|
-
}
|
|
108
|
-
// Mixed or primitive arrays
|
|
109
|
-
return 'chips';
|
|
110
|
-
}
|
|
111
|
-
// 5. Objects
|
|
112
|
-
if (typeof data === 'object') {
|
|
113
|
-
// Check for special fields
|
|
114
|
-
if ('diagram' in data && typeof data.diagram === 'string') {
|
|
115
|
-
return 'mermaid';
|
|
116
|
-
}
|
|
117
|
-
// Check if cart-shaped (items array with price+quantity)
|
|
118
|
-
if (isCartShaped(data)) {
|
|
119
|
-
return 'cart';
|
|
120
|
-
}
|
|
121
|
-
// Check if gauge-shaped (value + max/min or progress)
|
|
122
|
-
if (isGaugeShaped(data)) {
|
|
123
|
-
return 'gauge';
|
|
124
|
-
}
|
|
125
|
-
// Check if metric-shaped (single numeric + label)
|
|
126
|
-
if (isMetricShaped(data)) {
|
|
127
|
-
return 'metric';
|
|
128
|
-
}
|
|
129
|
-
// Check if dashboard-shaped (mix of arrays, objects, metrics)
|
|
130
|
-
if (isDashboardShaped(data)) {
|
|
131
|
-
return 'dashboard';
|
|
132
|
-
}
|
|
133
|
-
// Check if deeply nested -> tree
|
|
134
|
-
if (isNested(data)) {
|
|
135
|
-
return 'tree';
|
|
136
|
-
}
|
|
137
|
-
// Flat object -> card (or kv for many fields)
|
|
138
|
-
const fieldCount = Object.keys(data).length;
|
|
139
|
-
if (fieldCount > 10) {
|
|
140
|
-
return 'kv'; // Too many fields for card
|
|
141
|
-
}
|
|
142
|
-
return 'card';
|
|
143
|
-
}
|
|
144
|
-
// Fallback
|
|
145
|
-
return 'json';
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Check if object has fields that look like actual images (not just icon characters)
|
|
149
|
-
* We need to verify the VALUE looks like an image URL, not just the field name
|
|
150
|
-
*/
|
|
151
|
-
export function hasImageFields(obj) {
|
|
152
|
-
const imageFieldNames = /^(image|photo|thumbnail|picture|poster|cover)$/i;
|
|
153
|
-
const avatarFieldName = /^(avatar)$/i;
|
|
154
|
-
const imageUrlPattern = /\.(jpg|jpeg|png|gif|webp|svg)(\?.*)?$/i;
|
|
155
|
-
const dataUrlPattern = /^data:image\//i;
|
|
156
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
157
|
-
// Skip non-string values
|
|
158
|
-
if (typeof value !== 'string')
|
|
159
|
-
continue;
|
|
160
|
-
// Check for image URL patterns in value
|
|
161
|
-
if (imageUrlPattern.test(value) || dataUrlPattern.test(value))
|
|
162
|
-
return true;
|
|
163
|
-
// For image field names (not avatar), check if value looks like a URL
|
|
164
|
-
if (imageFieldNames.test(key) && (value.startsWith('http') || value.startsWith('/'))) {
|
|
165
|
-
return true;
|
|
166
|
-
}
|
|
167
|
-
// For avatar fields specifically, only treat as image if it's actually a URL
|
|
168
|
-
// Single characters or short strings are icons, not images
|
|
169
|
-
if (avatarFieldName.test(key) &&
|
|
170
|
-
value.length > 10 &&
|
|
171
|
-
(value.startsWith('http') || value.startsWith('/'))) {
|
|
172
|
-
return true;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
return false;
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Check if object is nested (has object/array values)
|
|
179
|
-
*/
|
|
180
|
-
export function isNested(obj, depth = 0) {
|
|
181
|
-
if (depth > 2)
|
|
182
|
-
return true; // Max depth check
|
|
183
|
-
for (const value of Object.values(obj)) {
|
|
184
|
-
if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'object') {
|
|
185
|
-
return true;
|
|
186
|
-
}
|
|
187
|
-
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
188
|
-
if (isNested(value, depth + 1))
|
|
189
|
-
return true;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return false;
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Check if string contains markdown syntax
|
|
196
|
-
*/
|
|
197
|
-
export function hasMarkdownSyntax(text) {
|
|
198
|
-
// Check for common markdown patterns
|
|
199
|
-
const patterns = [
|
|
200
|
-
/^#{1,6}\s/m, // Headers
|
|
201
|
-
/\*\*[^*]+\*\*/, // Bold
|
|
202
|
-
/\*[^*]+\*/, // Italic
|
|
203
|
-
/\[[^\]]+\]\([^)]+\)/, // Links
|
|
204
|
-
/```[\s\S]*```/, // Code blocks
|
|
205
|
-
/^\s*[-*+]\s/m, // Lists
|
|
206
|
-
/^\s*\d+\.\s/m, // Numbered lists
|
|
207
|
-
];
|
|
208
|
-
return patterns.some((p) => p.test(text));
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Parse layout hints from nested JSDoc syntax
|
|
212
|
-
* Example: {@title name, @subtitle email, @style inset}
|
|
213
|
-
*/
|
|
214
|
-
export function parseLayoutHints(hintsString) {
|
|
215
|
-
const hints = {};
|
|
216
|
-
if (!hintsString)
|
|
217
|
-
return hints;
|
|
218
|
-
// Split by comma and parse each hint
|
|
219
|
-
const parts = hintsString.split(',').map((s) => s.trim());
|
|
220
|
-
for (const part of parts) {
|
|
221
|
-
// Match @key value or @key value:renderer
|
|
222
|
-
const match = part.match(/@(\w+)\s+([^:]+)(?::(\w+))?/);
|
|
223
|
-
if (match) {
|
|
224
|
-
const [, key, value, renderer] = match;
|
|
225
|
-
const cleanValue = value.trim();
|
|
226
|
-
switch (key) {
|
|
227
|
-
case 'title':
|
|
228
|
-
hints.title = cleanValue;
|
|
229
|
-
break;
|
|
230
|
-
case 'subtitle':
|
|
231
|
-
hints.subtitle = cleanValue;
|
|
232
|
-
break;
|
|
233
|
-
case 'icon':
|
|
234
|
-
hints.icon = cleanValue;
|
|
235
|
-
break;
|
|
236
|
-
case 'badge':
|
|
237
|
-
hints.badge = cleanValue;
|
|
238
|
-
break;
|
|
239
|
-
case 'detail':
|
|
240
|
-
hints.detail = cleanValue;
|
|
241
|
-
break;
|
|
242
|
-
case 'image':
|
|
243
|
-
hints.image = cleanValue;
|
|
244
|
-
break;
|
|
245
|
-
case 'style':
|
|
246
|
-
hints.style = cleanValue;
|
|
247
|
-
break;
|
|
248
|
-
case 'accessory':
|
|
249
|
-
hints.accessory = cleanValue;
|
|
250
|
-
break;
|
|
251
|
-
case 'columns':
|
|
252
|
-
hints.columns = parseInt(cleanValue, 10);
|
|
253
|
-
break;
|
|
254
|
-
case 'fields':
|
|
255
|
-
hints.fields = cleanValue.split(/\s+/);
|
|
256
|
-
break;
|
|
257
|
-
// Chart hints
|
|
258
|
-
case 'label':
|
|
259
|
-
hints.label = cleanValue;
|
|
260
|
-
break;
|
|
261
|
-
case 'value':
|
|
262
|
-
hints.value = cleanValue;
|
|
263
|
-
break;
|
|
264
|
-
case 'x':
|
|
265
|
-
hints.x = cleanValue;
|
|
266
|
-
break;
|
|
267
|
-
case 'y':
|
|
268
|
-
hints.y = cleanValue;
|
|
269
|
-
break;
|
|
270
|
-
case 'series':
|
|
271
|
-
hints.series = cleanValue;
|
|
272
|
-
break;
|
|
273
|
-
case 'chartType':
|
|
274
|
-
hints.chartType = cleanValue;
|
|
275
|
-
break;
|
|
276
|
-
// Gauge hints
|
|
277
|
-
case 'min':
|
|
278
|
-
hints.min = parseFloat(cleanValue);
|
|
279
|
-
break;
|
|
280
|
-
case 'max':
|
|
281
|
-
hints.max = parseFloat(cleanValue);
|
|
282
|
-
break;
|
|
283
|
-
// Timeline hints
|
|
284
|
-
case 'date':
|
|
285
|
-
hints.date = cleanValue;
|
|
286
|
-
break;
|
|
287
|
-
case 'description':
|
|
288
|
-
hints.description = cleanValue;
|
|
289
|
-
break;
|
|
290
|
-
// Dashboard/grouping hints
|
|
291
|
-
case 'group':
|
|
292
|
-
hints.group = cleanValue;
|
|
293
|
-
break;
|
|
294
|
-
// Composable container hints
|
|
295
|
-
case 'inner':
|
|
296
|
-
hints.inner = cleanValue;
|
|
297
|
-
break;
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
return hints;
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* Generate JavaScript code for layout selector (to embed in HTML)
|
|
305
|
-
*/
|
|
306
|
-
export function generateLayoutSelectorJS() {
|
|
307
|
-
return `
|
|
308
|
-
// Layout Selector - Auto-detect best layout for data
|
|
309
|
-
const FORMAT_TO_LAYOUT = {
|
|
310
|
-
'table': 'list',
|
|
311
|
-
'list': 'list',
|
|
312
|
-
'grid': 'grid',
|
|
313
|
-
'card': 'card',
|
|
314
|
-
'kv': 'kv',
|
|
315
|
-
'tree': 'tree',
|
|
316
|
-
'json': 'json',
|
|
317
|
-
'markdown': 'markdown',
|
|
318
|
-
'mermaid': 'mermaid',
|
|
319
|
-
'code': 'code',
|
|
320
|
-
'text': 'text',
|
|
321
|
-
'primitive': 'text',
|
|
322
|
-
'chips': 'chips',
|
|
323
|
-
'html': 'html',
|
|
324
|
-
'chart': 'chart',
|
|
325
|
-
'metric': 'metric',
|
|
326
|
-
'gauge': 'gauge',
|
|
327
|
-
'timeline': 'timeline',
|
|
328
|
-
'dashboard': 'dashboard',
|
|
329
|
-
'cart': 'cart',
|
|
330
|
-
'panels': 'panels',
|
|
331
|
-
'tabs': 'tabs',
|
|
332
|
-
'accordion': 'accordion',
|
|
333
|
-
'stack': 'stack',
|
|
334
|
-
'columns': 'columns',
|
|
335
|
-
};
|
|
336
|
-
|
|
337
|
-
function selectLayout(data, format, hints) {
|
|
338
|
-
if (format) {
|
|
339
|
-
if (format.startsWith('code:')) return 'code';
|
|
340
|
-
if (format.startsWith('chart:')) return 'chart';
|
|
341
|
-
var layout = FORMAT_TO_LAYOUT[format] || 'json';
|
|
342
|
-
// Smart fallback: if list/table format but data is not an array, use card
|
|
343
|
-
if ((layout === 'list' || format === 'table') && !Array.isArray(data) && typeof data === 'object' && data !== null) {
|
|
344
|
-
return 'card';
|
|
345
|
-
}
|
|
346
|
-
return layout;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
if (data === null || data === undefined) return 'text';
|
|
350
|
-
|
|
351
|
-
if (typeof data === 'string') {
|
|
352
|
-
if (hasMarkdownSyntax(data)) return 'markdown';
|
|
353
|
-
if (data.trim().startsWith('graph ') || data.trim().startsWith('flowchart ')) {
|
|
354
|
-
return 'mermaid';
|
|
355
|
-
}
|
|
356
|
-
return 'text';
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
if (typeof data === 'number' || typeof data === 'boolean') return 'text';
|
|
360
|
-
|
|
361
|
-
if (Array.isArray(data)) {
|
|
362
|
-
if (data.length === 0) return 'text';
|
|
363
|
-
const first = data[0];
|
|
364
|
-
if (typeof first === 'string') return 'chips';
|
|
365
|
-
if (typeof first === 'object' && first !== null) {
|
|
366
|
-
if (isCartShaped(data)) return 'cart';
|
|
367
|
-
if (hasImageFields(first)) return 'grid';
|
|
368
|
-
return 'list';
|
|
369
|
-
}
|
|
370
|
-
return 'chips';
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
if (typeof data === 'object') {
|
|
374
|
-
if ('diagram' in data && typeof data.diagram === 'string') return 'mermaid';
|
|
375
|
-
if (isCartShaped(data)) return 'cart';
|
|
376
|
-
if (isNested(data)) return 'tree';
|
|
377
|
-
const fieldCount = Object.keys(data).length;
|
|
378
|
-
if (fieldCount > 10) return 'kv';
|
|
379
|
-
return 'card';
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
return 'json';
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
function hasImageFields(obj) {
|
|
386
|
-
const imageFieldNames = /^(image|photo|thumbnail|picture|poster|cover)$/i;
|
|
387
|
-
const avatarFieldName = /^(avatar)$/i;
|
|
388
|
-
const imageUrlPattern = /\\.(jpg|jpeg|png|gif|webp|svg)(\\?.*)?$/i;
|
|
389
|
-
const dataUrlPattern = /^data:image\\//i;
|
|
390
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
391
|
-
if (typeof value !== 'string') continue;
|
|
392
|
-
if (imageUrlPattern.test(value) || dataUrlPattern.test(value)) return true;
|
|
393
|
-
if (imageFieldNames.test(key) && (value.startsWith('http') || value.startsWith('/'))) return true;
|
|
394
|
-
if (avatarFieldName.test(key) && value.length > 10 && (value.startsWith('http') || value.startsWith('/'))) return true;
|
|
395
|
-
}
|
|
396
|
-
return false;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
function isNested(obj, depth = 0) {
|
|
400
|
-
if (depth > 2) return true;
|
|
401
|
-
for (const value of Object.values(obj)) {
|
|
402
|
-
if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'object') return true;
|
|
403
|
-
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
404
|
-
if (isNested(value, depth + 1)) return true;
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
return false;
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
function hasMarkdownSyntax(text) {
|
|
411
|
-
const patterns = [
|
|
412
|
-
/^#{1,6}\\s/m,
|
|
413
|
-
/\\*\\*[^*]+\\*\\*/,
|
|
414
|
-
/\\*[^*]+\\*/,
|
|
415
|
-
/\\[[^\\]]+\\]\\([^)]+\\)/,
|
|
416
|
-
/\`\`\`[\\s\\S]*\`\`\`/,
|
|
417
|
-
/^\\s*[-*+]\\s/m,
|
|
418
|
-
/^\\s*\\d+\\.\\s/m,
|
|
419
|
-
];
|
|
420
|
-
return patterns.some(p => p.test(text));
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
function parseLayoutHints(hintsString) {
|
|
424
|
-
const hints = {};
|
|
425
|
-
if (!hintsString) return hints;
|
|
426
|
-
const parts = hintsString.split(',').map(s => s.trim());
|
|
427
|
-
for (const part of parts) {
|
|
428
|
-
const match = part.match(/@(\\w+)\\s+([^:]+)(?::(\\w+))?/);
|
|
429
|
-
if (match) {
|
|
430
|
-
const [, key, value, renderer] = match;
|
|
431
|
-
const cleanValue = value.trim();
|
|
432
|
-
switch (key) {
|
|
433
|
-
case 'title': hints.title = cleanValue; break;
|
|
434
|
-
case 'subtitle': hints.subtitle = cleanValue; break;
|
|
435
|
-
case 'icon': hints.icon = cleanValue; break;
|
|
436
|
-
case 'badge': hints.badge = cleanValue; break;
|
|
437
|
-
case 'detail': hints.detail = cleanValue; break;
|
|
438
|
-
case 'image': hints.image = cleanValue; break;
|
|
439
|
-
case 'style': hints.style = cleanValue; break;
|
|
440
|
-
case 'accessory': hints.accessory = cleanValue; break;
|
|
441
|
-
case 'columns': hints.columns = parseInt(cleanValue, 10); break;
|
|
442
|
-
case 'fields': hints.fields = cleanValue.split(/\\s+/); break;
|
|
443
|
-
case 'label': hints.label = cleanValue; break;
|
|
444
|
-
case 'value': hints.value = cleanValue; break;
|
|
445
|
-
case 'x': hints.x = cleanValue; break;
|
|
446
|
-
case 'y': hints.y = cleanValue; break;
|
|
447
|
-
case 'series': hints.series = cleanValue; break;
|
|
448
|
-
case 'chartType': hints.chartType = cleanValue; break;
|
|
449
|
-
case 'min': hints.min = parseFloat(cleanValue); break;
|
|
450
|
-
case 'max': hints.max = parseFloat(cleanValue); break;
|
|
451
|
-
case 'date': hints.date = cleanValue; break;
|
|
452
|
-
case 'description': hints.description = cleanValue; break;
|
|
453
|
-
case 'group': hints.group = cleanValue; break;
|
|
454
|
-
case 'inner': hints.inner = cleanValue; break;
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
return hints;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
function isCartShaped(data) {
|
|
462
|
-
if (Array.isArray(data)) {
|
|
463
|
-
return data.length > 0 && data.every(function(item) {
|
|
464
|
-
return item && typeof item === 'object' && 'price' in item && ('quantity' in item || 'qty' in item);
|
|
465
|
-
});
|
|
466
|
-
}
|
|
467
|
-
if (data && typeof data === 'object' && data.items && Array.isArray(data.items)) {
|
|
468
|
-
return data.items.length > 0 && data.items.every(function(item) {
|
|
469
|
-
return item && typeof item === 'object' && 'price' in item && ('quantity' in item || 'qty' in item);
|
|
470
|
-
});
|
|
471
|
-
}
|
|
472
|
-
return false;
|
|
473
|
-
}
|
|
474
|
-
`;
|
|
475
|
-
}
|
|
476
|
-
//# sourceMappingURL=layout-selector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"layout-selector.js","sourceRoot":"","sources":["../../../src/auto-ui/rendering/layout-selector.ts"],"names":[],"mappings":"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"}
|
package/dist/markdown-utils.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Simple and safe markdown utilities for browser use
|
|
3
|
-
* Avoids complex regex that might cause escaping issues
|
|
4
|
-
*/
|
|
5
|
-
export declare function simpleMarkdownToHtml(markdown: string): string;
|
|
6
|
-
export declare function escapeHtml(text: string): string;
|
|
7
|
-
export declare const markdownUtilsScript = "\nfunction simpleMarkdownToHtml(markdown) {\n if (!markdown) return '';\n \n let html = markdown;\n \n // Escape HTML first\n const div = document.createElement('div');\n div.textContent = html;\n html = div.innerHTML;\n \n // Bold\n html = html.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>');\n html = html.replace(/__(.+?)__/g, '<strong>$1</strong>');\n \n // Italic\n html = html.replace(/\\*(.+?)\\*/g, '<em>$1</em>');\n html = html.replace(/_(.+?)_/g, '<em>$1</em>');\n \n // Code\n html = html.replace(/`([^`]+)`/g, '<code>$1</code>');\n \n // Links: simpler approach\n html = html.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '<a href=\"$2\" target=\"_blank\">$1</a>');\n \n // Line breaks\n html = html.replace(/\\n/g, '<br>');\n \n return html;\n}\n";
|
|
8
|
-
//# sourceMappingURL=markdown-utils.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-utils.d.ts","sourceRoot":"","sources":["../src/markdown-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwB7D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C;AAGD,eAAO,MAAM,mBAAmB,wxBA8B/B,CAAC"}
|
package/dist/markdown-utils.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Simple and safe markdown utilities for browser use
|
|
3
|
-
* Avoids complex regex that might cause escaping issues
|
|
4
|
-
*/
|
|
5
|
-
export function simpleMarkdownToHtml(markdown) {
|
|
6
|
-
if (!markdown)
|
|
7
|
-
return '';
|
|
8
|
-
// Security: escape HTML first to prevent XSS, then apply markdown formatting
|
|
9
|
-
let html = escapeHtml(markdown);
|
|
10
|
-
// Bold: **text** or __text__
|
|
11
|
-
html = html.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');
|
|
12
|
-
html = html.replace(/__(.+?)__/g, '<strong>$1</strong>');
|
|
13
|
-
// Italic: *text* or _text_
|
|
14
|
-
html = html.replace(/\*(.+?)\*/g, '<em>$1</em>');
|
|
15
|
-
html = html.replace(/_(.+?)_/g, '<em>$1</em>');
|
|
16
|
-
// Code: `code`
|
|
17
|
-
html = html.replace(/`([^`]+)`/g, '<code>$1</code>');
|
|
18
|
-
// Links: [text](url)
|
|
19
|
-
html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>');
|
|
20
|
-
// Line breaks
|
|
21
|
-
html = html.replace(/\n/g, '<br>');
|
|
22
|
-
return html;
|
|
23
|
-
}
|
|
24
|
-
export function escapeHtml(text) {
|
|
25
|
-
return text
|
|
26
|
-
.replace(/&/g, '&')
|
|
27
|
-
.replace(/</g, '<')
|
|
28
|
-
.replace(/>/g, '>')
|
|
29
|
-
.replace(/"/g, '"')
|
|
30
|
-
.replace(/'/g, ''');
|
|
31
|
-
}
|
|
32
|
-
// Export as string for embedding in HTML templates
|
|
33
|
-
export const markdownUtilsScript = `
|
|
34
|
-
function simpleMarkdownToHtml(markdown) {
|
|
35
|
-
if (!markdown) return '';
|
|
36
|
-
|
|
37
|
-
let html = markdown;
|
|
38
|
-
|
|
39
|
-
// Escape HTML first
|
|
40
|
-
const div = document.createElement('div');
|
|
41
|
-
div.textContent = html;
|
|
42
|
-
html = div.innerHTML;
|
|
43
|
-
|
|
44
|
-
// Bold
|
|
45
|
-
html = html.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>');
|
|
46
|
-
html = html.replace(/__(.+?)__/g, '<strong>$1</strong>');
|
|
47
|
-
|
|
48
|
-
// Italic
|
|
49
|
-
html = html.replace(/\\*(.+?)\\*/g, '<em>$1</em>');
|
|
50
|
-
html = html.replace(/_(.+?)_/g, '<em>$1</em>');
|
|
51
|
-
|
|
52
|
-
// Code
|
|
53
|
-
html = html.replace(/\`([^\`]+)\`/g, '<code>$1</code>');
|
|
54
|
-
|
|
55
|
-
// Links: simpler approach
|
|
56
|
-
html = html.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, '<a href="$2" target="_blank">$1</a>');
|
|
57
|
-
|
|
58
|
-
// Line breaks
|
|
59
|
-
html = html.replace(/\\n/g, '<br>');
|
|
60
|
-
|
|
61
|
-
return html;
|
|
62
|
-
}
|
|
63
|
-
`;
|
|
64
|
-
//# sourceMappingURL=markdown-utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-utils.js","sourceRoot":"","sources":["../src/markdown-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEzB,6EAA6E;IAC7E,IAAI,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEhC,6BAA6B;IAC7B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CAAC;IAC7D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IAEzD,2BAA2B;IAC3B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IACjD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAE/C,eAAe;IACf,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAErD,qBAAqB;IACrB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE,qCAAqC,CAAC,CAAC;IAEvF,cAAc;IACd,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEnC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,mDAAmD;AACnD,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BlC,CAAC"}
|
package/dist/mcp-client.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Client for Photon Runtime
|
|
3
|
-
*
|
|
4
|
-
* Re-exports from @portel/photon-core for backward compatibility.
|
|
5
|
-
* The SDK-based transport implementation is now in photon-core.
|
|
6
|
-
*/
|
|
7
|
-
export { SDKMCPTransport, SDKMCPClientFactory, loadMCPConfig, createSDKMCPClientFactory, resolveMCPSource, type MCPServerConfig, type MCPConfig, } from '@portel/photon-core';
|
|
8
|
-
export { SDKMCPTransport as StandaloneMCPTransport, SDKMCPClientFactory as StandaloneMCPClientFactory, createSDKMCPClientFactory as createStandaloneMCPClientFactory, } from '@portel/photon-core';
|
|
9
|
-
//# sourceMappingURL=mcp-client.d.ts.map
|
package/dist/mcp-client.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-client.d.ts","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,yBAAyB,EACzB,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,SAAS,GACf,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,eAAe,IAAI,sBAAsB,EACzC,mBAAmB,IAAI,0BAA0B,EACjD,yBAAyB,IAAI,gCAAgC,GAC9D,MAAM,qBAAqB,CAAC"}
|
package/dist/mcp-client.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Client for Photon Runtime
|
|
3
|
-
*
|
|
4
|
-
* Re-exports from @portel/photon-core for backward compatibility.
|
|
5
|
-
* The SDK-based transport implementation is now in photon-core.
|
|
6
|
-
*/
|
|
7
|
-
// Re-export everything from photon-core's SDK transport
|
|
8
|
-
export { SDKMCPTransport, SDKMCPClientFactory, loadMCPConfig, createSDKMCPClientFactory, resolveMCPSource, } from '@portel/photon-core';
|
|
9
|
-
// Backward compatibility aliases
|
|
10
|
-
export { SDKMCPTransport as StandaloneMCPTransport, SDKMCPClientFactory as StandaloneMCPClientFactory, createSDKMCPClientFactory as createStandaloneMCPClientFactory, } from '@portel/photon-core';
|
|
11
|
-
//# sourceMappingURL=mcp-client.js.map
|
package/dist/mcp-client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wDAAwD;AACxD,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,yBAAyB,EACzB,gBAAgB,GAGjB,MAAM,qBAAqB,CAAC;AAE7B,iCAAiC;AACjC,OAAO,EACL,eAAe,IAAI,sBAAsB,EACzC,mBAAmB,IAAI,0BAA0B,EACjD,yBAAyB,IAAI,gCAAgC,GAC9D,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Elicitation Support
|
|
3
|
-
*
|
|
4
|
-
* Maps Photon's yield-based asks to MCP's elicitation protocol.
|
|
5
|
-
*
|
|
6
|
-
* As of MCP SDK 1.25, elicitation is handled via:
|
|
7
|
-
* - Server.elicitInput() - Server requests user input from client
|
|
8
|
-
* - Client declares { elicitation: {} } capability during initialization
|
|
9
|
-
*
|
|
10
|
-
* The actual integration is in server.ts:
|
|
11
|
-
* - createMCPInputProvider() creates an input provider that uses elicitInput()
|
|
12
|
-
* - This is passed to loader.executeTool() for generator-based tools
|
|
13
|
-
*
|
|
14
|
-
* @see https://forgecode.dev/blog/mcp-spec-updates/
|
|
15
|
-
*/
|
|
16
|
-
import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
17
|
-
/**
|
|
18
|
-
* Check if a client supports MCP elicitation
|
|
19
|
-
*
|
|
20
|
-
* @param server - MCP server instance
|
|
21
|
-
* @returns true if client declared elicitation capability
|
|
22
|
-
*/
|
|
23
|
-
export declare function clientSupportsElicitation(server: Server): boolean;
|
|
24
|
-
/**
|
|
25
|
-
* Elicitation action type from MCP spec
|
|
26
|
-
*/
|
|
27
|
-
export type ElicitAction = 'accept' | 'decline' | 'cancel';
|
|
28
|
-
/**
|
|
29
|
-
* Re-export types for convenience
|
|
30
|
-
*/
|
|
31
|
-
export type { ElicitResult, ElicitRequestFormParams, ElicitRequestURLParams, } from '@modelcontextprotocol/sdk/types.js';
|
|
32
|
-
//# sourceMappingURL=mcp-elicitation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-elicitation.d.ts","sourceRoot":"","sources":["../src/mcp-elicitation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAExE;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGjE;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE3D;;GAEG;AACH,YAAY,EACV,YAAY,EACZ,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC"}
|
package/dist/mcp-elicitation.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Elicitation Support
|
|
3
|
-
*
|
|
4
|
-
* Maps Photon's yield-based asks to MCP's elicitation protocol.
|
|
5
|
-
*
|
|
6
|
-
* As of MCP SDK 1.25, elicitation is handled via:
|
|
7
|
-
* - Server.elicitInput() - Server requests user input from client
|
|
8
|
-
* - Client declares { elicitation: {} } capability during initialization
|
|
9
|
-
*
|
|
10
|
-
* The actual integration is in server.ts:
|
|
11
|
-
* - createMCPInputProvider() creates an input provider that uses elicitInput()
|
|
12
|
-
* - This is passed to loader.executeTool() for generator-based tools
|
|
13
|
-
*
|
|
14
|
-
* @see https://forgecode.dev/blog/mcp-spec-updates/
|
|
15
|
-
*/
|
|
16
|
-
/**
|
|
17
|
-
* Check if a client supports MCP elicitation
|
|
18
|
-
*
|
|
19
|
-
* @param server - MCP server instance
|
|
20
|
-
* @returns true if client declared elicitation capability
|
|
21
|
-
*/
|
|
22
|
-
export function clientSupportsElicitation(server) {
|
|
23
|
-
const capabilities = server.getClientCapabilities();
|
|
24
|
-
return !!capabilities?.elicitation;
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=mcp-elicitation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-elicitation.js","sourceRoot":"","sources":["../src/mcp-elicitation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAc;IACtD,MAAM,YAAY,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;IACpD,OAAO,CAAC,CAAE,YAAoB,EAAE,WAAW,CAAC;AAC9C,CAAC"}
|