@portel/photon 1.28.2 → 1.29.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.
- package/README.md +1 -0
- package/dist/auto-ui/beam.d.ts.map +1 -1
- package/dist/auto-ui/beam.js +77 -43
- package/dist/auto-ui/beam.js.map +1 -1
- package/dist/auto-ui/streamable-http-transport.d.ts +7 -0
- package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
- package/dist/auto-ui/streamable-http-transport.js +228 -29
- package/dist/auto-ui/streamable-http-transport.js.map +1 -1
- package/dist/auto-ui/types.d.ts +9 -1
- package/dist/auto-ui/types.d.ts.map +1 -1
- package/dist/auto-ui/types.js.map +1 -1
- package/dist/beam.bundle.js +32 -2
- package/dist/beam.bundle.js.map +2 -2
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +123 -15
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/daemon/manager.d.ts.map +1 -1
- package/dist/daemon/manager.js +45 -11
- package/dist/daemon/manager.js.map +1 -1
- package/dist/daemon/server.js +41 -0
- package/dist/daemon/server.js.map +1 -1
- package/dist/deploy/cloudflare.d.ts.map +1 -1
- package/dist/deploy/cloudflare.js +82 -2
- package/dist/deploy/cloudflare.js.map +1 -1
- package/dist/editor-support/docblock-tag-catalog.d.ts.map +1 -1
- package/dist/editor-support/docblock-tag-catalog.js +32 -2
- package/dist/editor-support/docblock-tag-catalog.js.map +1 -1
- package/dist/format/registry.d.ts +83 -0
- package/dist/format/registry.d.ts.map +1 -0
- package/dist/format/registry.js +139 -0
- package/dist/format/registry.js.map +1 -0
- package/dist/format/seed.d.ts +18 -0
- package/dist/format/seed.d.ts.map +1 -0
- package/dist/format/seed.js +246 -0
- package/dist/format/seed.js.map +1 -0
- package/dist/loader.d.ts +18 -0
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +130 -22
- package/dist/loader.js.map +1 -1
- package/dist/photons/maker.photon.d.ts +2 -2
- package/dist/photons/maker.photon.d.ts.map +1 -1
- package/dist/photons/maker.photon.js +5 -6
- package/dist/photons/maker.photon.js.map +1 -1
- package/dist/photons/maker.photon.ts +5 -6
- package/dist/resource-server.d.ts +52 -12
- package/dist/resource-server.d.ts.map +1 -1
- package/dist/resource-server.js +205 -50
- package/dist/resource-server.js.map +1 -1
- package/dist/server.d.ts +75 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +515 -53
- package/dist/server.js.map +1 -1
- package/dist/shared/asset-encoding.d.ts +30 -0
- package/dist/shared/asset-encoding.d.ts.map +1 -0
- package/dist/shared/asset-encoding.js +0 -0
- package/dist/shared/asset-encoding.js.map +1 -0
- package/dist/shared/cross-origin-headers.d.ts +47 -0
- package/dist/shared/cross-origin-headers.d.ts.map +1 -0
- package/dist/shared/cross-origin-headers.js +61 -0
- package/dist/shared/cross-origin-headers.js.map +1 -0
- package/dist/shared/expose-route-extractor.d.ts +36 -0
- package/dist/shared/expose-route-extractor.d.ts.map +1 -0
- package/dist/shared/expose-route-extractor.js +64 -0
- package/dist/shared/expose-route-extractor.js.map +1 -0
- package/dist/shared/extract-claims.d.ts +33 -0
- package/dist/shared/extract-claims.d.ts.map +1 -0
- package/dist/shared/extract-claims.js +60 -0
- package/dist/shared/extract-claims.js.map +1 -0
- package/dist/shared/http-route-extractor.d.ts +6 -0
- package/dist/shared/http-route-extractor.d.ts.map +1 -1
- package/dist/shared/http-route-extractor.js +29 -5
- package/dist/shared/http-route-extractor.js.map +1 -1
- package/dist/shared/instance-binding.d.ts +53 -0
- package/dist/shared/instance-binding.d.ts.map +1 -0
- package/dist/shared/instance-binding.js +85 -0
- package/dist/shared/instance-binding.js.map +1 -0
- package/dist/types/server-types.d.ts +1 -0
- package/dist/types/server-types.d.ts.map +1 -1
- package/package.json +6 -3
- package/templates/cloudflare/worker.ts.template +90 -3
- package/templates/cloudflare/wrangler.toml.template +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/format/seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,cAAc,EAAsC,MAAM,eAAe,CAAC;AAuKnF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CA2EjE;AAID,wBAAgB,kBAAkB,IAAI,cAAc,CAMnD"}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in format seed for the unified registry.
|
|
3
|
+
*
|
|
4
|
+
* Plan reference: server-provided-what-a-reactive-globe.md → Track A.
|
|
5
|
+
*
|
|
6
|
+
* Seeds the seven core HTTP-target formats: json, html, markdown, csv, yaml,
|
|
7
|
+
* xml, plain. The MIME-mapping core comes from @portel/cli's `formatToMimeType`
|
|
8
|
+
* for parity with CLI rendering. Renderers here are minimal but functional —
|
|
9
|
+
* they cover the cases the spec calls out and fall back to JSON via the
|
|
10
|
+
* registry's fallback contract for everything else.
|
|
11
|
+
*
|
|
12
|
+
* Other targets (cli, beam, mcp) are seeded by their own modules. This file
|
|
13
|
+
* intentionally only registers HTTP renderers.
|
|
14
|
+
*/
|
|
15
|
+
import { FormatRegistry } from './registry.js';
|
|
16
|
+
function utf8(body, mime) {
|
|
17
|
+
return { body, mime: mime.includes('charset=') ? mime : `${mime}; charset=utf-8` };
|
|
18
|
+
}
|
|
19
|
+
function renderJsonHttp(value) {
|
|
20
|
+
return utf8(JSON.stringify(value, null, 2), 'application/json');
|
|
21
|
+
}
|
|
22
|
+
function renderPlainHttp(value) {
|
|
23
|
+
if (typeof value === 'string')
|
|
24
|
+
return utf8(value, 'text/plain');
|
|
25
|
+
return utf8(JSON.stringify(value, null, 2), 'text/plain');
|
|
26
|
+
}
|
|
27
|
+
function renderMarkdownHttp(value) {
|
|
28
|
+
if (typeof value === 'string')
|
|
29
|
+
return utf8(value, 'text/markdown');
|
|
30
|
+
if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'object') {
|
|
31
|
+
const rows = value;
|
|
32
|
+
const cols = Array.from(rows.reduce((acc, r) => {
|
|
33
|
+
Object.keys(r).forEach((k) => acc.add(k));
|
|
34
|
+
return acc;
|
|
35
|
+
}, new Set()));
|
|
36
|
+
const header = `| ${cols.join(' | ')} |\n| ${cols.map(() => '---').join(' | ')} |`;
|
|
37
|
+
const body = rows.map((r) => `| ${cols.map((c) => formatCell(r[c])).join(' | ')} |`).join('\n');
|
|
38
|
+
return utf8(`${header}\n${body}\n`, 'text/markdown');
|
|
39
|
+
}
|
|
40
|
+
return utf8(JSON.stringify(value, null, 2), 'text/markdown');
|
|
41
|
+
}
|
|
42
|
+
function renderHtmlHttp(value) {
|
|
43
|
+
if (typeof value === 'string') {
|
|
44
|
+
return utf8(value, 'text/html');
|
|
45
|
+
}
|
|
46
|
+
if (Array.isArray(value) && value.length > 0 && typeof value[0] === 'object') {
|
|
47
|
+
const rows = value;
|
|
48
|
+
const cols = Array.from(rows.reduce((acc, r) => {
|
|
49
|
+
Object.keys(r).forEach((k) => acc.add(k));
|
|
50
|
+
return acc;
|
|
51
|
+
}, new Set()));
|
|
52
|
+
const head = `<thead><tr>${cols.map((c) => `<th>${escapeHtml(c)}</th>`).join('')}</tr></thead>`;
|
|
53
|
+
const body = `<tbody>${rows
|
|
54
|
+
.map((r) => `<tr>${cols.map((c) => `<td>${escapeHtml(formatCell(r[c]))}</td>`).join('')}</tr>`)
|
|
55
|
+
.join('')}</tbody>`;
|
|
56
|
+
return utf8(`<!doctype html><meta charset="utf-8"><table>${head}${body}</table>`, 'text/html');
|
|
57
|
+
}
|
|
58
|
+
return utf8(`<!doctype html><meta charset="utf-8"><pre>${escapeHtml(JSON.stringify(value, null, 2))}</pre>`, 'text/html');
|
|
59
|
+
}
|
|
60
|
+
function renderCsvHttp(value) {
|
|
61
|
+
if (!Array.isArray(value) || value.length === 0 || typeof value[0] !== 'object') {
|
|
62
|
+
// CSV only meaningful for tabular arrays. Returning undefined lets the
|
|
63
|
+
// negotiator fall through to the next preference (or JSON).
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
const rows = value;
|
|
67
|
+
const cols = Array.from(rows.reduce((acc, r) => {
|
|
68
|
+
Object.keys(r).forEach((k) => acc.add(k));
|
|
69
|
+
return acc;
|
|
70
|
+
}, new Set()));
|
|
71
|
+
const header = cols.map(csvEscape).join(',');
|
|
72
|
+
const lines = rows.map((r) => cols.map((c) => csvEscape(formatCell(r[c]))).join(','));
|
|
73
|
+
return utf8([header, ...lines].join('\n') + '\n', 'text/csv');
|
|
74
|
+
}
|
|
75
|
+
function renderYamlHttp(value) {
|
|
76
|
+
return utf8(yamlStringify(value), 'text/yaml');
|
|
77
|
+
}
|
|
78
|
+
function renderXmlHttp(value) {
|
|
79
|
+
return utf8(`<?xml version="1.0" encoding="UTF-8"?>\n${xmlStringify('root', value)}`, 'application/xml');
|
|
80
|
+
}
|
|
81
|
+
function renderTableHttp(value) {
|
|
82
|
+
// @format table renders as HTML by default for HTTP target.
|
|
83
|
+
return renderHtmlHttp(value);
|
|
84
|
+
}
|
|
85
|
+
// ── Helpers ──
|
|
86
|
+
function formatCell(v) {
|
|
87
|
+
if (v === null || v === undefined)
|
|
88
|
+
return '';
|
|
89
|
+
if (typeof v === 'object')
|
|
90
|
+
return JSON.stringify(v);
|
|
91
|
+
if (typeof v === 'string')
|
|
92
|
+
return v;
|
|
93
|
+
if (typeof v === 'number' || typeof v === 'boolean' || typeof v === 'bigint')
|
|
94
|
+
return v.toString();
|
|
95
|
+
return JSON.stringify(v);
|
|
96
|
+
}
|
|
97
|
+
function escapeHtml(s) {
|
|
98
|
+
return s
|
|
99
|
+
.replace(/&/g, '&')
|
|
100
|
+
.replace(/</g, '<')
|
|
101
|
+
.replace(/>/g, '>')
|
|
102
|
+
.replace(/"/g, '"')
|
|
103
|
+
.replace(/'/g, ''');
|
|
104
|
+
}
|
|
105
|
+
function csvEscape(s) {
|
|
106
|
+
if (/[",\n\r]/.test(s)) {
|
|
107
|
+
return `"${s.replace(/"/g, '""')}"`;
|
|
108
|
+
}
|
|
109
|
+
return s;
|
|
110
|
+
}
|
|
111
|
+
function yamlStringify(value, indent = 0) {
|
|
112
|
+
const pad = ' '.repeat(indent);
|
|
113
|
+
if (value === null || value === undefined)
|
|
114
|
+
return `${pad}null`;
|
|
115
|
+
if (typeof value === 'string')
|
|
116
|
+
return value.includes('\n') ? `|-\n${pad} ${value.replace(/\n/g, `\n${pad} `)}` : value;
|
|
117
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
118
|
+
return String(value);
|
|
119
|
+
if (Array.isArray(value)) {
|
|
120
|
+
if (value.length === 0)
|
|
121
|
+
return '[]';
|
|
122
|
+
return value
|
|
123
|
+
.map((v) => `${pad}- ${yamlStringify(v, indent + 1).replace(/^\s+/, '')}`)
|
|
124
|
+
.join('\n');
|
|
125
|
+
}
|
|
126
|
+
if (typeof value === 'object') {
|
|
127
|
+
const entries = Object.entries(value);
|
|
128
|
+
if (entries.length === 0)
|
|
129
|
+
return '{}';
|
|
130
|
+
return entries
|
|
131
|
+
.map(([k, v]) => {
|
|
132
|
+
const rendered = yamlStringify(v, indent + 1);
|
|
133
|
+
if (typeof v === 'object' && v !== null) {
|
|
134
|
+
return `${pad}${k}:\n${rendered}`;
|
|
135
|
+
}
|
|
136
|
+
return `${pad}${k}: ${rendered}`;
|
|
137
|
+
})
|
|
138
|
+
.join('\n');
|
|
139
|
+
}
|
|
140
|
+
// Symbol / function — last resort.
|
|
141
|
+
return JSON.stringify(value) ?? '';
|
|
142
|
+
}
|
|
143
|
+
function xmlStringify(tag, value) {
|
|
144
|
+
if (value === null || value === undefined)
|
|
145
|
+
return `<${tag}/>`;
|
|
146
|
+
if (typeof value === 'string') {
|
|
147
|
+
return `<${tag}>${escapeHtml(value)}</${tag}>`;
|
|
148
|
+
}
|
|
149
|
+
if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {
|
|
150
|
+
return `<${tag}>${escapeHtml(value.toString())}</${tag}>`;
|
|
151
|
+
}
|
|
152
|
+
if (typeof value !== 'object') {
|
|
153
|
+
return `<${tag}>${escapeHtml(JSON.stringify(value) ?? '')}</${tag}>`;
|
|
154
|
+
}
|
|
155
|
+
if (Array.isArray(value)) {
|
|
156
|
+
return `<${tag}>${value.map((v) => xmlStringify('item', v)).join('')}</${tag}>`;
|
|
157
|
+
}
|
|
158
|
+
const entries = Object.entries(value);
|
|
159
|
+
return `<${tag}>${entries.map(([k, v]) => xmlStringify(k, v)).join('')}</${tag}>`;
|
|
160
|
+
}
|
|
161
|
+
// ── Registration ──
|
|
162
|
+
export function seedDefaultFormats(registry) {
|
|
163
|
+
const specs = [
|
|
164
|
+
{
|
|
165
|
+
name: 'json',
|
|
166
|
+
primaryTarget: 'http',
|
|
167
|
+
httpMime: 'application/json',
|
|
168
|
+
isCanonicalForMime: true,
|
|
169
|
+
render: { http: renderJsonHttp },
|
|
170
|
+
fallback: 'json',
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: 'plain',
|
|
174
|
+
primaryTarget: 'cli',
|
|
175
|
+
httpMime: 'text/plain',
|
|
176
|
+
isCanonicalForMime: true,
|
|
177
|
+
render: { http: renderPlainHttp },
|
|
178
|
+
fallback: 'json',
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
name: 'markdown',
|
|
182
|
+
primaryTarget: 'cli',
|
|
183
|
+
httpMime: 'text/markdown',
|
|
184
|
+
isCanonicalForMime: true,
|
|
185
|
+
render: { http: renderMarkdownHttp },
|
|
186
|
+
fallback: 'json',
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
name: 'html',
|
|
190
|
+
primaryTarget: 'http',
|
|
191
|
+
httpMime: 'text/html',
|
|
192
|
+
isCanonicalForMime: true,
|
|
193
|
+
render: { http: renderHtmlHttp },
|
|
194
|
+
fallback: 'json',
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
name: 'table',
|
|
198
|
+
primaryTarget: 'beam',
|
|
199
|
+
httpMime: 'text/html',
|
|
200
|
+
isCanonicalForMime: false,
|
|
201
|
+
render: { http: renderTableHttp },
|
|
202
|
+
fallback: 'json',
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
name: 'csv',
|
|
206
|
+
primaryTarget: 'http',
|
|
207
|
+
httpMime: 'text/csv',
|
|
208
|
+
isCanonicalForMime: true,
|
|
209
|
+
render: {
|
|
210
|
+
http: (value) => renderCsvHttp(value) ?? {
|
|
211
|
+
body: JSON.stringify(value),
|
|
212
|
+
mime: 'application/json; charset=utf-8',
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
fallback: 'json',
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
name: 'yaml',
|
|
219
|
+
primaryTarget: 'cli',
|
|
220
|
+
httpMime: 'text/yaml',
|
|
221
|
+
isCanonicalForMime: true,
|
|
222
|
+
render: { http: renderYamlHttp },
|
|
223
|
+
fallback: 'json',
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
name: 'xml',
|
|
227
|
+
primaryTarget: 'cli',
|
|
228
|
+
httpMime: 'application/xml',
|
|
229
|
+
isCanonicalForMime: true,
|
|
230
|
+
render: { http: renderXmlHttp },
|
|
231
|
+
fallback: 'json',
|
|
232
|
+
},
|
|
233
|
+
];
|
|
234
|
+
for (const spec of specs)
|
|
235
|
+
registry.register(spec);
|
|
236
|
+
}
|
|
237
|
+
/** Singleton registry preloaded with built-ins. Use this from server code. */
|
|
238
|
+
let _shared;
|
|
239
|
+
export function getDefaultRegistry() {
|
|
240
|
+
if (!_shared) {
|
|
241
|
+
_shared = new FormatRegistry();
|
|
242
|
+
seedDefaultFormats(_shared);
|
|
243
|
+
}
|
|
244
|
+
return _shared;
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/format/seed.ts"],"names":[],"mappings":"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"}
|
package/dist/loader.d.ts
CHANGED
|
@@ -103,6 +103,14 @@ export declare class PhotonLoader {
|
|
|
103
103
|
* Set MCP client factory for enabling this.mcp() in Photons
|
|
104
104
|
*/
|
|
105
105
|
setMCPClientFactory(factory: MCPClientFactory): void;
|
|
106
|
+
/**
|
|
107
|
+
* Notifier wired by PhotonServer so `this.notifyResourceUpdated(uri)`
|
|
108
|
+
* fans out to all subscribed MCP clients (STDIO + SSE sessions).
|
|
109
|
+
* `undefined` outside the MCP-server runtime, in which case the helper is
|
|
110
|
+
* a no-op.
|
|
111
|
+
*/
|
|
112
|
+
private resourceUpdateNotifier?;
|
|
113
|
+
setResourceUpdateNotifier(notifier: (uri: string) => void | Promise<void>): void;
|
|
106
114
|
/**
|
|
107
115
|
* Log message only if verbose mode is enabled
|
|
108
116
|
*/
|
|
@@ -342,6 +350,16 @@ export declare class PhotonLoader {
|
|
|
342
350
|
* context via `this.sample()`.
|
|
343
351
|
*/
|
|
344
352
|
samplingProvider?: SamplingProvider;
|
|
353
|
+
/**
|
|
354
|
+
* MCP roots reported by the connected client. The runtime caches
|
|
355
|
+
* the result of `roots/list` per server and threads the snapshot
|
|
356
|
+
* here so `this.roots` resolves synchronously inside photon code.
|
|
357
|
+
* Refreshed on `notifications/roots/list_changed`.
|
|
358
|
+
*/
|
|
359
|
+
roots?: Array<{
|
|
360
|
+
uri: string;
|
|
361
|
+
name?: string;
|
|
362
|
+
}>;
|
|
345
363
|
caller?: CallerInfo;
|
|
346
364
|
traceId?: string;
|
|
347
365
|
parentTraceparent?: string;
|
package/dist/loader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmCH,OAAO,EAGL,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EAYnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EAWrB,KAAK,gBAAgB,EAgCrB,KAAK,UAAU,EAahB,MAAM,qBAAqB,CAAC;AAsB7B,OAAO,EAAgB,MAAM,EAAiB,MAAM,oBAAoB,CAAC;AA0FzE;;;GAGG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AA0PD,qBAAa,YAAY;IACvB,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,sDAAsD;IACtD,OAAO,CAAC,aAAa,CAA+C;IAEpE,kFAAkF;IAClF,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAGpD,+EAA+E;IAC/E,OAAO,CAAC,oBAAoB,CAAwC;IACpE,4CAA4C;IAC5C,OAAO,CAAC,UAAU,CAA+B;IACjD,yFAAyF;IACzF,OAAO,CAAC,iBAAiB,CAAwC;IACjE,mDAAmD;IACnD,OAAO,CAAC,SAAS,CAAC,CAAkB;IACpC,4DAA4D;IAC5D,OAAO,CAAC,gBAAgB,CAAC,CAA2B;IACpD,iDAAiD;IACjD,OAAO,CAAC,gBAAgB,CAA0B;IAClD,uDAAuD;IACvD,OAAO,CAAC,kBAAkB,CAAC,CAAqB;IAChD,OAAO,CAAC,yBAAyB,CAAC,CAA8B;IAChE,OAAO,CAAC,MAAM,CAAS;IAEvB;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB,CAAwC;IAMlE,gFAAgF;IAChF,OAAO,CAAC,gBAAgB,CAAsC;IAC9D,8EAA8E;IAC9E,OAAO,CAAC,gBAAgB,CAA6C;IAErE,0FAA0F;IAC1F,OAAO,CAAC,oBAAoB,CAGxB;IAEJ;;;OAGG;IACH,gBAAgB,IAAI,MAAM,CACxB,MAAM,EACN;QAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAC/E;IAWD,oEAAoE;IAC7D,OAAO,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACI,sBAAsB,CAAC,EAAE,CAC9B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,kBAAkB,CAAC,EAAE,MAAM,KACxB,OAAO,CAAC,GAAG,CAAC,CAAC;IAElB;;;;;OAKG;IACI,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAEjE;;;;OAIG;IACI,qBAAqB,CAAC,EAAE,GAAG,CAChC,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;IAEF;;;;OAIG;IACI,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;gBAEhC,OAAO,GAAE,OAAe,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAOvE;;;OAGG;YACW,eAAe;YAgBf,qBAAqB;IAgBnC;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAIpD;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB,CAAC,CAAwC;IAEvE,yBAAyB,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIhF;;OAEG;IACH,OAAO,CAAC,GAAG;IAMX;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,kBAAkB;YAIZ,oBAAoB;YAgBpB,UAAU;IAiBxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,gBAAgB;YAIV,eAAe;YAKf,oBAAoB;YAIpB,cAAc;IAK5B;;OAEG;IACH,OAAO,CAAC,yBAAyB;YAInB,sBAAsB;YAWtB,UAAU;IASxB,OAAO,CAAC,iBAAiB;YAeX,uBAAuB;YAiBvB,0BAA0B;IAkFxC,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,MAAM,CAAC,2BAA2B;IA4C1C,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAcnC;;OAEG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAC5D,OAAO,CAAC,mBAAmB,CAAC;IAw1B/B;;;;;OAKG;IACG,cAAc,CAClB,MAAM,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC;QAAC,UAAU,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,EAC5C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAC5D,OAAO,CAAC,mBAAmB,CAAC;IA2Z/B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,cAAc;IAQtB;;OAEG;IACG,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAC5D,OAAO,CAAC,mBAAmB,CAAC;IAgC/B;;;OAGG;YACW,iBAAiB;IAW/B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACH,OAAO,CAAC,OAAO;IAIf;;OAEG;IACH,OAAO,CAAC,UAAU;IAgBlB;;OAEG;IACH,OAAO,CAAC,cAAc;IA0CtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB;;;;OAIG;IACH,OAAO,CAAC,2BAA2B;IAMnC;;OAEG;YACW,YAAY;IAgL1B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;YACW,YAAY;IAY1B;;OAEG;YACW,eAAe;IAW7B;;;;;OAKG;YACW,cAAc;IA2C5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA0B5B;;;;;OAKG;IACG,mBAAmB,CACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAC3C,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,aAAa,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE,GACzE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAgF/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;IACG,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAW7E;;;;;;;OAOG;YACW,oBAAoB;IAiLlC;;;;;;;;OAQG;YACW,YAAY;YAoBZ,gBAAgB;IAqE9B;;;;;OAKG;YACW,iBAAiB;IAkF/B;;;;;;;;OAQG;IACG,oBAAoB,CACxB,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,MAAM,EACxB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,GAAG,CAAC;IAaf;;OAEG;YACW,iBAAiB;YA6BjB,wBAAwB;YAyFxB,qBAAqB;YAQrB,mCAAmC;YA2BnC,sBAAsB;IAmBpC,OAAO,CAAC,0BAA0B;YA2BpB,0BAA0B;YAqC1B,kCAAkC;YA+BlC,iBAAiB;IAgB/B,OAAO,CAAC,iBAAiB;YAiDX,gBAAgB;IAgC9B,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,qBAAqB;YAQf,yBAAyB;YAwBzB,cAAc;IAkC5B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA8D/B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAoLvB;;;;;;;;;;;;OAYG;IACG,WAAW,CACf,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,GAAG,EACf,OAAO,CAAC,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B;;;;WAIG;QACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;QACpC;;;;;WAKG;QACH,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,UAAU,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B,GACA,OAAO,CAAC,GAAG,CAAC;IA2Cf;;;;;OAKG;YACW,iBAAiB;YAkBjB,iBAAiB;IAogB/B,OAAO,CAAC,yBAAyB;IAsDjC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA0C3B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAgG3B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAAO,CAAC,mBAAmB,CAAwC;IAEnE,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,uBAAuB;IAiC/B;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAiG3B;;;;;;;;;;;;;;OAcG;YACW,qBAAqB;IAwDnC;;;;;;;;;;;;;;;OAeG;YACW,oBAAoB;IAsClC;;OAEG;YACW,cAAc;IAU5B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;;;;OAKG;YACW,gBAAgB;IAwB9B;;;;OAIG;YACW,cAAc;IAqB5B;;;;;;;;;OASG;IACH,OAAO,CAAC,sBAAsB;IA8B9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmEzB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CA2B3B"}
|
package/dist/loader.js
CHANGED
|
@@ -7,6 +7,7 @@ import * as fs from 'fs/promises';
|
|
|
7
7
|
import { realpathSync, existsSync, mkdirSync, symlinkSync, readFileSync, statSync, } from 'fs';
|
|
8
8
|
import { readText, readJSON, writeText, writeJSON } from './shared/io.js';
|
|
9
9
|
import { extractHttpRoutesFromSource } from './shared/http-route-extractor.js';
|
|
10
|
+
import { extractExposesFromSource } from './shared/expose-route-extractor.js';
|
|
10
11
|
import { createRequire } from 'module';
|
|
11
12
|
import * as path from 'path';
|
|
12
13
|
import { fileURLToPath, pathToFileURL } from 'url';
|
|
@@ -141,26 +142,46 @@ export function clearRenderZone() {
|
|
|
141
142
|
*/
|
|
142
143
|
function injectEmitHelpers(instance) {
|
|
143
144
|
const emit = (data) => instance.emit(data);
|
|
144
|
-
//
|
|
145
|
-
//
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
145
|
+
// User-declared methods always win — these helpers only fill in when absent.
|
|
146
|
+
// `in` walks the prototype chain so user methods on the class aren't shadowed
|
|
147
|
+
// by injected closures. Without the guards, a photon that declares `@get
|
|
148
|
+
// /status` (or any method named `render`/`toast`/`log`/`progress`/`thinking`)
|
|
149
|
+
// sees its handler clobbered and the dispatcher invokes the emit closure
|
|
150
|
+
// instead, which returns undefined and produces a hung response.
|
|
151
|
+
if (!('render' in instance)) {
|
|
152
|
+
// Mirrors photon-core base-class render(): UI-feedback formats route to
|
|
153
|
+
// their dedicated emit events; all other formats go through the render channel.
|
|
154
|
+
instance.render = (format, value) => {
|
|
155
|
+
if (format === undefined)
|
|
156
|
+
return emit({ emit: 'render:clear' });
|
|
157
|
+
if (format === 'status')
|
|
158
|
+
return emit(typeof value === 'string'
|
|
159
|
+
? { emit: 'status', message: value }
|
|
160
|
+
: { emit: 'status', ...value });
|
|
161
|
+
if (format === 'progress')
|
|
162
|
+
return emit(typeof value === 'number' ? { emit: 'progress', value } : { emit: 'progress', ...value });
|
|
163
|
+
if (format === 'toast')
|
|
164
|
+
return emit(typeof value === 'string'
|
|
165
|
+
? { emit: 'toast', message: value }
|
|
166
|
+
: { emit: 'toast', ...value });
|
|
167
|
+
emit({ emit: 'render', format, value });
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
if (!('toast' in instance)) {
|
|
171
|
+
instance.toast = (message, opts = {}) => emit({ emit: 'toast', message, ...opts });
|
|
172
|
+
}
|
|
173
|
+
if (!('log' in instance)) {
|
|
174
|
+
instance.log = (message, opts = {}) => emit({ emit: 'log', message, level: opts.level ?? 'info', data: opts.data });
|
|
175
|
+
}
|
|
176
|
+
if (!('status' in instance)) {
|
|
177
|
+
instance.status = (message) => emit({ emit: 'status', message });
|
|
178
|
+
}
|
|
179
|
+
if (!('progress' in instance)) {
|
|
180
|
+
instance.progress = (value, message) => emit({ emit: 'progress', value, message });
|
|
181
|
+
}
|
|
182
|
+
if (!('thinking' in instance)) {
|
|
183
|
+
instance.thinking = (active = true) => emit({ emit: 'thinking', active });
|
|
184
|
+
}
|
|
164
185
|
}
|
|
165
186
|
/** Extra regex checks that force 'emit' capability when helper methods are used. */
|
|
166
187
|
function detectEmitHelperUsage(source) {
|
|
@@ -217,6 +238,15 @@ function injectSamplingAndElicitation(instance) {
|
|
|
217
238
|
return await store.inputProvider(params);
|
|
218
239
|
};
|
|
219
240
|
}
|
|
241
|
+
if (!Object.getOwnPropertyDescriptor(Object.getPrototypeOf(instance), 'roots')) {
|
|
242
|
+
Object.defineProperty(instance, 'roots', {
|
|
243
|
+
get() {
|
|
244
|
+
const store = executionContext.getStore();
|
|
245
|
+
return store?.roots ?? [];
|
|
246
|
+
},
|
|
247
|
+
configurable: true,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
220
250
|
if (!instance.sample) {
|
|
221
251
|
instance.sample = async (params) => {
|
|
222
252
|
const store = executionContext.getStore();
|
|
@@ -242,6 +272,37 @@ function injectSamplingAndElicitation(instance) {
|
|
|
242
272
|
};
|
|
243
273
|
}
|
|
244
274
|
}
|
|
275
|
+
/**
|
|
276
|
+
* Inject `this.notifyResourceUpdated(uri)` so `@resource` photon authors can
|
|
277
|
+
* fan out `notifications/resources/updated` to subscribed clients.
|
|
278
|
+
*
|
|
279
|
+
* Unlike sample/elicit/confirm — which fire only inside a tool call and so can
|
|
280
|
+
* read their provider from `executionContext.getStore()` — resource updates
|
|
281
|
+
* commonly fire from setInterval, event handlers, or async paths that resolved
|
|
282
|
+
* after the triggering tool returned. We close over a notifier passed in by
|
|
283
|
+
* the loader (sourced from PhotonServer's SubscriptionRegistry) so the helper
|
|
284
|
+
* keeps working outside the ALS context.
|
|
285
|
+
*
|
|
286
|
+
* No-op if the runtime has no notifier wired (e.g. CLI execution outside an
|
|
287
|
+
* MCP server). User-defined methods on the class win.
|
|
288
|
+
*/
|
|
289
|
+
function injectResourceNotifier(instance, notifier) {
|
|
290
|
+
// Only skip if the instance itself (own property, not via prototype/base
|
|
291
|
+
// class) has a user-defined override. Otherwise install the wired version
|
|
292
|
+
// on the instance, shadowing any base-class default.
|
|
293
|
+
if (Object.prototype.hasOwnProperty.call(instance, 'notifyResourceUpdated'))
|
|
294
|
+
return;
|
|
295
|
+
instance.notifyResourceUpdated = (uri) => {
|
|
296
|
+
if (!notifier)
|
|
297
|
+
return;
|
|
298
|
+
try {
|
|
299
|
+
void notifier(uri);
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
// Notifier failures must never propagate into photon code.
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
}
|
|
245
306
|
/**
|
|
246
307
|
* Render a formatted value in the CLI using @portel/cli's formatOutput.
|
|
247
308
|
* Uses clear-and-replace semantics — each call overwrites the previous render.
|
|
@@ -411,6 +472,16 @@ export class PhotonLoader {
|
|
|
411
472
|
setMCPClientFactory(factory) {
|
|
412
473
|
this.mcpClientFactory = factory;
|
|
413
474
|
}
|
|
475
|
+
/**
|
|
476
|
+
* Notifier wired by PhotonServer so `this.notifyResourceUpdated(uri)`
|
|
477
|
+
* fans out to all subscribed MCP clients (STDIO + SSE sessions).
|
|
478
|
+
* `undefined` outside the MCP-server runtime, in which case the helper is
|
|
479
|
+
* a no-op.
|
|
480
|
+
*/
|
|
481
|
+
resourceUpdateNotifier;
|
|
482
|
+
setResourceUpdateNotifier(notifier) {
|
|
483
|
+
this.resourceUpdateNotifier = notifier;
|
|
484
|
+
}
|
|
414
485
|
/**
|
|
415
486
|
* Log message only if verbose mode is enabled
|
|
416
487
|
*/
|
|
@@ -1074,6 +1145,7 @@ export class PhotonLoader {
|
|
|
1074
1145
|
// philosophy: detection-gate misses mean silent breakage, so don't
|
|
1075
1146
|
// gate cheap capabilities. User-defined methods win.
|
|
1076
1147
|
injectSamplingAndElicitation(instance);
|
|
1148
|
+
injectResourceNotifier(instance, this.resourceUpdateNotifier);
|
|
1077
1149
|
// Always-inject caller getter. The prototype check preserves any
|
|
1078
1150
|
// user-defined getter on the class (e.g. Photon base class has its
|
|
1079
1151
|
// own) so we don't clobber.
|
|
@@ -1303,7 +1375,7 @@ export class PhotonLoader {
|
|
|
1303
1375
|
this.wrapStatefulMethods(instance, tsContent);
|
|
1304
1376
|
}
|
|
1305
1377
|
// Extract tools, templates, and statics (with schema override support)
|
|
1306
|
-
const { tools, templates, statics, settingsSchema, auth: extractedAuth, httpRoutes: extractedHttpRoutes, } = await this.extractTools(MCPClass, absolutePath);
|
|
1378
|
+
const { tools, templates, statics, settingsSchema, auth: extractedAuth, httpRoutes: extractedHttpRoutes, exposes: extractedExposes, } = await this.extractTools(MCPClass, absolutePath);
|
|
1307
1379
|
// ═══ SETTINGS INJECTION ═══
|
|
1308
1380
|
// If the photon declared `protected settings = { ... }`, inject persistence + proxy
|
|
1309
1381
|
if (settingsSchema?.hasSettings &&
|
|
@@ -1357,6 +1429,8 @@ export class PhotonLoader {
|
|
|
1357
1429
|
result.auth = extractedAuth;
|
|
1358
1430
|
if (extractedHttpRoutes?.length)
|
|
1359
1431
|
result._httpRoutes = extractedHttpRoutes;
|
|
1432
|
+
if (extractedExposes?.length)
|
|
1433
|
+
result._exposes = extractedExposes;
|
|
1360
1434
|
// Store class constructor for static method access
|
|
1361
1435
|
result.classConstructor = MCPClass;
|
|
1362
1436
|
// Store settings schema for Beam UI
|
|
@@ -1595,6 +1669,7 @@ export class PhotonLoader {
|
|
|
1595
1669
|
}
|
|
1596
1670
|
// Always-inject sample/confirm/elicit (see primary load path).
|
|
1597
1671
|
injectSamplingAndElicitation(instance);
|
|
1672
|
+
injectResourceNotifier(instance, this.resourceUpdateNotifier);
|
|
1598
1673
|
}
|
|
1599
1674
|
// Channel event capability: inject on()/off()/_dispatch()/_matchesFilter()
|
|
1600
1675
|
// when source uses this._dispatch( — the universal channel dispatch pattern.
|
|
@@ -1660,7 +1735,7 @@ export class PhotonLoader {
|
|
|
1660
1735
|
// Call lifecycle hook
|
|
1661
1736
|
await this.invokeInitialize(instance, name, options);
|
|
1662
1737
|
// Extract tools and metadata from embedded source (no disk I/O)
|
|
1663
|
-
const { tools, templates, statics, settingsSchema, auth: extractedAuth, httpRoutes: extractedHttpRoutes, } = await this.extractTools(MCPClass, absolutePath, tsContent);
|
|
1738
|
+
const { tools, templates, statics, settingsSchema, auth: extractedAuth, httpRoutes: extractedHttpRoutes, exposes: extractedExposes, } = await this.extractTools(MCPClass, absolutePath, tsContent);
|
|
1664
1739
|
// Settings injection
|
|
1665
1740
|
if (settingsSchema?.hasSettings && instance.settings && typeof instance.settings === 'object') {
|
|
1666
1741
|
const instanceName = options?.instanceName || 'default';
|
|
@@ -1694,6 +1769,8 @@ export class PhotonLoader {
|
|
|
1694
1769
|
result.auth = extractedAuth;
|
|
1695
1770
|
if (extractedHttpRoutes?.length)
|
|
1696
1771
|
result._httpRoutes = extractedHttpRoutes;
|
|
1772
|
+
if (extractedExposes?.length)
|
|
1773
|
+
result._exposes = extractedExposes;
|
|
1697
1774
|
result.classConstructor = MCPClass;
|
|
1698
1775
|
if (settingsSchema?.hasSettings) {
|
|
1699
1776
|
result.settingsSchema = settingsSchema;
|
|
@@ -1954,6 +2031,15 @@ export class PhotonLoader {
|
|
|
1954
2031
|
}
|
|
1955
2032
|
});
|
|
1956
2033
|
}
|
|
2034
|
+
// Track C: capture @expose'd methods so the runtime dispatcher
|
|
2035
|
+
// can auto-bind them at /api/<kebab>. We only honour declarations
|
|
2036
|
+
// for methods the class actually defines (mirrors the tool/route
|
|
2037
|
+
// filter above) so a stray comment never opens a phantom
|
|
2038
|
+
// endpoint. Methods that already carry an explicit @get/@post are
|
|
2039
|
+
// excluded so the user's path/verb wins — the auto-RPC slot only
|
|
2040
|
+
// fills *unclaimed* spots.
|
|
2041
|
+
const httpRouteHandlers = new Set(httpRoutesFromSource.map((r) => r.handler));
|
|
2042
|
+
const exposesFromSource = extractExposesFromSource(source).filter((e) => methodNames.includes(e.handler) && !httpRouteHandlers.has(e.handler));
|
|
1957
2043
|
return {
|
|
1958
2044
|
tools,
|
|
1959
2045
|
templates,
|
|
@@ -1961,6 +2047,7 @@ export class PhotonLoader {
|
|
|
1961
2047
|
settingsSchema: metadata.settingsSchema,
|
|
1962
2048
|
auth: this.extractAuthTag(source),
|
|
1963
2049
|
httpRoutes: httpRoutesFromSource.length ? httpRoutesFromSource : undefined,
|
|
2050
|
+
exposes: exposesFromSource.length ? exposesFromSource : undefined,
|
|
1964
2051
|
};
|
|
1965
2052
|
}
|
|
1966
2053
|
throw jsonError;
|
|
@@ -3262,6 +3349,26 @@ Run: photon mcp ${mcpName} --config
|
|
|
3262
3349
|
}
|
|
3263
3350
|
}
|
|
3264
3351
|
}
|
|
3352
|
+
// Track C: auth → instance binding. For `@stateful` photons with an
|
|
3353
|
+
// `@auth` scheme, derive `_targetInstance` from the caller's claims
|
|
3354
|
+
// so each authenticated user lands on a disjoint per-user instance.
|
|
3355
|
+
// Existing `_targetInstance` on the call wins (explicit overrides
|
|
3356
|
+
// implicit). Standalone `photon mcp` is single-tenant — this only
|
|
3357
|
+
// takes effect via the daemon and streamable-HTTP transport, which
|
|
3358
|
+
// both consume `_targetInstance` to route the call.
|
|
3359
|
+
if (photonAuth &&
|
|
3360
|
+
isStateful &&
|
|
3361
|
+
options?.caller?.claims &&
|
|
3362
|
+
parameters &&
|
|
3363
|
+
typeof parameters === 'object' &&
|
|
3364
|
+
!('_targetInstance' in parameters)) {
|
|
3365
|
+
const { resolveInstanceFromClaims, parseAuthDirective } = await import('./shared/instance-binding.js');
|
|
3366
|
+
const { scheme, claim } = parseAuthDirective(photonAuth);
|
|
3367
|
+
const bound = resolveInstanceFromClaims(scheme, options.caller.claims, claim);
|
|
3368
|
+
if (bound) {
|
|
3369
|
+
parameters._targetInstance = bound;
|
|
3370
|
+
}
|
|
3371
|
+
}
|
|
3265
3372
|
// Intercept auto-generated settings tool
|
|
3266
3373
|
if (toolName === 'settings' && mcp.instance._settingsBacking) {
|
|
3267
3374
|
const result = await this.executeSettingsTool(mcp.instance, parameters, {
|
|
@@ -3482,6 +3589,7 @@ Run: photon mcp ${mcpName} --config
|
|
|
3482
3589
|
caller: options?.caller,
|
|
3483
3590
|
inputProvider,
|
|
3484
3591
|
samplingProvider: options?.samplingProvider,
|
|
3592
|
+
roots: options?.roots,
|
|
3485
3593
|
}, () => {
|
|
3486
3594
|
return method.call(mcp.instance, ...args);
|
|
3487
3595
|
});
|