@portel/photon 1.14.0 → 1.16.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 (125) hide show
  1. package/dist/auto-ui/beam/photon-management.d.ts +1 -1
  2. package/dist/auto-ui/beam/photon-management.d.ts.map +1 -1
  3. package/dist/auto-ui/beam/photon-management.js +5 -1
  4. package/dist/auto-ui/beam/photon-management.js.map +1 -1
  5. package/dist/auto-ui/beam/routes/api-config.d.ts.map +1 -1
  6. package/dist/auto-ui/beam/routes/api-config.js +31 -9
  7. package/dist/auto-ui/beam/routes/api-config.js.map +1 -1
  8. package/dist/auto-ui/beam/routes/api-marketplace.d.ts.map +1 -1
  9. package/dist/auto-ui/beam/routes/api-marketplace.js +3 -0
  10. package/dist/auto-ui/beam/routes/api-marketplace.js.map +1 -1
  11. package/dist/auto-ui/beam.d.ts.map +1 -1
  12. package/dist/auto-ui/beam.js +205 -56
  13. package/dist/auto-ui/beam.js.map +1 -1
  14. package/dist/auto-ui/bridge/index.d.ts.map +1 -1
  15. package/dist/auto-ui/bridge/index.js +578 -0
  16. package/dist/auto-ui/bridge/index.js.map +1 -1
  17. package/dist/auto-ui/bridge/renderers.d.ts.map +1 -1
  18. package/dist/auto-ui/bridge/renderers.js +7 -3
  19. package/dist/auto-ui/bridge/renderers.js.map +1 -1
  20. package/dist/auto-ui/bridge/types.d.ts +6 -0
  21. package/dist/auto-ui/bridge/types.d.ts.map +1 -1
  22. package/dist/auto-ui/frontend/pure-view.html +289 -0
  23. package/dist/auto-ui/photon-bridge.d.ts +11 -0
  24. package/dist/auto-ui/photon-bridge.d.ts.map +1 -1
  25. package/dist/auto-ui/photon-bridge.js +75 -1
  26. package/dist/auto-ui/photon-bridge.js.map +1 -1
  27. package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
  28. package/dist/auto-ui/streamable-http-transport.js +29 -3
  29. package/dist/auto-ui/streamable-http-transport.js.map +1 -1
  30. package/dist/beam-form.bundle.js +5707 -0
  31. package/dist/beam-form.bundle.js.map +7 -0
  32. package/dist/beam.bundle.js +2863 -895
  33. package/dist/beam.bundle.js.map +4 -4
  34. package/dist/claude-code-plugin.js +11 -3
  35. package/dist/claude-code-plugin.js.map +1 -1
  36. package/dist/cli/commands/build.js +1 -1
  37. package/dist/cli/commands/build.js.map +1 -1
  38. package/dist/cli/commands/doctor.d.ts.map +1 -1
  39. package/dist/cli/commands/doctor.js +7 -5
  40. package/dist/cli/commands/doctor.js.map +1 -1
  41. package/dist/cli/commands/info.d.ts.map +1 -1
  42. package/dist/cli/commands/info.js +18 -4
  43. package/dist/cli/commands/info.js.map +1 -1
  44. package/dist/cli/commands/mcp.js +2 -2
  45. package/dist/cli/commands/mcp.js.map +1 -1
  46. package/dist/cli/commands/update.d.ts.map +1 -1
  47. package/dist/cli/commands/update.js +6 -2
  48. package/dist/cli/commands/update.js.map +1 -1
  49. package/dist/cli-alias.d.ts.map +1 -1
  50. package/dist/cli-alias.js +3 -2
  51. package/dist/cli-alias.js.map +1 -1
  52. package/dist/daemon/client.d.ts +5 -0
  53. package/dist/daemon/client.d.ts.map +1 -1
  54. package/dist/daemon/client.js +50 -0
  55. package/dist/daemon/client.js.map +1 -1
  56. package/dist/daemon/manager.d.ts +15 -0
  57. package/dist/daemon/manager.d.ts.map +1 -1
  58. package/dist/daemon/manager.js +142 -11
  59. package/dist/daemon/manager.js.map +1 -1
  60. package/dist/daemon/worker-manager.js +1 -1
  61. package/dist/daemon/worker-manager.js.map +1 -1
  62. package/dist/deploy/cloudflare.d.ts.map +1 -1
  63. package/dist/deploy/cloudflare.js +12 -10
  64. package/dist/deploy/cloudflare.js.map +1 -1
  65. package/dist/loader.d.ts.map +1 -1
  66. package/dist/loader.js +37 -2
  67. package/dist/loader.js.map +1 -1
  68. package/dist/marketplace-manager.d.ts +9 -0
  69. package/dist/marketplace-manager.d.ts.map +1 -1
  70. package/dist/marketplace-manager.js +115 -42
  71. package/dist/marketplace-manager.js.map +1 -1
  72. package/dist/meta.d.ts +51 -0
  73. package/dist/meta.d.ts.map +1 -0
  74. package/dist/meta.js +320 -0
  75. package/dist/meta.js.map +1 -0
  76. package/dist/photon-cli-runner.d.ts.map +1 -1
  77. package/dist/photon-cli-runner.js +30 -5
  78. package/dist/photon-cli-runner.js.map +1 -1
  79. package/dist/photon-doc-extractor.d.ts +1 -0
  80. package/dist/photon-doc-extractor.d.ts.map +1 -1
  81. package/dist/photon-doc-extractor.js +33 -21
  82. package/dist/photon-doc-extractor.js.map +1 -1
  83. package/dist/photons/builder-compass.photon.d.ts +167 -0
  84. package/dist/photons/builder-compass.photon.d.ts.map +1 -0
  85. package/dist/photons/builder-compass.photon.js +816 -0
  86. package/dist/photons/builder-compass.photon.js.map +1 -0
  87. package/dist/photons/builder-compass.photon.ts +1129 -0
  88. package/dist/photons/docs/ui/docs.html +441 -0
  89. package/dist/photons/docs.photon.d.ts +237 -0
  90. package/dist/photons/docs.photon.d.ts.map +1 -0
  91. package/dist/photons/docs.photon.js +483 -0
  92. package/dist/photons/docs.photon.js.map +1 -0
  93. package/dist/photons/docs.photon.ts +536 -0
  94. package/dist/photons/maker.photon.d.ts.map +1 -1
  95. package/dist/photons/maker.photon.js +19 -2
  96. package/dist/photons/maker.photon.js.map +1 -1
  97. package/dist/photons/maker.photon.ts +18 -2
  98. package/dist/photons/slides.photon.d.ts +212 -0
  99. package/dist/photons/slides.photon.d.ts.map +1 -0
  100. package/dist/photons/slides.photon.js +355 -0
  101. package/dist/photons/slides.photon.js.map +1 -0
  102. package/dist/photons/slides.photon.ts +370 -0
  103. package/dist/photons/spreadsheet/ui/spreadsheet.html +779 -0
  104. package/dist/photons/spreadsheet.photon.d.ts +554 -0
  105. package/dist/photons/spreadsheet.photon.d.ts.map +1 -0
  106. package/dist/photons/spreadsheet.photon.js +1050 -0
  107. package/dist/photons/spreadsheet.photon.js.map +1 -0
  108. package/dist/photons/spreadsheet.photon.ts +1239 -0
  109. package/dist/photons/ui/builder-compass.html +1199 -0
  110. package/dist/photons/ui/builder-compass.photon.html +380 -0
  111. package/dist/server.d.ts.map +1 -1
  112. package/dist/server.js +33 -59
  113. package/dist/server.js.map +1 -1
  114. package/dist/shared/error-handler.d.ts +8 -0
  115. package/dist/shared/error-handler.d.ts.map +1 -1
  116. package/dist/shared/error-handler.js +50 -0
  117. package/dist/shared/error-handler.js.map +1 -1
  118. package/dist/shared-utils.d.ts +16 -2
  119. package/dist/shared-utils.d.ts.map +1 -1
  120. package/dist/shared-utils.js +37 -3
  121. package/dist/shared-utils.js.map +1 -1
  122. package/dist/template-manager.d.ts.map +1 -1
  123. package/dist/template-manager.js +2 -1
  124. package/dist/template-manager.js.map +1 -1
  125. package/package.json +8 -3
