@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.
Files changed (172) hide show
  1. package/dist/auto-ui/beam.d.ts.map +1 -1
  2. package/dist/auto-ui/beam.js +14 -4
  3. package/dist/auto-ui/beam.js.map +1 -1
  4. package/dist/beam-form.bundle.js +5 -3
  5. package/dist/beam-form.bundle.js.map +2 -2
  6. package/dist/beam.bundle.js +686 -30
  7. package/dist/beam.bundle.js.map +3 -3
  8. package/dist/claude-code-plugin.js +1 -1
  9. package/dist/cli/commands/beam.d.ts.map +1 -1
  10. package/dist/cli/commands/beam.js +8 -2
  11. package/dist/cli/commands/beam.js.map +1 -1
  12. package/dist/cli/commands/changelog.d.ts +9 -0
  13. package/dist/cli/commands/changelog.d.ts.map +1 -0
  14. package/dist/cli/commands/changelog.js +133 -0
  15. package/dist/cli/commands/changelog.js.map +1 -0
  16. package/dist/cli/commands/maker.d.ts.map +1 -1
  17. package/dist/cli/commands/maker.js +23 -2
  18. package/dist/cli/commands/maker.js.map +1 -1
  19. package/dist/cli/commands/mcp.d.ts.map +1 -1
  20. package/dist/cli/commands/mcp.js +53 -0
  21. package/dist/cli/commands/mcp.js.map +1 -1
  22. package/dist/cli/commands/package.d.ts.map +1 -1
  23. package/dist/cli/commands/package.js +18 -2
  24. package/dist/cli/commands/package.js.map +1 -1
  25. package/dist/cli/commands/run.d.ts.map +1 -1
  26. package/dist/cli/commands/run.js +1 -0
  27. package/dist/cli/commands/run.js.map +1 -1
  28. package/dist/cli/commands/update.d.ts +3 -2
  29. package/dist/cli/commands/update.d.ts.map +1 -1
  30. package/dist/cli/commands/update.js +50 -43
  31. package/dist/cli/commands/update.js.map +1 -1
  32. package/dist/cli/index.d.ts.map +1 -1
  33. package/dist/cli/index.js +16 -2
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/cli-alias.js +1 -1
  36. package/dist/cli-alias.js.map +1 -1
  37. package/dist/context-store.d.ts +23 -33
  38. package/dist/context-store.d.ts.map +1 -1
  39. package/dist/context-store.js +147 -97
  40. package/dist/context-store.js.map +1 -1
  41. package/dist/context.d.ts +15 -10
  42. package/dist/context.d.ts.map +1 -1
  43. package/dist/context.js +37 -13
  44. package/dist/context.js.map +1 -1
  45. package/dist/daemon/server.js +4 -2
  46. package/dist/daemon/server.js.map +1 -1
  47. package/dist/data-migration.d.ts +27 -0
  48. package/dist/data-migration.d.ts.map +1 -0
  49. package/dist/data-migration.js +307 -0
  50. package/dist/data-migration.js.map +1 -0
  51. package/dist/editor-support/docblock-tag-catalog.d.ts.map +1 -1
  52. package/dist/editor-support/docblock-tag-catalog.js +6 -0
  53. package/dist/editor-support/docblock-tag-catalog.js.map +1 -1
  54. package/dist/loader.d.ts +10 -0
  55. package/dist/loader.d.ts.map +1 -1
  56. package/dist/loader.js +97 -12
  57. package/dist/loader.js.map +1 -1
  58. package/dist/marketplace-manager.d.ts.map +1 -1
  59. package/dist/marketplace-manager.js +25 -5
  60. package/dist/marketplace-manager.js.map +1 -1
  61. package/dist/photon-cli-runner.d.ts.map +1 -1
  62. package/dist/photon-cli-runner.js +47 -21
  63. package/dist/photon-cli-runner.js.map +1 -1
  64. package/dist/photon-doc-extractor.d.ts +1 -0
  65. package/dist/photon-doc-extractor.d.ts.map +1 -1
  66. package/dist/photon-doc-extractor.js +6 -0
  67. package/dist/photon-doc-extractor.js.map +1 -1
  68. package/dist/readme-syncer.d.ts.map +1 -1
  69. package/dist/readme-syncer.js +6 -1
  70. package/dist/readme-syncer.js.map +1 -1
  71. package/dist/server.d.ts +40 -0
  72. package/dist/server.d.ts.map +1 -1
  73. package/dist/server.js +143 -28
  74. package/dist/server.js.map +1 -1
  75. package/dist/shared/audit.js +4 -4
  76. package/dist/shared/audit.js.map +1 -1
  77. package/dist/tasks/store.d.ts.map +1 -1
  78. package/dist/tasks/store.js +6 -2
  79. package/dist/tasks/store.js.map +1 -1
  80. package/dist/version-notify.d.ts +27 -0
  81. package/dist/version-notify.d.ts.map +1 -0
  82. package/dist/version-notify.js +142 -0
  83. package/dist/version-notify.js.map +1 -0
  84. package/package.json +2 -2
  85. package/dist/auto-ui/bridge/openai-shim.d.ts +0 -20
  86. package/dist/auto-ui/bridge/openai-shim.d.ts.map +0 -1
  87. package/dist/auto-ui/bridge/openai-shim.js +0 -231
  88. package/dist/auto-ui/bridge/openai-shim.js.map +0 -1
  89. package/dist/auto-ui/bridge/photon-app.d.ts +0 -162
  90. package/dist/auto-ui/bridge/photon-app.d.ts.map +0 -1
  91. package/dist/auto-ui/bridge/photon-app.js +0 -460
  92. package/dist/auto-ui/bridge/photon-app.js.map +0 -1
  93. package/dist/auto-ui/daemon-tools.d.ts +0 -45
  94. package/dist/auto-ui/daemon-tools.d.ts.map +0 -1
  95. package/dist/auto-ui/daemon-tools.js +0 -581
  96. package/dist/auto-ui/daemon-tools.js.map +0 -1
  97. package/dist/auto-ui/design-system/index.d.ts +0 -21
  98. package/dist/auto-ui/design-system/index.d.ts.map +0 -1
  99. package/dist/auto-ui/design-system/index.js +0 -27
  100. package/dist/auto-ui/design-system/index.js.map +0 -1
  101. package/dist/auto-ui/design-system/transaction-ui.d.ts +0 -70
  102. package/dist/auto-ui/design-system/transaction-ui.d.ts.map +0 -1
  103. package/dist/auto-ui/design-system/transaction-ui.js +0 -982
  104. package/dist/auto-ui/design-system/transaction-ui.js.map +0 -1
  105. package/dist/auto-ui/playground-server.d.ts +0 -7
  106. package/dist/auto-ui/playground-server.d.ts.map +0 -1
  107. package/dist/auto-ui/playground-server.js +0 -840
  108. package/dist/auto-ui/playground-server.js.map +0 -1
  109. package/dist/auto-ui/rendering/components.d.ts +0 -29
  110. package/dist/auto-ui/rendering/components.d.ts.map +0 -1
  111. package/dist/auto-ui/rendering/components.js +0 -1341
  112. package/dist/auto-ui/rendering/components.js.map +0 -1
  113. package/dist/auto-ui/rendering/field-analyzer.d.ts +0 -104
  114. package/dist/auto-ui/rendering/field-analyzer.d.ts.map +0 -1
  115. package/dist/auto-ui/rendering/field-analyzer.js +0 -447
  116. package/dist/auto-ui/rendering/field-analyzer.js.map +0 -1
  117. package/dist/auto-ui/rendering/field-renderers.d.ts +0 -64
  118. package/dist/auto-ui/rendering/field-renderers.d.ts.map +0 -1
  119. package/dist/auto-ui/rendering/field-renderers.js +0 -317
  120. package/dist/auto-ui/rendering/field-renderers.js.map +0 -1
  121. package/dist/auto-ui/rendering/index.d.ts +0 -28
  122. package/dist/auto-ui/rendering/index.d.ts.map +0 -1
  123. package/dist/auto-ui/rendering/index.js +0 -60
  124. package/dist/auto-ui/rendering/index.js.map +0 -1
  125. package/dist/auto-ui/rendering/layout-selector.d.ts +0 -60
  126. package/dist/auto-ui/rendering/layout-selector.d.ts.map +0 -1
  127. package/dist/auto-ui/rendering/layout-selector.js +0 -476
  128. package/dist/auto-ui/rendering/layout-selector.js.map +0 -1
  129. package/dist/markdown-utils.d.ts +0 -8
  130. package/dist/markdown-utils.d.ts.map +0 -1
  131. package/dist/markdown-utils.js +0 -64
  132. package/dist/markdown-utils.js.map +0 -1
  133. package/dist/mcp-client.d.ts +0 -9
  134. package/dist/mcp-client.d.ts.map +0 -1
  135. package/dist/mcp-client.js +0 -11
  136. package/dist/mcp-client.js.map +0 -1
  137. package/dist/mcp-elicitation.d.ts +0 -32
  138. package/dist/mcp-elicitation.d.ts.map +0 -1
  139. package/dist/mcp-elicitation.js +0 -26
  140. package/dist/mcp-elicitation.js.map +0 -1
  141. package/dist/photons/builder-compass.photon.d.ts +0 -167
  142. package/dist/photons/builder-compass.photon.d.ts.map +0 -1
  143. package/dist/photons/builder-compass.photon.js +0 -816
  144. package/dist/photons/builder-compass.photon.js.map +0 -1
  145. package/dist/photons/builder-compass.photon.ts +0 -1129
  146. package/dist/photons/docs/ui/docs.html +0 -441
  147. package/dist/photons/docs.photon.d.ts +0 -237
  148. package/dist/photons/docs.photon.d.ts.map +0 -1
  149. package/dist/photons/docs.photon.js +0 -483
  150. package/dist/photons/docs.photon.js.map +0 -1
  151. package/dist/photons/docs.photon.ts +0 -536
  152. package/dist/photons/slides.photon.d.ts +0 -212
  153. package/dist/photons/slides.photon.d.ts.map +0 -1
  154. package/dist/photons/slides.photon.js +0 -355
  155. package/dist/photons/slides.photon.js.map +0 -1
  156. package/dist/photons/slides.photon.ts +0 -370
  157. package/dist/photons/spreadsheet/ui/spreadsheet.html +0 -779
  158. package/dist/photons/spreadsheet.photon.d.ts +0 -554
  159. package/dist/photons/spreadsheet.photon.d.ts.map +0 -1
  160. package/dist/photons/spreadsheet.photon.js +0 -1050
  161. package/dist/photons/spreadsheet.photon.js.map +0 -1
  162. package/dist/photons/spreadsheet.photon.ts +0 -1239
  163. package/dist/photons/ui/builder-compass.html +0 -1199
  164. package/dist/photons/ui/builder-compass.photon.html +0 -380
  165. package/dist/security-scanner.d.ts +0 -52
  166. package/dist/security-scanner.d.ts.map +0 -1
  167. package/dist/security-scanner.js +0 -181
  168. package/dist/security-scanner.js.map +0 -1
  169. package/dist/shared/performance.d.ts +0 -65
  170. package/dist/shared/performance.d.ts.map +0 -1
  171. package/dist/shared/performance.js +0 -136
  172. package/dist/shared/performance.js.map +0 -1
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Version Upgrade Notification
3
+ *
4
+ * Checks npm registry for newer versions and displays an unobtrusive notice
5
+ * with changelog highlights. Non-blocking — spawns a detached child process
6
+ * on cache miss so CLI startup is never delayed.
7
+ *
8
+ * Cache: .data/.version-check.json (24h TTL)
9
+ * Notice: shown once per new version (tracks notifiedVersion)
10
+ */
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ import { spawn } from 'child_process';
14
+ import { getDataRoot } from '@portel/photon-core';
15
+ import { PHOTON_VERSION } from './version.js';
16
+ const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
17
+ function getCachePath() {
18
+ return path.join(getDataRoot(), '.version-check.json');
19
+ }
20
+ function readCache() {
21
+ try {
22
+ const cachePath = getCachePath();
23
+ if (!fs.existsSync(cachePath))
24
+ return null;
25
+ return JSON.parse(fs.readFileSync(cachePath, 'utf-8'));
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ function writeCache(cache) {
32
+ try {
33
+ const cachePath = getCachePath();
34
+ fs.mkdirSync(path.dirname(cachePath), { recursive: true });
35
+ fs.writeFileSync(cachePath, JSON.stringify(cache, null, 2));
36
+ }
37
+ catch {
38
+ // Best effort
39
+ }
40
+ }
41
+ function isStale(cache) {
42
+ const checkedAt = new Date(cache.checkedAt).getTime();
43
+ return Date.now() - checkedAt > CACHE_TTL_MS;
44
+ }
45
+ /**
46
+ * Compare two semver strings.
47
+ * Returns 1 if a > b, -1 if a < b, 0 if equal.
48
+ */
49
+ function compareSemver(a, b) {
50
+ const pa = a.split('.').map(Number);
51
+ const pb = b.split('.').map(Number);
52
+ for (let i = 0; i < 3; i++) {
53
+ if ((pa[i] || 0) > (pb[i] || 0))
54
+ return 1;
55
+ if ((pa[i] || 0) < (pb[i] || 0))
56
+ return -1;
57
+ }
58
+ return 0;
59
+ }
60
+ /**
61
+ * Spawn a detached background process that fetches the latest version
62
+ * and changelog, then writes the cache file. The parent process does
63
+ * not wait for this — CLI exits immediately.
64
+ */
65
+ export function refreshUpdateCache() {
66
+ const cache = readCache();
67
+ if (cache && !isStale(cache))
68
+ return;
69
+ const cachePath = getCachePath();
70
+ const script = `
71
+ const fs = require('fs');
72
+ const { execSync } = require('child_process');
73
+
74
+ let latest = null;
75
+ try {
76
+ latest = execSync('npm view @portel/photon version', {
77
+ encoding: 'utf-8', timeout: 10000,
78
+ stdio: ['pipe', 'pipe', 'pipe']
79
+ }).trim();
80
+ } catch { process.exit(0); }
81
+
82
+ if (!latest) process.exit(0);
83
+
84
+ const existing = (() => {
85
+ try { return JSON.parse(fs.readFileSync(${JSON.stringify(cachePath)}, 'utf-8')); }
86
+ catch { return {}; }
87
+ })();
88
+ const data = {
89
+ latest,
90
+ checkedAt: new Date().toISOString(),
91
+ notifiedVersion: existing.notifiedVersion || undefined,
92
+ };
93
+ try {
94
+ fs.mkdirSync(require('path').dirname(${JSON.stringify(cachePath)}), { recursive: true });
95
+ fs.writeFileSync(${JSON.stringify(cachePath)}, JSON.stringify(data, null, 2));
96
+ } catch {}
97
+ `;
98
+ // Spawn detached — parent doesn't wait
99
+ const child = spawn(process.execPath, ['-e', script], {
100
+ detached: true,
101
+ stdio: 'ignore',
102
+ });
103
+ child.unref();
104
+ }
105
+ /**
106
+ * Show update notice to stderr if a newer version is available.
107
+ *
108
+ * Returns silently if:
109
+ * - No cache exists (background refresh hasn't completed yet)
110
+ * - Current version is up to date
111
+ * - Already notified for this version
112
+ * - Running in MCP STDIO mode
113
+ */
114
+ export function showUpdateNotice() {
115
+ if (process.env.PHOTON_TRANSPORT === 'stdio')
116
+ return;
117
+ const cache = readCache();
118
+ if (!cache)
119
+ return;
120
+ if (compareSemver(cache.latest, PHOTON_VERSION) <= 0)
121
+ return;
122
+ if (cache.notifiedVersion === cache.latest)
123
+ return;
124
+ const current = PHOTON_VERSION;
125
+ const latest = cache.latest;
126
+ const lines = [];
127
+ lines.push(` Update available: ${current} → ${latest}`);
128
+ lines.push(` Update: photon update`);
129
+ lines.push(` What's new: photon changelog`);
130
+ const width = Math.max(...lines.map((l) => l.length)) + 2;
131
+ const pad = (s) => s + ' '.repeat(Math.max(0, width - s.length));
132
+ console.error('');
133
+ console.error(`╭${'─'.repeat(width)}╮`);
134
+ for (const line of lines) {
135
+ console.error(`│${pad(line)}│`);
136
+ }
137
+ console.error(`╰${'─'.repeat(width)}╯`);
138
+ // Mark as notified so we don't show again for this version
139
+ cache.notifiedVersion = cache.latest;
140
+ writeCache(cache);
141
+ }
142
+ //# sourceMappingURL=version-notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-notify.js","sourceRoot":"","sources":["../src/version-notify.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portel/photon",
3
- "version": "1.18.0",
3
+ "version": "1.19.0",
4
4
  "description": "You focus on the business logic. We'll enable the rest. Build MCP servers and CLI tools in a single TypeScript file.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -112,7 +112,7 @@
112
112
  "@modelcontextprotocol/ext-apps": "^1.0.1",
113
113
  "@modelcontextprotocol/sdk": "^1.25.2",
114
114
  "@portel/cli": "^1.1.0",
115
- "@portel/photon-core": "^2.17.6",
115
+ "@portel/photon-core": "^2.18.0",
116
116
  "boxen": "^8.0.1",
117
117
  "chalk": "^5.4.1",
118
118
  "chart.js": "^4.5.1",
@@ -1,20 +0,0 @@
1
- /**
2
- * OpenAI Apps SDK Compatibility Shim
3
- *
4
- * Provides window.openai API that translates to MCP Apps protocol.
5
- * This allows apps built for ChatGPT to work in Photon hosts.
6
- */
7
- import type { PhotonApp } from './photon-app.js';
8
- import type { OpenAIAPI } from './types.js';
9
- /**
10
- * Generate the OpenAI shim code as inline JavaScript
11
- *
12
- * This gets injected into the iframe along with the PhotonApp.
13
- * It creates a window.openai object that delegates to window.photon.
14
- */
15
- export declare function generateOpenAIShimCode(): string;
16
- /**
17
- * Create OpenAI shim wrapper (for use with PhotonApp in browser)
18
- */
19
- export declare function createOpenAIShim(photonApp: PhotonApp): OpenAIAPI;
20
- //# sourceMappingURL=openai-shim.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai-shim.d.ts","sourceRoot":"","sources":["../../../src/auto-ui/bridge/openai-shim.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAkK/C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAoEhE"}
@@ -1,231 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,162 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"photon-app.d.ts","sourceRoot":"","sources":["../../../src/auto-ui/bridge/photon-app.ts"],"names":[],"mappings":"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"}