@portel/photon 1.5.1 → 1.6.1

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 (69) hide show
  1. package/README.md +361 -339
  2. package/dist/auto-ui/beam.d.ts +5 -0
  3. package/dist/auto-ui/beam.d.ts.map +1 -1
  4. package/dist/auto-ui/beam.js +727 -51
  5. package/dist/auto-ui/beam.js.map +1 -1
  6. package/dist/auto-ui/bridge/index.d.ts +37 -0
  7. package/dist/auto-ui/bridge/index.d.ts.map +1 -0
  8. package/dist/auto-ui/bridge/index.js +555 -0
  9. package/dist/auto-ui/bridge/index.js.map +1 -0
  10. package/dist/auto-ui/bridge/openai-shim.d.ts +20 -0
  11. package/dist/auto-ui/bridge/openai-shim.d.ts.map +1 -0
  12. package/dist/auto-ui/bridge/openai-shim.js +231 -0
  13. package/dist/auto-ui/bridge/openai-shim.js.map +1 -0
  14. package/dist/auto-ui/bridge/photon-app.d.ts +162 -0
  15. package/dist/auto-ui/bridge/photon-app.d.ts.map +1 -0
  16. package/dist/auto-ui/bridge/photon-app.js +460 -0
  17. package/dist/auto-ui/bridge/photon-app.js.map +1 -0
  18. package/dist/auto-ui/bridge/types.d.ts +128 -0
  19. package/dist/auto-ui/bridge/types.d.ts.map +1 -0
  20. package/dist/auto-ui/bridge/types.js +7 -0
  21. package/dist/auto-ui/bridge/types.js.map +1 -0
  22. package/dist/auto-ui/index.d.ts +3 -1
  23. package/dist/auto-ui/index.d.ts.map +1 -1
  24. package/dist/auto-ui/index.js +5 -2
  25. package/dist/auto-ui/index.js.map +1 -1
  26. package/dist/auto-ui/platform-compat.d.ts.map +1 -1
  27. package/dist/auto-ui/platform-compat.js +60 -6
  28. package/dist/auto-ui/platform-compat.js.map +1 -1
  29. package/dist/auto-ui/streamable-http-transport.d.ts +25 -1
  30. package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
  31. package/dist/auto-ui/streamable-http-transport.js +581 -20
  32. package/dist/auto-ui/streamable-http-transport.js.map +1 -1
  33. package/dist/auto-ui/types.d.ts +74 -0
  34. package/dist/auto-ui/types.d.ts.map +1 -1
  35. package/dist/auto-ui/types.js +21 -0
  36. package/dist/auto-ui/types.js.map +1 -1
  37. package/dist/beam.bundle.js +51377 -1778
  38. package/dist/beam.bundle.js.map +4 -4
  39. package/dist/cli.js +12 -2
  40. package/dist/cli.js.map +1 -1
  41. package/dist/daemon/client.d.ts +5 -3
  42. package/dist/daemon/client.d.ts.map +1 -1
  43. package/dist/daemon/client.js +30 -4
  44. package/dist/daemon/client.js.map +1 -1
  45. package/dist/daemon/manager.d.ts +5 -0
  46. package/dist/daemon/manager.d.ts.map +1 -1
  47. package/dist/daemon/manager.js +20 -0
  48. package/dist/daemon/manager.js.map +1 -1
  49. package/dist/loader.d.ts +23 -0
  50. package/dist/loader.d.ts.map +1 -1
  51. package/dist/loader.js +77 -12
  52. package/dist/loader.js.map +1 -1
  53. package/dist/photon-cli-runner.d.ts.map +1 -1
  54. package/dist/photon-cli-runner.js +2 -0
  55. package/dist/photon-cli-runner.js.map +1 -1
  56. package/dist/photon-doc-extractor.d.ts +1 -0
  57. package/dist/photon-doc-extractor.d.ts.map +1 -1
  58. package/dist/photon-doc-extractor.js +25 -6
  59. package/dist/photon-doc-extractor.js.map +1 -1
  60. package/dist/server.d.ts +12 -1
  61. package/dist/server.d.ts.map +1 -1
  62. package/dist/server.js +386 -13
  63. package/dist/server.js.map +1 -1
  64. package/dist/template-manager.js +2 -2
  65. package/dist/version.d.ts +8 -0
  66. package/dist/version.d.ts.map +1 -1
  67. package/dist/version.js +16 -0
  68. package/dist/version.js.map +1 -1
  69. package/package.json +18 -8
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Generate the OpenAI shim code as inline JavaScript
3
+ *
4
+ * This gets injected into the iframe along with the PhotonApp.
5
+ * It creates a window.openai object that delegates to window.photon.
6
+ */
7
+ export function generateOpenAIShimCode() {
8
+ return `
9
+ // OpenAI Apps SDK Shim - delegates to window.photon
10
+ (function() {
11
+ 'use strict';
12
+
13
+ var widgetState = {};
14
+ var pendingCalls = {};
15
+ var callIdCounter = 0;
16
+
17
+ function generateCallId() {
18
+ return 'openai_' + (++callIdCounter) + '_' + Math.random().toString(36).slice(2);
19
+ }
20
+
21
+ function postToHost(msg) {
22
+ window.parent.postMessage(msg, '*');
23
+ }
24
+
25
+ window.openai = {
26
+ // Context properties - delegate to photon
27
+ get theme() { return window.photon ? window.photon.theme : 'dark'; },
28
+ get displayMode() { return 'inline'; },
29
+ get locale() { return window.photon ? window.photon.locale : 'en-US'; },
30
+ get maxHeight() { return 800; },
31
+ get toolInput() { return window.photon ? window.photon.toolInput : {}; },
32
+ get toolOutput() { return window.photon ? window.photon.toolOutput : null; },
33
+ get widgetState() { return widgetState; },
34
+ get toolResponseMetadata() { return {}; },
35
+
36
+ // Methods
37
+ setWidgetState: function(state) {
38
+ widgetState = state;
39
+ if (window.photon) window.photon.setWidgetState(state);
40
+ },
41
+
42
+ callTool: function(name, args) {
43
+ if (window.photon) return window.photon.invoke(name, args);
44
+ return Promise.reject(new Error('Photon not initialized'));
45
+ },
46
+
47
+ sendFollowUpMessage: function(opts) {
48
+ postToHost({ type: 'photon:follow-up', message: opts.prompt });
49
+ return Promise.resolve();
50
+ },
51
+
52
+ uploadFile: function(file) {
53
+ var callId = generateCallId();
54
+ return new Promise(function(resolve, reject) {
55
+ pendingCalls[callId] = { resolve: resolve, reject: reject };
56
+
57
+ var reader = new FileReader();
58
+ reader.onload = function() {
59
+ postToHost({
60
+ type: 'photon:upload-file',
61
+ callId: callId,
62
+ fileName: file.name,
63
+ fileType: file.type,
64
+ fileSize: file.size,
65
+ data: reader.result
66
+ });
67
+ };
68
+ reader.onerror = function() {
69
+ delete pendingCalls[callId];
70
+ reject(new Error('Failed to read file'));
71
+ };
72
+ reader.readAsDataURL(file);
73
+
74
+ setTimeout(function() {
75
+ if (pendingCalls[callId]) {
76
+ delete pendingCalls[callId];
77
+ reject(new Error('File upload timeout'));
78
+ }
79
+ }, 60000);
80
+ });
81
+ },
82
+
83
+ getFileDownloadUrl: function(opts) {
84
+ var callId = generateCallId();
85
+ return new Promise(function(resolve, reject) {
86
+ pendingCalls[callId] = { resolve: resolve, reject: reject };
87
+ postToHost({
88
+ type: 'photon:get-file-url',
89
+ callId: callId,
90
+ fileId: opts.fileId
91
+ });
92
+ setTimeout(function() {
93
+ if (pendingCalls[callId]) {
94
+ delete pendingCalls[callId];
95
+ reject(new Error('Get file URL timeout'));
96
+ }
97
+ }, 30000);
98
+ });
99
+ },
100
+
101
+ requestDisplayMode: function(mode) {
102
+ postToHost({ type: 'photon:request-display-mode', mode: mode });
103
+ return Promise.resolve();
104
+ },
105
+
106
+ requestModal: function(opts) {
107
+ var callId = generateCallId();
108
+ return new Promise(function(resolve, reject) {
109
+ pendingCalls[callId] = { resolve: resolve, reject: reject };
110
+ postToHost({
111
+ type: 'photon:request-modal',
112
+ callId: callId,
113
+ template: opts.template,
114
+ params: opts.params
115
+ });
116
+ setTimeout(function() {
117
+ if (pendingCalls[callId]) {
118
+ delete pendingCalls[callId];
119
+ reject(new Error('Modal request timeout'));
120
+ }
121
+ }, 300000);
122
+ });
123
+ },
124
+
125
+ notifyIntrinsicHeight: function(height) {
126
+ // Use MCP Apps size notification
127
+ window.parent.postMessage({
128
+ jsonrpc: '2.0',
129
+ method: 'ui/notifications/size-changed',
130
+ params: { height: height }
131
+ }, '*');
132
+ },
133
+
134
+ openExternal: function(opts) {
135
+ window.open(opts.href, '_blank', 'noopener,noreferrer');
136
+ },
137
+
138
+ setOpenInAppUrl: function(opts) {
139
+ postToHost({ type: 'photon:set-open-in-app-url', href: opts.href });
140
+ }
141
+ };
142
+
143
+ // Handle responses from host
144
+ window.addEventListener('message', function(e) {
145
+ var m = e.data;
146
+ if (!m || typeof m !== 'object') return;
147
+
148
+ if (m.type === 'photon:upload-file-response' && pendingCalls[m.callId]) {
149
+ var p = pendingCalls[m.callId];
150
+ delete pendingCalls[m.callId];
151
+ if (m.error) p.reject(new Error(m.error));
152
+ else p.resolve({ fileId: m.fileId });
153
+ }
154
+ if (m.type === 'photon:get-file-url-response' && pendingCalls[m.callId]) {
155
+ var p = pendingCalls[m.callId];
156
+ delete pendingCalls[m.callId];
157
+ if (m.error) p.reject(new Error(m.error));
158
+ else p.resolve(m.url);
159
+ }
160
+ if (m.type === 'photon:request-modal-response' && pendingCalls[m.callId]) {
161
+ var p = pendingCalls[m.callId];
162
+ delete pendingCalls[m.callId];
163
+ if (m.error) p.reject(new Error(m.error));
164
+ else p.resolve(m.result);
165
+ }
166
+ });
167
+ })();
168
+ `;
169
+ }
170
+ /**
171
+ * Create OpenAI shim wrapper (for use with PhotonApp in browser)
172
+ */
173
+ export function createOpenAIShim(photonApp) {
174
+ let widgetState = {};
175
+ return {
176
+ get theme() {
177
+ return photonApp.theme;
178
+ },
179
+ get displayMode() {
180
+ return 'inline';
181
+ },
182
+ get locale() {
183
+ return photonApp.locale;
184
+ },
185
+ get maxHeight() {
186
+ return 800;
187
+ },
188
+ get toolInput() {
189
+ return photonApp.toolInput;
190
+ },
191
+ get toolOutput() {
192
+ return photonApp.toolOutput;
193
+ },
194
+ get widgetState() {
195
+ return widgetState;
196
+ },
197
+ setWidgetState(state) {
198
+ widgetState = state;
199
+ photonApp.setWidgetState(state);
200
+ },
201
+ callTool(name, args) {
202
+ return photonApp.invoke(name, args);
203
+ },
204
+ sendFollowUpMessage(_options) {
205
+ // Not supported in Photon
206
+ return Promise.resolve();
207
+ },
208
+ uploadFile(_file) {
209
+ return Promise.reject(new Error('File upload not supported'));
210
+ },
211
+ getFileDownloadUrl(_options) {
212
+ return Promise.reject(new Error('File download not supported'));
213
+ },
214
+ requestDisplayMode(_mode) {
215
+ return Promise.resolve();
216
+ },
217
+ requestModal(_options) {
218
+ return Promise.reject(new Error('Modal not supported'));
219
+ },
220
+ notifyIntrinsicHeight(height) {
221
+ photonApp.sendSizeChanged({ height });
222
+ },
223
+ openExternal(options) {
224
+ window.open(options.href, '_blank', 'noopener,noreferrer');
225
+ },
226
+ setOpenInAppUrl(_options) {
227
+ // Not supported
228
+ },
229
+ };
230
+ }
231
+ //# sourceMappingURL=openai-shim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-shim.js","sourceRoot":"","sources":["../../../src/auto-ui/bridge/openai-shim.ts"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgKR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAoB;IACnD,IAAI,WAAW,GAAY,EAAE,CAAC;IAE9B,OAAO;QACL,IAAI,KAAK;YACP,OAAO,SAAS,CAAC,KAAK,CAAC;QACzB,CAAC;QACD,IAAI,WAAW;YACb,OAAO,QAAiB,CAAC;QAC3B,CAAC;QACD,IAAI,MAAM;YACR,OAAO,SAAS,CAAC,MAAM,CAAC;QAC1B,CAAC;QACD,IAAI,SAAS;YACX,OAAO,GAAG,CAAC;QACb,CAAC;QACD,IAAI,SAAS;YACX,OAAO,SAAS,CAAC,SAAS,CAAC;QAC7B,CAAC;QACD,IAAI,UAAU;YACZ,OAAO,SAAS,CAAC,UAAU,CAAC;QAC9B,CAAC;QACD,IAAI,WAAW;YACb,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,cAAc,CAAC,KAAc;YAC3B,WAAW,GAAG,KAAK,CAAC;YACpB,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;QAED,QAAQ,CAAC,IAAY,EAAE,IAA6B;YAClD,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,mBAAmB,CAAC,QAA4B;YAC9C,0BAA0B;YAC1B,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAED,UAAU,CAAC,KAAW;YACpB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,kBAAkB,CAAC,QAA4B;YAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,kBAAkB,CAAC,KAAsC;YACvD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QAED,YAAY,CAAC,QAA+C;YAC1D,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,qBAAqB,CAAC,MAAc;YAClC,SAAS,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,YAAY,CAAC,OAAyB;YACpC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;QAC7D,CAAC;QAED,eAAe,CAAC,QAA0B;YACxC,gBAAgB;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * PhotonApp - View-side bridge using MCP Apps Extension SDK
3
+ *
4
+ * Extends the standard App class from @modelcontextprotocol/ext-apps
5
+ * to provide the window.photon API for photon UIs.
6
+ *
7
+ * Usage in UI templates:
8
+ * ```javascript
9
+ * const app = new PhotonApp('kanban');
10
+ * await app.connect();
11
+ *
12
+ * app.onResult((data) => renderBoard(data));
13
+ * const boards = await app.invoke('boards');
14
+ * ```
15
+ */
16
+ import type { ProgressNotification, StatusNotification, StreamNotification, EmitNotification, SizeConstraints } from './types.js';
17
+ type Listener<T> = (data: T) => void;
18
+ /**
19
+ * PhotonApp class for UI templates
20
+ *
21
+ * This runs in the browser iframe and communicates with the host
22
+ * using the MCP Apps Extension protocol.
23
+ */
24
+ export declare class PhotonApp {
25
+ private _name;
26
+ private _toolOutput;
27
+ private _toolInput;
28
+ private _widgetState;
29
+ private _theme;
30
+ private _locale;
31
+ private _hostContext;
32
+ private _pendingCalls;
33
+ private _callIdCounter;
34
+ private _resultListeners;
35
+ private _themeListeners;
36
+ private _progressListeners;
37
+ private _statusListeners;
38
+ private _streamListeners;
39
+ private _emitListeners;
40
+ constructor(name: string);
41
+ /**
42
+ * Set up message handler for communication with host
43
+ */
44
+ private _setupMessageHandler;
45
+ /**
46
+ * Handle JSON-RPC 2.0 messages (MCP Apps protocol)
47
+ */
48
+ private _handleJsonRpcMessage;
49
+ /**
50
+ * Handle legacy photon: messages for backward compatibility
51
+ */
52
+ private _handleLegacyMessage;
53
+ /**
54
+ * Handle ui/initialize message
55
+ */
56
+ private _handleInitialize;
57
+ /**
58
+ * Handle host context changes (theme, etc.)
59
+ */
60
+ private _handleHostContextChanged;
61
+ /**
62
+ * Apply theme class to document
63
+ */
64
+ private _applyTheme;
65
+ /**
66
+ * Apply theme CSS variables
67
+ */
68
+ private _applyThemeTokens;
69
+ /**
70
+ * Post message to host
71
+ */
72
+ private _postToHost;
73
+ /**
74
+ * Generate unique call ID
75
+ */
76
+ private _generateCallId;
77
+ /**
78
+ * Extract data from MCP result format
79
+ */
80
+ private _extractData;
81
+ /**
82
+ * Connect to host and perform MCP Apps handshake
83
+ */
84
+ connect(): Promise<void>;
85
+ /**
86
+ * Current tool output data
87
+ */
88
+ get toolOutput(): any;
89
+ /**
90
+ * Current tool input
91
+ */
92
+ get toolInput(): Record<string, unknown>;
93
+ /**
94
+ * Widget state
95
+ */
96
+ get widgetState(): unknown;
97
+ /**
98
+ * Set widget state
99
+ */
100
+ setWidgetState(state: unknown): void;
101
+ /**
102
+ * Current theme
103
+ */
104
+ get theme(): 'light' | 'dark';
105
+ /**
106
+ * Current locale
107
+ */
108
+ get locale(): string;
109
+ /**
110
+ * Host context from initialization
111
+ */
112
+ get hostContext(): any;
113
+ /**
114
+ * Register result handler
115
+ */
116
+ onResult(cb: Listener<any>): () => void;
117
+ /**
118
+ * Register theme change handler
119
+ */
120
+ onThemeChange(cb: Listener<'light' | 'dark'>): () => void;
121
+ /**
122
+ * Register progress notification handler
123
+ */
124
+ onProgress(cb: Listener<ProgressNotification>): () => void;
125
+ /**
126
+ * Register status notification handler
127
+ */
128
+ onStatus(cb: Listener<StatusNotification>): () => void;
129
+ /**
130
+ * Register stream notification handler
131
+ */
132
+ onStream(cb: Listener<StreamNotification>): () => void;
133
+ /**
134
+ * Register emit notification handler
135
+ */
136
+ onEmit(cb: Listener<EmitNotification>): () => void;
137
+ /**
138
+ * Call a tool on the server
139
+ */
140
+ invoke(name: string, args?: Record<string, unknown>): Promise<any>;
141
+ /**
142
+ * Alias for invoke (compatibility)
143
+ */
144
+ callTool(name: string, args?: Record<string, unknown>): Promise<any>;
145
+ /**
146
+ * Send size change notification to host
147
+ */
148
+ sendSizeChanged(size: {
149
+ width?: number;
150
+ height?: number;
151
+ }): void;
152
+ /**
153
+ * Parse size constraints from meta tag
154
+ */
155
+ static parseSizeMeta(): SizeConstraints;
156
+ /**
157
+ * Set up automatic size reporting with ResizeObserver
158
+ */
159
+ setupAutoResize(target?: HTMLElement): () => void;
160
+ }
161
+ export {};
162
+ //# sourceMappingURL=photon-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"photon-app.d.ts","sourceRoot":"","sources":["../../../src/auto-ui/bridge/photon-app.ts"],"names":[],"mappings":"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"}