@portel/photon-core 1.4.0 → 2.1.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/README.md +123 -0
- package/dist/auto-ui.d.ts +103 -0
- package/dist/auto-ui.d.ts.map +1 -0
- package/dist/auto-ui.js +275 -0
- package/dist/auto-ui.js.map +1 -0
- package/dist/base.d.ts +9 -2
- package/dist/base.d.ts.map +1 -1
- package/dist/base.js +23 -10
- package/dist/base.js.map +1 -1
- package/dist/cli-ui-renderer.d.ts +31 -0
- package/dist/cli-ui-renderer.d.ts.map +1 -0
- package/dist/cli-ui-renderer.js +224 -0
- package/dist/cli-ui-renderer.js.map +1 -0
- package/dist/dependency-manager.d.ts.map +1 -1
- package/dist/dependency-manager.js +0 -1
- package/dist/dependency-manager.js.map +1 -1
- package/dist/design-system/index.d.ts +21 -0
- package/dist/design-system/index.d.ts.map +1 -0
- package/dist/design-system/index.js +27 -0
- package/dist/design-system/index.js.map +1 -0
- package/dist/design-system/tokens.d.ts +149 -0
- package/dist/design-system/tokens.d.ts.map +1 -0
- package/dist/design-system/tokens.js +413 -0
- package/dist/design-system/tokens.js.map +1 -0
- package/dist/design-system/transaction-ui.d.ts +70 -0
- package/dist/design-system/transaction-ui.d.ts.map +1 -0
- package/dist/design-system/transaction-ui.js +982 -0
- package/dist/design-system/transaction-ui.js.map +1 -0
- package/dist/generator.d.ts +58 -8
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +9 -4
- package/dist/generator.js.map +1 -1
- package/dist/index.d.ts +10 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +48 -44
- package/dist/index.js.map +1 -1
- package/dist/io.d.ts +395 -0
- package/dist/io.d.ts.map +1 -0
- package/dist/io.js +304 -0
- package/dist/io.js.map +1 -0
- package/dist/path-resolver.d.ts.map +1 -1
- package/dist/path-resolver.js +2 -1
- package/dist/path-resolver.js.map +1 -1
- package/dist/rendering/components.d.ts +29 -0
- package/dist/rendering/components.d.ts.map +1 -0
- package/dist/rendering/components.js +773 -0
- package/dist/rendering/components.js.map +1 -0
- package/dist/rendering/field-analyzer.d.ts +48 -0
- package/dist/rendering/field-analyzer.d.ts.map +1 -0
- package/dist/rendering/field-analyzer.js +270 -0
- package/dist/rendering/field-analyzer.js.map +1 -0
- package/dist/rendering/field-renderers.d.ts +64 -0
- package/dist/rendering/field-renderers.d.ts.map +1 -0
- package/dist/rendering/field-renderers.js +317 -0
- package/dist/rendering/field-renderers.js.map +1 -0
- package/dist/rendering/index.d.ts +28 -0
- package/dist/rendering/index.d.ts.map +1 -0
- package/dist/rendering/index.js +60 -0
- package/dist/rendering/index.js.map +1 -0
- package/dist/rendering/layout-selector.d.ts +48 -0
- package/dist/rendering/layout-selector.d.ts.map +1 -0
- package/dist/rendering/layout-selector.js +347 -0
- package/dist/rendering/layout-selector.js.map +1 -0
- package/dist/rendering/template-engine.d.ts +41 -0
- package/dist/rendering/template-engine.d.ts.map +1 -0
- package/dist/rendering/template-engine.js +236 -0
- package/dist/rendering/template-engine.js.map +1 -0
- package/dist/schema-extractor.d.ts +30 -0
- package/dist/schema-extractor.d.ts.map +1 -1
- package/dist/schema-extractor.js +205 -12
- package/dist/schema-extractor.js.map +1 -1
- package/dist/stateful.d.ts +63 -0
- package/dist/stateful.d.ts.map +1 -1
- package/dist/stateful.js +222 -0
- package/dist/stateful.js.map +1 -1
- package/dist/types.d.ts +9 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/ucp/ap2/handlers.d.ts +242 -0
- package/dist/ucp/ap2/handlers.d.ts.map +1 -0
- package/dist/ucp/ap2/handlers.js +482 -0
- package/dist/ucp/ap2/handlers.js.map +1 -0
- package/dist/ucp/ap2/mandates.d.ts +95 -0
- package/dist/ucp/ap2/mandates.d.ts.map +1 -0
- package/dist/ucp/ap2/mandates.js +234 -0
- package/dist/ucp/ap2/mandates.js.map +1 -0
- package/dist/ucp/ap2/types.d.ts +305 -0
- package/dist/ucp/ap2/types.d.ts.map +1 -0
- package/dist/ucp/ap2/types.js +8 -0
- package/dist/ucp/ap2/types.js.map +1 -0
- package/dist/ucp/capabilities/checkout.d.ts +118 -0
- package/dist/ucp/capabilities/checkout.d.ts.map +1 -0
- package/dist/ucp/capabilities/checkout.js +344 -0
- package/dist/ucp/capabilities/checkout.js.map +1 -0
- package/dist/ucp/capabilities/identity.d.ts +130 -0
- package/dist/ucp/capabilities/identity.d.ts.map +1 -0
- package/dist/ucp/capabilities/identity.js +290 -0
- package/dist/ucp/capabilities/identity.js.map +1 -0
- package/dist/ucp/capabilities/order.d.ts +142 -0
- package/dist/ucp/capabilities/order.d.ts.map +1 -0
- package/dist/ucp/capabilities/order.js +383 -0
- package/dist/ucp/capabilities/order.js.map +1 -0
- package/dist/ucp/index.d.ts +18 -0
- package/dist/ucp/index.d.ts.map +1 -0
- package/dist/ucp/index.js +19 -0
- package/dist/ucp/index.js.map +1 -0
- package/dist/ucp/manifest.d.ts +62 -0
- package/dist/ucp/manifest.d.ts.map +1 -0
- package/dist/ucp/manifest.js +180 -0
- package/dist/ucp/manifest.js.map +1 -0
- package/dist/ucp/types.d.ts +327 -0
- package/dist/ucp/types.d.ts.map +1 -0
- package/dist/ucp/types.js +8 -0
- package/dist/ucp/types.js.map +1 -0
- package/package.json +3 -4
- package/src/auto-ui.ts +413 -0
- package/src/base.ts +22 -9
- package/src/cli-ui-renderer.ts +264 -0
- package/src/dependency-manager.ts +0 -1
- package/src/design-system/index.ts +30 -0
- package/src/design-system/tokens.ts +451 -0
- package/src/design-system/transaction-ui.ts +1038 -0
- package/src/generator.ts +68 -8
- package/src/index.ts +159 -101
- package/src/io.ts +493 -0
- package/src/path-resolver.ts +2 -1
- package/src/rendering/components.ts +785 -0
- package/src/rendering/field-analyzer.ts +299 -0
- package/src/rendering/field-renderers.ts +356 -0
- package/src/rendering/index.ts +63 -0
- package/src/rendering/layout-selector.ts +390 -0
- package/src/rendering/template-engine.ts +254 -0
- package/src/schema-extractor.ts +225 -12
- package/src/stateful.ts +301 -0
- package/src/types.ts +10 -1
- package/src/ucp/ap2/handlers.ts +779 -0
- package/src/ucp/ap2/mandates.ts +354 -0
- package/src/ucp/ap2/types.ts +441 -0
- package/src/ucp/capabilities/checkout.ts +497 -0
- package/src/ucp/capabilities/identity.ts +425 -0
- package/src/ucp/capabilities/order.ts +549 -0
- package/src/ucp/index.ts +27 -0
- package/src/ucp/manifest.ts +257 -0
- package/src/ucp/types.ts +454 -0
- package/dist/cli-formatter.d.ts +0 -92
- package/dist/cli-formatter.d.ts.map +0 -1
- package/dist/cli-formatter.js +0 -486
- package/dist/cli-formatter.js.map +0 -1
- package/dist/elicit.d.ts +0 -93
- package/dist/elicit.d.ts.map +0 -1
- package/dist/elicit.js +0 -373
- package/dist/elicit.js.map +0 -1
- package/dist/mcp-client.d.ts +0 -218
- package/dist/mcp-client.d.ts.map +0 -1
- package/dist/mcp-client.js +0 -424
- package/dist/mcp-client.js.map +0 -1
- package/dist/mcp-sdk-transport.d.ts +0 -88
- package/dist/mcp-sdk-transport.d.ts.map +0 -1
- package/dist/mcp-sdk-transport.js +0 -360
- package/dist/mcp-sdk-transport.js.map +0 -1
- package/dist/photon-config.d.ts +0 -86
- package/dist/photon-config.d.ts.map +0 -1
- package/dist/photon-config.js +0 -156
- package/dist/photon-config.js.map +0 -1
- package/src/cli-formatter.ts +0 -579
- package/src/elicit.ts +0 -438
- package/src/mcp-client.ts +0 -561
- package/src/mcp-sdk-transport.ts +0 -449
- package/src/photon-config.ts +0 -201
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI UI Renderer
|
|
3
|
+
*
|
|
4
|
+
* Implements UIRenderer interface for terminal output.
|
|
5
|
+
* Uses existing cli-formatter utilities.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
renderPrimitive,
|
|
10
|
+
renderList,
|
|
11
|
+
renderTable,
|
|
12
|
+
renderTree,
|
|
13
|
+
formatKey,
|
|
14
|
+
formatValue,
|
|
15
|
+
} from '@portel/cli';
|
|
16
|
+
import { UIRenderer } from './auto-ui.js';
|
|
17
|
+
import chalk from 'chalk';
|
|
18
|
+
import { highlight } from 'cli-highlight';
|
|
19
|
+
|
|
20
|
+
export class CLIUIRenderer implements UIRenderer {
|
|
21
|
+
renderText(value: string): void {
|
|
22
|
+
console.log(value);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
renderNumber(value: number): void {
|
|
26
|
+
console.log(value);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
renderBoolean(value: boolean): void {
|
|
30
|
+
console.log(value ? 'yes' : 'no');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
renderList(items: any[]): void {
|
|
34
|
+
renderList(items);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
renderTable(data: any): void {
|
|
38
|
+
renderTable(data);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
renderTree(data: any): void {
|
|
42
|
+
renderTree(data);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
renderCard(data: any): void {
|
|
46
|
+
if (Array.isArray(data)) {
|
|
47
|
+
// Multiple cards
|
|
48
|
+
data.forEach((item, index) => {
|
|
49
|
+
if (index > 0) console.log(''); // Spacing between cards
|
|
50
|
+
this.renderSingleCard(item);
|
|
51
|
+
});
|
|
52
|
+
} else {
|
|
53
|
+
// Single card
|
|
54
|
+
this.renderSingleCard(data);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private renderSingleCard(data: any): void {
|
|
59
|
+
if (typeof data !== 'object' || data === null) {
|
|
60
|
+
console.log(data);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const entries = Object.entries(data);
|
|
65
|
+
const maxKeyLength = Math.max(...entries.map(([k]) => formatKey(k).length));
|
|
66
|
+
|
|
67
|
+
// Card border
|
|
68
|
+
const width = Math.min(maxKeyLength + 40, 80);
|
|
69
|
+
console.log('┌' + '─'.repeat(width - 2) + '┐');
|
|
70
|
+
|
|
71
|
+
// Card content
|
|
72
|
+
entries.forEach(([key, value]) => {
|
|
73
|
+
const formattedKey = chalk.bold(formatKey(key));
|
|
74
|
+
const formattedValue = this.formatCardValue(value);
|
|
75
|
+
|
|
76
|
+
if (typeof value === 'object' && value !== null) {
|
|
77
|
+
console.log(`│ ${formattedKey}:`);
|
|
78
|
+
const lines = formattedValue.split('\n');
|
|
79
|
+
lines.forEach((line) => {
|
|
80
|
+
console.log(`│ ${line}`.padEnd(width - 1) + '│');
|
|
81
|
+
});
|
|
82
|
+
} else {
|
|
83
|
+
const line = `│ ${formattedKey}: ${formattedValue}`;
|
|
84
|
+
console.log(line.padEnd(width - 1) + '│');
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// Card border
|
|
89
|
+
console.log('└' + '─'.repeat(width - 2) + '┘');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private formatCardValue(value: any): string {
|
|
93
|
+
if (Array.isArray(value)) {
|
|
94
|
+
return value.map((v) => String(formatValue(v))).join(', ');
|
|
95
|
+
}
|
|
96
|
+
if (typeof value === 'object' && value !== null) {
|
|
97
|
+
return JSON.stringify(value, null, 2);
|
|
98
|
+
}
|
|
99
|
+
return String(formatValue(value));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
renderChart(data: any): void {
|
|
103
|
+
if (!Array.isArray(data)) {
|
|
104
|
+
console.log('Chart data must be an array');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Simple ASCII bar chart
|
|
109
|
+
console.log(chalk.bold('\nChart:'));
|
|
110
|
+
|
|
111
|
+
data.forEach((item) => {
|
|
112
|
+
if (typeof item !== 'object' || item === null) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const entries = Object.entries(item);
|
|
117
|
+
const label = String(entries[0]?.[1] ?? 'Unknown');
|
|
118
|
+
const value = Number(entries[1]?.[1] ?? 0);
|
|
119
|
+
const maxBarLength = 50;
|
|
120
|
+
const barLength = Math.min(Math.max(0, value), maxBarLength);
|
|
121
|
+
const bar = '█'.repeat(barLength);
|
|
122
|
+
|
|
123
|
+
console.log(`${label.padEnd(20)} ${chalk.cyan(bar)} ${value}`);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
console.log('');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
renderProgress(value: number, total?: number): void {
|
|
130
|
+
const percentage = total ? Math.round((value / total) * 100) : value;
|
|
131
|
+
const barLength = 40;
|
|
132
|
+
const filled = Math.round((percentage / 100) * barLength);
|
|
133
|
+
const bar = '█'.repeat(filled) + '░'.repeat(barLength - filled);
|
|
134
|
+
|
|
135
|
+
console.log(`[${chalk.cyan(bar)}] ${percentage}%`);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
renderCode(code: string, language?: string): void {
|
|
139
|
+
try {
|
|
140
|
+
if (language) {
|
|
141
|
+
console.log(highlight(code, { language, ignoreIllegals: true }));
|
|
142
|
+
} else {
|
|
143
|
+
console.log(highlight(code, { ignoreIllegals: true }));
|
|
144
|
+
}
|
|
145
|
+
} catch {
|
|
146
|
+
console.log(code);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
renderMarkdown(content: string): void {
|
|
151
|
+
// Use existing markdown renderer from cli-formatter
|
|
152
|
+
// Process markdown with colors for terminal
|
|
153
|
+
let rendered = content;
|
|
154
|
+
|
|
155
|
+
// Code blocks
|
|
156
|
+
rendered = rendered.replace(/```(\w*)\n([\s\S]*?)```/g, (_match, lang, code) => {
|
|
157
|
+
const trimmedCode = code.trim();
|
|
158
|
+
if (lang && lang !== '') {
|
|
159
|
+
try {
|
|
160
|
+
return '\n' + highlight(trimmedCode, { language: lang, ignoreIllegals: true }) + '\n';
|
|
161
|
+
} catch {
|
|
162
|
+
return '\n' + chalk.gray(trimmedCode) + '\n';
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return '\n' + chalk.gray(trimmedCode) + '\n';
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// Links
|
|
169
|
+
rendered = rendered.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_m, text, url) =>
|
|
170
|
+
chalk.blue.underline(text) + chalk.dim(` (${url})`)
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
// Headers
|
|
174
|
+
rendered = rendered
|
|
175
|
+
.replace(/^### (.+)$/gm, (_m, h) => '\n' + chalk.cyan(' ' + h) + '\n ' + chalk.dim('-'.repeat(20)))
|
|
176
|
+
.replace(/^## (.+)$/gm, (_m, h) => '\n' + chalk.yellow.bold(' ' + h) + '\n ' + chalk.dim('='.repeat(30)))
|
|
177
|
+
.replace(/^# (.+)$/gm, (_m, h) => '\n' + chalk.magenta.bold(h) + '\n' + chalk.dim('='.repeat(40)));
|
|
178
|
+
|
|
179
|
+
// Blockquotes
|
|
180
|
+
rendered = rendered.replace(/^> (.+)$/gm, (_m, quote) => chalk.dim('│ ') + chalk.italic(quote));
|
|
181
|
+
|
|
182
|
+
// Horizontal rules
|
|
183
|
+
rendered = rendered.replace(/^---+$/gm, chalk.dim('─'.repeat(40)));
|
|
184
|
+
|
|
185
|
+
// Lists
|
|
186
|
+
rendered = rendered.replace(/^- /gm, chalk.dim(' • '));
|
|
187
|
+
rendered = rendered.replace(/^(\d+)\. /gm, (_m, num) => chalk.dim(` ${num}. `));
|
|
188
|
+
|
|
189
|
+
// Bold
|
|
190
|
+
rendered = rendered.replace(/\*\*(.+?)\*\*/g, (_m, text) => chalk.bold(text));
|
|
191
|
+
|
|
192
|
+
// Italic
|
|
193
|
+
rendered = rendered.replace(/\*(.+?)\*/g, (_m, text) => chalk.italic(text));
|
|
194
|
+
rendered = rendered.replace(/_(.+?)_/g, (_m, text) => chalk.italic(text));
|
|
195
|
+
|
|
196
|
+
// Inline code
|
|
197
|
+
rendered = rendered.replace(/`([^`]+)`/g, (_m, code) => chalk.cyan(code));
|
|
198
|
+
|
|
199
|
+
console.log(rendered);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
renderJson(data: any): void {
|
|
203
|
+
try {
|
|
204
|
+
const formatted = JSON.stringify(data, null, 2);
|
|
205
|
+
console.log(highlight(formatted, { language: 'json', ignoreIllegals: true }));
|
|
206
|
+
} catch {
|
|
207
|
+
console.log(data);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
renderForm(fields: any): void {
|
|
212
|
+
console.log(chalk.bold('\nForm Fields:'));
|
|
213
|
+
renderTable(fields);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
renderTabs(tabs: any): void {
|
|
217
|
+
if (!Array.isArray(tabs) && typeof tabs === 'object') {
|
|
218
|
+
// Object with tab data
|
|
219
|
+
Object.entries(tabs).forEach(([title, content], index) => {
|
|
220
|
+
if (index > 0) console.log('\n' + chalk.dim('─'.repeat(60)));
|
|
221
|
+
console.log(chalk.bold.cyan(`\n▸ ${title}`));
|
|
222
|
+
console.log('');
|
|
223
|
+
|
|
224
|
+
if (typeof content === 'object') {
|
|
225
|
+
renderTree(content, ' ');
|
|
226
|
+
} else {
|
|
227
|
+
console.log(' ' + content);
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
} else {
|
|
231
|
+
console.log('Tabs data should be an object with tab titles as keys');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
renderAccordion(items: any): void {
|
|
236
|
+
if (!Array.isArray(items)) {
|
|
237
|
+
console.log('Accordion data must be an array');
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
items.forEach((item, index) => {
|
|
242
|
+
if (index > 0) console.log('');
|
|
243
|
+
|
|
244
|
+
if (typeof item === 'object' && item !== null) {
|
|
245
|
+
const title = item.title || item.name || `Item ${index + 1}`;
|
|
246
|
+
const content = item.content || item.data || item;
|
|
247
|
+
|
|
248
|
+
console.log(chalk.bold(`▸ ${title}`));
|
|
249
|
+
if (typeof content === 'object') {
|
|
250
|
+
renderTree(content, ' ');
|
|
251
|
+
} else {
|
|
252
|
+
console.log(' ' + content);
|
|
253
|
+
}
|
|
254
|
+
} else {
|
|
255
|
+
console.log(`▸ ${item}`);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Default CLI renderer instance
|
|
263
|
+
*/
|
|
264
|
+
export const cliRenderer = new CLIUIRenderer();
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Photon Design System
|
|
3
|
+
*
|
|
4
|
+
* A design system for AI+Human transaction workflows.
|
|
5
|
+
* Based on Material Design 3 tokens + Apple HIG visual principles.
|
|
6
|
+
*
|
|
7
|
+
* References:
|
|
8
|
+
* - Material Design 3: https://m3.material.io/foundations/design-tokens
|
|
9
|
+
* - Apple HIG: https://developer.apple.com/design/human-interface-guidelines/layout
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export * from './tokens.js';
|
|
13
|
+
export * from './transaction-ui.js';
|
|
14
|
+
|
|
15
|
+
import { generateTokensCSS } from './tokens.js';
|
|
16
|
+
import { generateTransactionCSS, generateTransactionJS } from './transaction-ui.js';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Generate all CSS for the Photon Design System
|
|
20
|
+
*/
|
|
21
|
+
export function generateDesignSystemCSS(): string {
|
|
22
|
+
return generateTokensCSS() + '\n' + generateTransactionCSS();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Generate all JavaScript for the Photon Design System
|
|
27
|
+
*/
|
|
28
|
+
export function generateDesignSystemJS(): string {
|
|
29
|
+
return generateTransactionJS();
|
|
30
|
+
}
|