@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.
- package/dist/auto-ui/beam/photon-management.d.ts +1 -1
- package/dist/auto-ui/beam/photon-management.d.ts.map +1 -1
- package/dist/auto-ui/beam/photon-management.js +5 -1
- package/dist/auto-ui/beam/photon-management.js.map +1 -1
- package/dist/auto-ui/beam/routes/api-config.d.ts.map +1 -1
- package/dist/auto-ui/beam/routes/api-config.js +31 -9
- package/dist/auto-ui/beam/routes/api-config.js.map +1 -1
- package/dist/auto-ui/beam/routes/api-marketplace.d.ts.map +1 -1
- package/dist/auto-ui/beam/routes/api-marketplace.js +3 -0
- package/dist/auto-ui/beam/routes/api-marketplace.js.map +1 -1
- package/dist/auto-ui/beam.d.ts.map +1 -1
- package/dist/auto-ui/beam.js +205 -56
- package/dist/auto-ui/beam.js.map +1 -1
- package/dist/auto-ui/bridge/index.d.ts.map +1 -1
- package/dist/auto-ui/bridge/index.js +578 -0
- package/dist/auto-ui/bridge/index.js.map +1 -1
- package/dist/auto-ui/bridge/renderers.d.ts.map +1 -1
- package/dist/auto-ui/bridge/renderers.js +7 -3
- package/dist/auto-ui/bridge/renderers.js.map +1 -1
- package/dist/auto-ui/bridge/types.d.ts +6 -0
- package/dist/auto-ui/bridge/types.d.ts.map +1 -1
- package/dist/auto-ui/frontend/pure-view.html +289 -0
- package/dist/auto-ui/photon-bridge.d.ts +11 -0
- package/dist/auto-ui/photon-bridge.d.ts.map +1 -1
- package/dist/auto-ui/photon-bridge.js +75 -1
- package/dist/auto-ui/photon-bridge.js.map +1 -1
- package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
- package/dist/auto-ui/streamable-http-transport.js +29 -3
- package/dist/auto-ui/streamable-http-transport.js.map +1 -1
- package/dist/beam-form.bundle.js +5707 -0
- package/dist/beam-form.bundle.js.map +7 -0
- package/dist/beam.bundle.js +2863 -895
- package/dist/beam.bundle.js.map +4 -4
- package/dist/claude-code-plugin.js +11 -3
- package/dist/claude-code-plugin.js.map +1 -1
- package/dist/cli/commands/build.js +1 -1
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +7 -5
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +18 -4
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/mcp.js +2 -2
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +6 -2
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli-alias.d.ts.map +1 -1
- package/dist/cli-alias.js +3 -2
- package/dist/cli-alias.js.map +1 -1
- package/dist/daemon/client.d.ts +5 -0
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +50 -0
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/manager.d.ts +15 -0
- package/dist/daemon/manager.d.ts.map +1 -1
- package/dist/daemon/manager.js +142 -11
- package/dist/daemon/manager.js.map +1 -1
- package/dist/daemon/worker-manager.js +1 -1
- package/dist/daemon/worker-manager.js.map +1 -1
- package/dist/deploy/cloudflare.d.ts.map +1 -1
- package/dist/deploy/cloudflare.js +12 -10
- package/dist/deploy/cloudflare.js.map +1 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +37 -2
- package/dist/loader.js.map +1 -1
- package/dist/marketplace-manager.d.ts +9 -0
- package/dist/marketplace-manager.d.ts.map +1 -1
- package/dist/marketplace-manager.js +115 -42
- package/dist/marketplace-manager.js.map +1 -1
- package/dist/meta.d.ts +51 -0
- package/dist/meta.d.ts.map +1 -0
- package/dist/meta.js +320 -0
- package/dist/meta.js.map +1 -0
- package/dist/photon-cli-runner.d.ts.map +1 -1
- package/dist/photon-cli-runner.js +30 -5
- package/dist/photon-cli-runner.js.map +1 -1
- package/dist/photon-doc-extractor.d.ts +1 -0
- package/dist/photon-doc-extractor.d.ts.map +1 -1
- package/dist/photon-doc-extractor.js +33 -21
- package/dist/photon-doc-extractor.js.map +1 -1
- package/dist/photons/builder-compass.photon.d.ts +167 -0
- package/dist/photons/builder-compass.photon.d.ts.map +1 -0
- package/dist/photons/builder-compass.photon.js +816 -0
- package/dist/photons/builder-compass.photon.js.map +1 -0
- package/dist/photons/builder-compass.photon.ts +1129 -0
- package/dist/photons/docs/ui/docs.html +441 -0
- package/dist/photons/docs.photon.d.ts +237 -0
- package/dist/photons/docs.photon.d.ts.map +1 -0
- package/dist/photons/docs.photon.js +483 -0
- package/dist/photons/docs.photon.js.map +1 -0
- package/dist/photons/docs.photon.ts +536 -0
- package/dist/photons/maker.photon.d.ts.map +1 -1
- package/dist/photons/maker.photon.js +19 -2
- package/dist/photons/maker.photon.js.map +1 -1
- package/dist/photons/maker.photon.ts +18 -2
- package/dist/photons/slides.photon.d.ts +212 -0
- package/dist/photons/slides.photon.d.ts.map +1 -0
- package/dist/photons/slides.photon.js +355 -0
- package/dist/photons/slides.photon.js.map +1 -0
- package/dist/photons/slides.photon.ts +370 -0
- package/dist/photons/spreadsheet/ui/spreadsheet.html +779 -0
- package/dist/photons/spreadsheet.photon.d.ts +554 -0
- package/dist/photons/spreadsheet.photon.d.ts.map +1 -0
- package/dist/photons/spreadsheet.photon.js +1050 -0
- package/dist/photons/spreadsheet.photon.js.map +1 -0
- package/dist/photons/spreadsheet.photon.ts +1239 -0
- package/dist/photons/ui/builder-compass.html +1199 -0
- package/dist/photons/ui/builder-compass.photon.html +380 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +33 -59
- package/dist/server.js.map +1 -1
- package/dist/shared/error-handler.d.ts +8 -0
- package/dist/shared/error-handler.d.ts.map +1 -1
- package/dist/shared/error-handler.js +50 -0
- package/dist/shared/error-handler.js.map +1 -1
- package/dist/shared-utils.d.ts +16 -2
- package/dist/shared-utils.d.ts.map +1 -1
- package/dist/shared-utils.js +37 -3
- package/dist/shared-utils.js.map +1 -1
- package/dist/template-manager.d.ts.map +1 -1
- package/dist/template-manager.js +2 -1
- package/dist/template-manager.js.map +1 -1
- 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>
|
package/dist/server.d.ts.map
CHANGED
|
@@ -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":"AAAA;;;;;GAKG;AAoBH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAyC,MAAM,qBAAqB,CAAC;AAEjG,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG5E,OAAO,EAAgB,MAAM,EAAE,aAAa,EAAY,MAAM,oBAAoB,CAAC;AAiBnF,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,KAAK,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,eAAe,CAAC,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC;IACvD,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,qBAAqB,CAAC,EAAE,GAAG,CACzB,MAAM,EACN;QAAE,MAAM,EAAE;YAAE,OAAO,EAAE,GAAG,CAAC;YAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAA;SAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CACnF,CAAC;IACF,6EAA6E;IAC7E,cAAc,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,2EAA2E;IAC3E,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC9D;AA+PD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,GAAG,CAAoC;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,gBAAgB,CAAoC;IAC5D,OAAO,CAAC,UAAU,CAAgD;IAClE,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,eAAe,CAAC,CAKtB;IACF,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,oBAAoB,CAAyB;IACrD,OAAO,CAAC,UAAU,CAAuB;IACzC,mEAAmE;IACnE,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,uEAAuE;IACvE,OAAO,CAAC,gBAAgB,CAA6B;IACrD,kFAAkF;IAClF,OAAO,CAAC,wBAAwB,CAAS;IACzC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,qBAAqB,CAA8C;IAC3E,OAAO,CAAC,aAAa,CAQnB;IACF,OAAO,CAAC,MAAM,CAAS;IAEvB,sDAAsD;IACtD,eAAe,IAAI,mBAAmB,GAAG,IAAI;IAI7C,gFAAgF;IAChF,SAAS,IAAI,YAAY;gBAIb,OAAO,EAAE,mBAAmB;IAqEjC,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIzC,SAAS,IAAI,MAAM;IAI1B,OAAO,CAAC,GAAG;IAIX;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAK1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAQrC;IAEF,0CAA0C;IAC1C,OAAO,CAAC,kBAAkB,CAGtB;IAEJ;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAoCzB;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;IAEzE;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IA6C9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8HzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB,qGAAqG;IACrG,OAAO,CAAC,eAAe,CAA+D;IACtF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAU;IAEvD;;;OAGG;YACW,uBAAuB;YA2DvB,eAAe;YAgGf,cAAc;IA2R5B,OAAO,CAAC,iBAAiB;YAqBX,eAAe;IAgB7B,OAAO,CAAC,mBAAmB;IA2E3B,OAAO,CAAC,2BAA2B;YAiBrB,kBAAkB;IA2ChC;;OAEG;IACH,OAAO,CAAC,aAAa;IAiLrB;;OAEG;IACH,OAAO,CAAC,YAAY;IAoBpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAQvB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IA2BtB;;;OAGG;IACH,OAAO,CAAC,WAAW;IA6BnB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAgC7B;;;;;OAKG;YACW,uBAAuB;IAqDrC;;OAEG;YACW,qBAAqB;IA2BnC;;OAEG;YACW,wBAAwB;IA0FtC;;OAEG;IACG,KAAK;IAgGX;;;OAGG;YACW,mBAAmB;IAsBjC;;;;;;;;OAQG;YACW,oBAAoB;IAmDlC;;;;;;;OAOG;IACH,OAAO,CAAC,oCAAoC;IAc5C;;OAEG;YACW,UAAU;IAOxB;;OAEG;YACW,QAAQ;IAygBtB;;OAEG;YACW,cAAc;IAiC5B;;OAEG;YACW,iBAAiB;IAK/B;;OAEG;YACW,mBAAmB;IAwEjC;;OAEG;YACW,gBAAgB;IA+B9B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA+C5B;;OAEG;IACH;;OAEG;YACW,iBAAiB;IA6C/B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IA2W7B;;OAEG;YACW,eAAe;IA2C7B;;OAEG;YACW,gBAAgB;IAa9B;;OAEG;IACG,IAAI;IAgDV,OAAO,CAAC,mBAAmB;IA+B3B,OAAO,CAAC,kBAAkB;YAmBZ,qBAAqB;IAyBnC,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IACzC,OAAO,CAAC,kBAAkB,CAAC,CAAiB;IAEtC,MAAM;IAgGZ;;;OAGG;YACW,kBAAkB;CAyBjC"}
|
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
|
-
|
|
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
|
-
|
|
1487
|
-
|
|
1488
|
-
let
|
|
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
|
-
|
|
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
|
-
|
|
1508
|
+
devExtras += `\nStack trace:\n${error.stack}\n`;
|
|
1543
1509
|
}
|
|
1544
1510
|
// Log to stderr for debugging
|
|
1545
|
-
this.log('error', `[Photon Error] ${toolName}: ${
|
|
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:
|
|
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}`);
|