@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.
Files changed (169) hide show
  1. package/README.md +123 -0
  2. package/dist/auto-ui.d.ts +103 -0
  3. package/dist/auto-ui.d.ts.map +1 -0
  4. package/dist/auto-ui.js +275 -0
  5. package/dist/auto-ui.js.map +1 -0
  6. package/dist/base.d.ts +9 -2
  7. package/dist/base.d.ts.map +1 -1
  8. package/dist/base.js +23 -10
  9. package/dist/base.js.map +1 -1
  10. package/dist/cli-ui-renderer.d.ts +31 -0
  11. package/dist/cli-ui-renderer.d.ts.map +1 -0
  12. package/dist/cli-ui-renderer.js +224 -0
  13. package/dist/cli-ui-renderer.js.map +1 -0
  14. package/dist/dependency-manager.d.ts.map +1 -1
  15. package/dist/dependency-manager.js +0 -1
  16. package/dist/dependency-manager.js.map +1 -1
  17. package/dist/design-system/index.d.ts +21 -0
  18. package/dist/design-system/index.d.ts.map +1 -0
  19. package/dist/design-system/index.js +27 -0
  20. package/dist/design-system/index.js.map +1 -0
  21. package/dist/design-system/tokens.d.ts +149 -0
  22. package/dist/design-system/tokens.d.ts.map +1 -0
  23. package/dist/design-system/tokens.js +413 -0
  24. package/dist/design-system/tokens.js.map +1 -0
  25. package/dist/design-system/transaction-ui.d.ts +70 -0
  26. package/dist/design-system/transaction-ui.d.ts.map +1 -0
  27. package/dist/design-system/transaction-ui.js +982 -0
  28. package/dist/design-system/transaction-ui.js.map +1 -0
  29. package/dist/generator.d.ts +58 -8
  30. package/dist/generator.d.ts.map +1 -1
  31. package/dist/generator.js +9 -4
  32. package/dist/generator.js.map +1 -1
  33. package/dist/index.d.ts +10 -7
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +48 -44
  36. package/dist/index.js.map +1 -1
  37. package/dist/io.d.ts +395 -0
  38. package/dist/io.d.ts.map +1 -0
  39. package/dist/io.js +304 -0
  40. package/dist/io.js.map +1 -0
  41. package/dist/path-resolver.d.ts.map +1 -1
  42. package/dist/path-resolver.js +2 -1
  43. package/dist/path-resolver.js.map +1 -1
  44. package/dist/rendering/components.d.ts +29 -0
  45. package/dist/rendering/components.d.ts.map +1 -0
  46. package/dist/rendering/components.js +773 -0
  47. package/dist/rendering/components.js.map +1 -0
  48. package/dist/rendering/field-analyzer.d.ts +48 -0
  49. package/dist/rendering/field-analyzer.d.ts.map +1 -0
  50. package/dist/rendering/field-analyzer.js +270 -0
  51. package/dist/rendering/field-analyzer.js.map +1 -0
  52. package/dist/rendering/field-renderers.d.ts +64 -0
  53. package/dist/rendering/field-renderers.d.ts.map +1 -0
  54. package/dist/rendering/field-renderers.js +317 -0
  55. package/dist/rendering/field-renderers.js.map +1 -0
  56. package/dist/rendering/index.d.ts +28 -0
  57. package/dist/rendering/index.d.ts.map +1 -0
  58. package/dist/rendering/index.js +60 -0
  59. package/dist/rendering/index.js.map +1 -0
  60. package/dist/rendering/layout-selector.d.ts +48 -0
  61. package/dist/rendering/layout-selector.d.ts.map +1 -0
  62. package/dist/rendering/layout-selector.js +347 -0
  63. package/dist/rendering/layout-selector.js.map +1 -0
  64. package/dist/rendering/template-engine.d.ts +41 -0
  65. package/dist/rendering/template-engine.d.ts.map +1 -0
  66. package/dist/rendering/template-engine.js +236 -0
  67. package/dist/rendering/template-engine.js.map +1 -0
  68. package/dist/schema-extractor.d.ts +30 -0
  69. package/dist/schema-extractor.d.ts.map +1 -1
  70. package/dist/schema-extractor.js +205 -12
  71. package/dist/schema-extractor.js.map +1 -1
  72. package/dist/stateful.d.ts +63 -0
  73. package/dist/stateful.d.ts.map +1 -1
  74. package/dist/stateful.js +222 -0
  75. package/dist/stateful.js.map +1 -1
  76. package/dist/types.d.ts +9 -1
  77. package/dist/types.d.ts.map +1 -1
  78. package/dist/types.js.map +1 -1
  79. package/dist/ucp/ap2/handlers.d.ts +242 -0
  80. package/dist/ucp/ap2/handlers.d.ts.map +1 -0
  81. package/dist/ucp/ap2/handlers.js +482 -0
  82. package/dist/ucp/ap2/handlers.js.map +1 -0
  83. package/dist/ucp/ap2/mandates.d.ts +95 -0
  84. package/dist/ucp/ap2/mandates.d.ts.map +1 -0
  85. package/dist/ucp/ap2/mandates.js +234 -0
  86. package/dist/ucp/ap2/mandates.js.map +1 -0
  87. package/dist/ucp/ap2/types.d.ts +305 -0
  88. package/dist/ucp/ap2/types.d.ts.map +1 -0
  89. package/dist/ucp/ap2/types.js +8 -0
  90. package/dist/ucp/ap2/types.js.map +1 -0
  91. package/dist/ucp/capabilities/checkout.d.ts +118 -0
  92. package/dist/ucp/capabilities/checkout.d.ts.map +1 -0
  93. package/dist/ucp/capabilities/checkout.js +344 -0
  94. package/dist/ucp/capabilities/checkout.js.map +1 -0
  95. package/dist/ucp/capabilities/identity.d.ts +130 -0
  96. package/dist/ucp/capabilities/identity.d.ts.map +1 -0
  97. package/dist/ucp/capabilities/identity.js +290 -0
  98. package/dist/ucp/capabilities/identity.js.map +1 -0
  99. package/dist/ucp/capabilities/order.d.ts +142 -0
  100. package/dist/ucp/capabilities/order.d.ts.map +1 -0
  101. package/dist/ucp/capabilities/order.js +383 -0
  102. package/dist/ucp/capabilities/order.js.map +1 -0
  103. package/dist/ucp/index.d.ts +18 -0
  104. package/dist/ucp/index.d.ts.map +1 -0
  105. package/dist/ucp/index.js +19 -0
  106. package/dist/ucp/index.js.map +1 -0
  107. package/dist/ucp/manifest.d.ts +62 -0
  108. package/dist/ucp/manifest.d.ts.map +1 -0
  109. package/dist/ucp/manifest.js +180 -0
  110. package/dist/ucp/manifest.js.map +1 -0
  111. package/dist/ucp/types.d.ts +327 -0
  112. package/dist/ucp/types.d.ts.map +1 -0
  113. package/dist/ucp/types.js +8 -0
  114. package/dist/ucp/types.js.map +1 -0
  115. package/package.json +3 -4
  116. package/src/auto-ui.ts +413 -0
  117. package/src/base.ts +22 -9
  118. package/src/cli-ui-renderer.ts +264 -0
  119. package/src/dependency-manager.ts +0 -1
  120. package/src/design-system/index.ts +30 -0
  121. package/src/design-system/tokens.ts +451 -0
  122. package/src/design-system/transaction-ui.ts +1038 -0
  123. package/src/generator.ts +68 -8
  124. package/src/index.ts +159 -101
  125. package/src/io.ts +493 -0
  126. package/src/path-resolver.ts +2 -1
  127. package/src/rendering/components.ts +785 -0
  128. package/src/rendering/field-analyzer.ts +299 -0
  129. package/src/rendering/field-renderers.ts +356 -0
  130. package/src/rendering/index.ts +63 -0
  131. package/src/rendering/layout-selector.ts +390 -0
  132. package/src/rendering/template-engine.ts +254 -0
  133. package/src/schema-extractor.ts +225 -12
  134. package/src/stateful.ts +301 -0
  135. package/src/types.ts +10 -1
  136. package/src/ucp/ap2/handlers.ts +779 -0
  137. package/src/ucp/ap2/mandates.ts +354 -0
  138. package/src/ucp/ap2/types.ts +441 -0
  139. package/src/ucp/capabilities/checkout.ts +497 -0
  140. package/src/ucp/capabilities/identity.ts +425 -0
  141. package/src/ucp/capabilities/order.ts +549 -0
  142. package/src/ucp/index.ts +27 -0
  143. package/src/ucp/manifest.ts +257 -0
  144. package/src/ucp/types.ts +454 -0
  145. package/dist/cli-formatter.d.ts +0 -92
  146. package/dist/cli-formatter.d.ts.map +0 -1
  147. package/dist/cli-formatter.js +0 -486
  148. package/dist/cli-formatter.js.map +0 -1
  149. package/dist/elicit.d.ts +0 -93
  150. package/dist/elicit.d.ts.map +0 -1
  151. package/dist/elicit.js +0 -373
  152. package/dist/elicit.js.map +0 -1
  153. package/dist/mcp-client.d.ts +0 -218
  154. package/dist/mcp-client.d.ts.map +0 -1
  155. package/dist/mcp-client.js +0 -424
  156. package/dist/mcp-client.js.map +0 -1
  157. package/dist/mcp-sdk-transport.d.ts +0 -88
  158. package/dist/mcp-sdk-transport.d.ts.map +0 -1
  159. package/dist/mcp-sdk-transport.js +0 -360
  160. package/dist/mcp-sdk-transport.js.map +0 -1
  161. package/dist/photon-config.d.ts +0 -86
  162. package/dist/photon-config.d.ts.map +0 -1
  163. package/dist/photon-config.js +0 -156
  164. package/dist/photon-config.js.map +0 -1
  165. package/src/cli-formatter.ts +0 -579
  166. package/src/elicit.ts +0 -438
  167. package/src/mcp-client.ts +0 -561
  168. package/src/mcp-sdk-transport.ts +0 -449
  169. 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();
@@ -95,7 +95,6 @@ export class DependencyManager {
95
95
  // Check if already installed
96
96
  const installed = await this.checkInstalled(mcpDir, dependencies);
97
97
  if (installed) {
98
- console.error(`Dependencies already installed for ${mcpName}`);
99
98
  return nodeModules;
100
99
  }
101
100
 
@@ -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
+ }