@@ -0,0 +1,380 @@
1
+ <style>
2
+ :root {
3
+ --canvas: #f4eddf;
4
+ --ink: #201d18;
5
+ --muted: #6c665d;
6
+ --olive: #38452f;
7
+ --sage: #6f8d62;
8
+ --amber: #ba7c33;
9
+ --rust: #9d5a42;
10
+ --card: rgba(255, 251, 244, 0.92);
11
+ --line: rgba(68, 53, 36, 0.12);
12
+ --shadow: 0 18px 48px rgba(54, 38, 17, 0.1);
13
+ --radius-xl: 28px;
14
+ --radius-lg: 20px;
15
+ --radius-md: 16px;
16
+ }
17
+
18
+ body {
19
+ background:
20
+ radial-gradient(circle at top left, rgba(111, 141, 98, 0.14), transparent 24%),
21
+ radial-gradient(circle at top right, rgba(186, 124, 51, 0.12), transparent 20%),
22
+ linear-gradient(180deg, #f8f1e7 0%, var(--canvas) 44%, #ecdfcb 100%);
23
+ color: var(--ink);
24
+ font-family: 'Inter', system-ui, sans-serif;
25
+ padding: 24px;
26
+ }
27
+
28
+ .shell {
29
+ display: grid;
30
+ gap: 18px;
31
+ }
32
+
33
+ .hero,
34
+ .grid {
35
+ display: grid;
36
+ gap: 18px;
37
+ }
38
+
39
+ .hero {
40
+ grid-template-columns: minmax(0, 1.35fr) minmax(320px, 0.82fr);
41
+ }
42
+
43
+ .grid {
44
+ grid-template-columns: minmax(320px, 0.9fr) minmax(400px, 1.1fr) minmax(320px, 0.92fr);
45
+ align-items: start;
46
+ }
47
+
48
+ .column {
49
+ display: grid;
50
+ gap: 18px;
51
+ }
52
+
53
+ .panel {
54
+ background: linear-gradient(180deg, rgba(255, 252, 247, 0.94), rgba(249, 241, 229, 0.96));
55
+ border: 1px solid var(--line);
56
+ border-radius: var(--radius-xl);
57
+ box-shadow: var(--shadow);
58
+ padding: 22px;
59
+ }
60
+
61
+ .hero-main {
62
+ padding: 28px;
63
+ }
64
+
65
+ .eyebrow,
66
+ .pill {
67
+ display: inline-flex;
68
+ align-items: center;
69
+ gap: 8px;
70
+ border-radius: 999px;
71
+ font:
72
+ 500 12px/1 ui-monospace,
73
+ SFMono-Regular,
74
+ Menlo,
75
+ monospace;
76
+ letter-spacing: 0.06em;
77
+ text-transform: uppercase;
78
+ }
79
+
80
+ .eyebrow {
81
+ color: var(--olive);
82
+ padding: 7px 12px;
83
+ border: 1px solid rgba(56, 69, 47, 0.14);
84
+ background: rgba(56, 69, 47, 0.08);
85
+ }
86
+
87
+ .hero-main h1 {
88
+ margin-top: 14px;
89
+ font-size: clamp(2.1rem, 5vw, 4rem);
90
+ line-height: 0.96;
91
+ font-weight: 800;
92
+ max-width: 11ch;
93
+ }
94
+
95
+ .lede,
96
+ .copy {
97
+ color: var(--muted);
98
+ line-height: 1.6;
99
+ }
100
+
101
+ .lede {
102
+ margin-top: 16px;
103
+ max-width: 64ch;
104
+ font-size: 1rem;
105
+ }
106
+
107
+ .metrics {
108
+ margin-top: 24px;
109
+ display: grid;
110
+ grid-template-columns: repeat(3, minmax(0, 1fr));
111
+ gap: 12px;
112
+ }
113
+
114
+ .metric {
115
+ background: rgba(255, 255, 255, 0.58);
116
+ border: 1px solid rgba(68, 53, 36, 0.1);
117
+ border-radius: 18px;
118
+ padding: 16px;
119
+ }
120
+
121
+ .metric label {
122
+ display: block;
123
+ color: var(--muted);
124
+ font-size: 12px;
125
+ text-transform: uppercase;
126
+ letter-spacing: 0.08em;
127
+ margin-bottom: 8px;
128
+ }
129
+
130
+ .metric [data-method] {
131
+ min-height: 0;
132
+ }
133
+
134
+ .stack {
135
+ display: grid;
136
+ gap: 12px;
137
+ }
138
+
139
+ .toolbar {
140
+ display: flex;
141
+ flex-wrap: wrap;
142
+ gap: 10px;
143
+ }
144
+
145
+ .toolbar button,
146
+ button[data-method] {
147
+ border-radius: 16px;
148
+ padding: 12px 16px;
149
+ font-weight: 600;
150
+ }
151
+
152
+ .primary {
153
+ background: linear-gradient(135deg, #38452f, #526647);
154
+ color: #f7f3ec;
155
+ }
156
+
157
+ .secondary {
158
+ background: rgba(255, 255, 255, 0.62);
159
+ color: var(--ink);
160
+ border: 1px solid rgba(68, 53, 36, 0.12);
161
+ }
162
+
163
+ .callout {
164
+ padding: 16px;
165
+ border-radius: 18px;
166
+ background: rgba(111, 141, 98, 0.08);
167
+ border: 1px solid rgba(111, 141, 98, 0.14);
168
+ color: var(--muted);
169
+ }
170
+
171
+ .warn {
172
+ background: rgba(157, 90, 66, 0.08);
173
+ border-color: rgba(157, 90, 66, 0.14);
174
+ }
175
+
176
+ .section-head {
177
+ display: flex;
178
+ justify-content: space-between;
179
+ gap: 12px;
180
+ align-items: flex-start;
181
+ margin-bottom: 14px;
182
+ }
183
+
184
+ .section-head h2 {
185
+ margin: 0;
186
+ font-size: 1.1rem;
187
+ }
188
+
189
+ .section-head p {
190
+ margin-top: 8px;
191
+ color: var(--muted);
192
+ line-height: 1.55;
193
+ }
194
+
195
+ .pill {
196
+ color: var(--amber);
197
+ padding: 6px 10px;
198
+ background: rgba(186, 124, 51, 0.1);
199
+ border: 1px solid rgba(186, 124, 51, 0.14);
200
+ }
201
+
202
+ .embed > [data-method] {
203
+ min-height: 120px;
204
+ }
205
+
206
+ .embed.compact > [data-method] {
207
+ min-height: 64px;
208
+ }
209
+
210
+ .report {
211
+ border-radius: 18px;
212
+ background: rgba(255, 255, 255, 0.56);
213
+ border: 1px solid rgba(68, 53, 36, 0.1);
214
+ padding: 16px;
215
+ }
216
+
217
+ .report [data-method] {
218
+ min-height: 180px;
219
+ }
220
+
221
+ @media (max-width: 1180px) {
222
+ .hero,
223
+ .grid {
224
+ grid-template-columns: 1fr;
225
+ }
226
+ }
227
+ </style>
228
+
229
+ <div class="shell">
230
+ <section class="hero">
231
+ <div class="panel hero-main">
232
+ <div class="eyebrow">Builder Compass / Photon</div>
233
+ <h1>Turn your builder profile into a money map.</h1>
234
+ <p class="lede">
235
+ Builder Compass stores your profile, classifies your AI-native builder archetype, and
236
+ researches how people like you are making money on the open web. TinyFish is used when you
237
+ explicitly rebuild, not every time you open the dashboard.
238
+ </p>
239
+
240
+ <div class="metrics">
241
+ <div class="metric">
242
+ <label>Fit overview</label>
243
+ <div data-method="fitOverview"></div>
244
+ </div>
245
+ <div class="metric">
246
+ <label>Money paths</label>
247
+ <div data-method="moneyPaths"></div>
248
+ </div>
249
+ <div class="metric">
250
+ <label>Builder report</label>
251
+ <div data-method="report"></div>
252
+ </div>
253
+ </div>
254
+ </div>
255
+
256
+ <aside class="panel stack">
257
+ <div>
258
+ <h2 style="margin: 0">How it works</h2>
259
+ <p class="copy" style="margin-top: 10px">
260
+ Save once, inspect anytime. When your profile changes, update the saved input and rebuild
261
+ the research deliberately.
262
+ </p>
263
+ </div>
264
+ <div class="callout">
265
+ Bring your own TinyFish API key if you want live market research and open-web evidence.
266
+ Without it, Builder Compass still gives a heuristic builder model.
267
+ </div>
268
+ <div class="toolbar">
269
+ <button class="primary" data-method="runCompass" data-target="#report-panel">
270
+ Run full compass
271
+ </button>
272
+ <button class="secondary" data-method="analyzeIdentity" data-target="#identity-panel">
273
+ Refresh identity
274
+ </button>
275
+ <button class="secondary" data-method="researchMarket" data-target="#market-panel">
276
+ Refresh market
277
+ </button>
278
+ </div>
279
+ </aside>
280
+ </section>
281
+
282
+ <section class="grid">
283
+ <div class="column">
284
+ <div class="panel">
285
+ <div class="section-head">
286
+ <div>
287
+ <h2>Profile intake</h2>
288
+ <p>
289
+ Minimal input. Persistent state. This form updates the stored profile and clears stale
290
+ research when your self-model changes.
291
+ </p>
292
+ </div>
293
+ <div class="pill">Persistent</div>
294
+ </div>
295
+ <div class="embed">
296
+ <div data-method="saveProfile"></div>
297
+ </div>
298
+ </div>
299
+
300
+ <div class="panel">
301
+ <div class="section-head">
302
+ <div>
303
+ <h2>Narrative report</h2>
304
+ <p>The reusable guide you can open later without paying the TinyFish cost again.</p>
305
+ </div>
306
+ </div>
307
+ <div class="report" id="report-panel">
308
+ <div data-method="report"></div>
309
+ </div>
310
+ </div>
311
+ </div>
312
+
313
+ <div class="column">
314
+ <div class="panel" id="identity-panel">
315
+ <div class="section-head">
316
+ <div>
317
+ <h2>Identity analysis</h2>
318
+ <p>
319
+ Builder archetype, strengths, work fit, and risks. Cached until you intentionally
320
+ rebuild.
321
+ </p>
322
+ </div>
323
+ <div class="pill">Profile model</div>
324
+ </div>
325
+ <div class="embed compact">
326
+ <div data-method="strengthMatrix"></div>
327
+ </div>
328
+ </div>
329
+
330
+ <div class="panel">
331
+ <div class="section-head">
332
+ <div>
333
+ <h2>Fit dials</h2>
334
+ <p>
335
+ Quick read on AI-native leverage, founder energy, execution reliability, and risk
336
+ load.
337
+ </p>
338
+ </div>
339
+ </div>
340
+ <div class="embed compact">
341
+ <div data-method="fitOverview"></div>
342
+ </div>
343
+ </div>
344
+ </div>
345
+
346
+ <div class="column">
347
+ <div class="panel" id="market-panel">
348
+ <div class="section-head">
349
+ <div>
350
+ <h2>Money paths</h2>
351
+ <p>Research-backed routes ranked by fit, speed to money, demand, and sustainability.</p>
352
+ </div>
353
+ <div class="pill">Market map</div>
354
+ </div>
355
+ <div class="embed compact">
356
+ <div data-method="moneyPaths"></div>
357
+ </div>
358
+ </div>
359
+
360
+ <div class="panel">
361
+ <div class="section-head">
362
+ <div>
363
+ <h2>Usage model</h2>
364
+ <p>Exactly the behavior we want for repeat use.</p>
365
+ </div>
366
+ </div>
367
+ <div class="callout">
368
+ Open the same profile any time to get the stored analysis back immediately.
369
+ </div>
370
+ <div class="callout" style="margin-top: 12px">
371
+ Update the profile only when you’ve actually changed, then rebuild identity and market
372
+ research.
373
+ </div>
374
+ <div class="callout warn" style="margin-top: 12px">
375
+ TinyFish is a rebuild engine here, not a page-refresh tax.
376
+ </div>
377
+ </div>
378
+ </div>
379
+ </section>
380
+ </div>
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -18,7 +18,7 @@ import { generateExecutionId } from '@portel/photon-core';
18
18
  import { createSDKMCPClientFactory } from '@portel/photon-core';
19
19
  import { PHOTON_VERSION } from './version.js';
20
20
  import { createLogger } from './shared/logger.js';
21
- import { getErrorMessage } from './shared/error-handler.js';
21
+ import { getErrorMessage, formatToolError } from './shared/error-handler.js';
22
22
  import { validateOrThrow, assertString, notEmpty, inRange, oneOf, hasExtension, } from './shared/validation.js';
23
23
  import { generatePlaygroundHTML } from './auto-ui/playground-html.js';
24
24
  import { subscribeChannel, pingDaemon, publishToChannel } from './daemon/client.js';
@@ -1016,6 +1016,15 @@ export class PhotonServer {
1016
1016
  });
1017
1017
  const isStateful = result && typeof result === 'object' && result._stateful === true;
1018
1018
  const actualResult = isStateful ? result.result : result;
1019
+ // _meta format transformation: if the result was transformed by _meta.format,
1020
+ // return the pre-formatted text with its MIME type directly
1021
+ if (actualResult && typeof actualResult === 'object' && actualResult._metaFormatted === true) {
1022
+ const content = { type: 'text', text: actualResult.text };
1023
+ if (actualResult.mimeType) {
1024
+ content.annotations = { mimeType: actualResult.mimeType };
1025
+ }
1026
+ return { content: [content], isError: false };
1027
+ }
1019
1028
  // Build content with optional annotations
1020
1029
  const content = {
1021
1030
  type: 'text',
@@ -1116,7 +1125,10 @@ export class PhotonServer {
1116
1125
  description: ui.linkedTool
1117
1126
  ? `UI template for ${ui.linkedTool} tool`
1118
1127
  : `UI template: ${ui.id}`,
1119
- mimeType: ui.mimeType || this.getUIMimeType(),
1128
+ // Always use MCP Apps mime type for UI resources — photon-core's
1129
+ // getMimeTypeFromPath returns plain text/html which causes Claude
1130
+ // Desktop to skip rendering the app UI
1131
+ mimeType: this.getUIMimeType(),
1120
1132
  });
1121
1133
  }
1122
1134
  for (const prompt of this.mcp.assets.prompts) {
@@ -1177,7 +1189,10 @@ export class PhotonServer {
1177
1189
  if (!this.mcp) {
1178
1190
  throw new Error('MCP not loaded');
1179
1191
  }
1180
- const { uri } = request.params;
1192
+ const { uri: rawUri } = request.params;
1193
+ const uri = typeof rawUri === 'string'
1194
+ ? rawUri.replace(/^ui:\/\/\/([^/]+)\/(.+)$/, 'ui://$1/$2')
1195
+ : rawUri;
1181
1196
  const uiMatch = uri.match(/^ui:\/\/([^/]+)\/(.+)$/);
1182
1197
  if (uiMatch) {
1183
1198
  const [, uiPhotonName, assetId] = uiMatch;
@@ -1483,66 +1498,17 @@ export class PhotonServer {
1483
1498
  * Provides structured, actionable error messages
1484
1499
  */
1485
1500
  formatError(error, toolName, args) {
1486
- // Determine error type
1487
- let errorType = 'runtime_error';
1488
- let errorMessage = getErrorMessage(error) || String(error);
1489
- let suggestion = '';
1490
- // Photon authors can attach userMessage and hint to errors for friendly display:
1491
- // throw Object.assign(new Error('internal'), { userMessage: 'friendly msg', hint: 'try this' })
1492
- const userMessage = error && typeof error === 'object' && 'userMessage' in error ? String(error.userMessage) : '';
1493
- const userHint = error && typeof error === 'object' && 'hint' in error ? String(error.hint) : '';
1494
- // Use userMessage as the display message if provided
1495
- if (userMessage) {
1496
- errorMessage = userMessage;
1497
- }
1498
- // Use author-provided hint over auto-generated suggestion
1499
- if (userHint) {
1500
- suggestion = userHint;
1501
- }
1502
- else if (errorMessage.includes('not a function') || errorMessage.includes('undefined')) {
1503
- // Categorize common errors and provide suggestions
1504
- errorType = 'implementation_error';
1505
- suggestion =
1506
- 'The tool implementation may have an issue. Check that all methods are properly defined.';
1507
- }
1508
- else if (errorMessage.includes('required') || errorMessage.includes('validation')) {
1509
- errorType = 'validation_error';
1510
- suggestion = 'Check the parameters provided match the tool schema requirements.';
1511
- }
1512
- else if (errorMessage.includes('timeout') || errorMessage.includes('ETIMEDOUT')) {
1513
- errorType = 'timeout_error';
1514
- suggestion = 'The operation took too long. Try again or check external service availability.';
1515
- }
1516
- else if (errorMessage.includes('ECONNREFUSED') || errorMessage.includes('network')) {
1517
- errorType = 'network_error';
1518
- suggestion =
1519
- 'Cannot connect to external service. Check network connection and service availability.';
1520
- }
1521
- else if (errorMessage.includes('permission') || errorMessage.includes('EACCES')) {
1522
- errorType = 'permission_error';
1523
- suggestion = 'Permission denied. Check file/resource access permissions.';
1524
- }
1525
- else if (errorMessage.includes('not found') || errorMessage.includes('ENOENT')) {
1526
- errorType = 'not_found_error';
1527
- suggestion = 'Resource not found. Check that the file or resource exists.';
1528
- }
1529
- // Build structured error message for AI
1530
- let structuredMessage = `❌ Tool Error: ${toolName}\n\n`;
1531
- structuredMessage += `Error Type: ${errorType}\n`;
1532
- structuredMessage += `Message: ${errorMessage}\n`;
1533
- if (suggestion) {
1534
- structuredMessage += `\nSuggestion: ${suggestion}\n`;
1535
- }
1536
- // Include parameters for debugging (in dev mode)
1501
+ const { text, errorType: _errorType } = formatToolError(toolName, error);
1502
+ // Add dev-mode extras
1503
+ let devExtras = '';
1537
1504
  if (this.options.devMode && Object.keys(args || {}).length > 0) {
1538
- structuredMessage += `\nParameters provided:\n${JSON.stringify(args, null, 2)}\n`;
1505
+ devExtras += `\nParameters provided:\n${JSON.stringify(args, null, 2)}\n`;
1539
1506
  }
1540
- // Include stack trace in dev mode
1541
1507
  if (this.options.devMode && error.stack) {
1542
- structuredMessage += `\nStack trace:\n${error.stack}\n`;
1508
+ devExtras += `\nStack trace:\n${error.stack}\n`;
1543
1509
  }
1544
1510
  // Log to stderr for debugging
1545
- this.log('error', `[Photon Error] ${toolName}: ${errorMessage}`);
1511
+ this.log('error', `[Photon Error] ${toolName}: ${getErrorMessage(error)}`);
1546
1512
  if (this.options.devMode && error.stack) {
1547
1513
  this.log('debug', error.stack);
1548
1514
  }
@@ -1550,7 +1516,7 @@ export class PhotonServer {
1550
1516
  content: [
1551
1517
  {
1552
1518
  type: 'text',
1553
- text: structuredMessage,
1519
+ text: text + devExtras,
1554
1520
  },
1555
1521
  ],
1556
1522
  isError: true,
@@ -2597,6 +2563,14 @@ export class PhotonServer {
2597
2563
  }
2598
2564
  content = await fs.readFile(ui.resolvedPath, 'utf-8');
2599
2565
  }
2566
+ // Wrap .photon.html fragments in a full HTML document.
2567
+ // These files contain only <style>, markup, and <script> — no <!doctype> or <html>.
2568
+ // Beam wraps them automatically, but MCP clients (Claude Desktop) need a complete document.
2569
+ const isFragment = !content.trimStart().toLowerCase().startsWith('<!doctype') &&
2570
+ !content.trimStart().toLowerCase().startsWith('<html');
2571
+ if (isFragment) {
2572
+ content = `<!doctype html>\n<html lang="en">\n<head>\n<meta charset="UTF-8">\n<meta name="viewport" content="width=device-width, initial-scale=1.0">\n</head>\n<body>\n${content}\n</body>\n</html>`;
2573
+ }
2600
2574
  // Inject MCP Apps bridge script for Claude Desktop compatibility
2601
2575
  const bridgeScript = this.generateMcpAppsBridge();
2602
2576
  content = content.replace('<head>', `<head>\n${bridgeScript}`);