@portel/photon 1.34.1 → 1.35.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/a2a/card-generator.js +1 -1
- package/dist/auto-ui/beam/external-mcp.js.map +1 -1
- package/dist/auto-ui/beam/routes/api-browse.d.ts.map +1 -1
- package/dist/auto-ui/beam/routes/api-browse.js +93 -16
- package/dist/auto-ui/beam/routes/api-browse.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 +43 -15
- package/dist/auto-ui/beam/routes/api-config.js.map +1 -1
- package/dist/auto-ui/beam/routes/api-marketplace.js +4 -4
- package/dist/auto-ui/beam/routes/api-marketplace.js.map +1 -1
- package/dist/auto-ui/beam/subscription.d.ts.map +1 -1
- package/dist/auto-ui/beam/subscription.js +4 -1
- package/dist/auto-ui/beam/subscription.js.map +1 -1
- package/dist/auto-ui/beam.d.ts +2 -0
- package/dist/auto-ui/beam.d.ts.map +1 -1
- package/dist/auto-ui/beam.js +73 -3
- package/dist/auto-ui/beam.js.map +1 -1
- package/dist/auto-ui/bridge/renderers.d.ts.map +1 -1
- package/dist/auto-ui/bridge/renderers.js +44 -1
- package/dist/auto-ui/bridge/renderers.js.map +1 -1
- package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
- package/dist/auto-ui/streamable-http-transport.js +5 -3
- package/dist/auto-ui/streamable-http-transport.js.map +1 -1
- package/dist/beam.bundle.js +81 -83
- package/dist/beam.bundle.js.map +3 -3
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +3 -1
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/ps.d.ts +2 -4
- package/dist/cli/commands/ps.d.ts.map +1 -1
- package/dist/cli/commands/ps.js +5 -11
- package/dist/cli/commands/ps.js.map +1 -1
- package/dist/cli-alias.js +1 -0
- package/dist/cli-alias.js.map +1 -1
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +31 -19
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/manager.d.ts.map +1 -1
- package/dist/daemon/manager.js +9 -0
- package/dist/daemon/manager.js.map +1 -1
- package/dist/daemon/registry-keys.d.ts +6 -0
- package/dist/daemon/registry-keys.d.ts.map +1 -1
- package/dist/daemon/registry-keys.js +9 -0
- package/dist/daemon/registry-keys.js.map +1 -1
- package/dist/daemon/server.js +158 -32
- package/dist/daemon/server.js.map +1 -1
- package/dist/deploy/cloudflare.js.map +1 -1
- package/dist/formats/format-registry.d.ts +32 -0
- package/dist/formats/format-registry.d.ts.map +1 -0
- package/dist/formats/format-registry.js +67 -0
- package/dist/formats/format-registry.js.map +1 -0
- package/dist/loader.d.ts +6 -0
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +121 -30
- package/dist/loader.js.map +1 -1
- package/dist/marketplace-manager.js +1 -1
- package/dist/marketplace-manager.js.map +1 -1
- package/dist/photon-cli-runner.d.ts.map +1 -1
- package/dist/photon-cli-runner.js +1 -0
- package/dist/photon-cli-runner.js.map +1 -1
- package/dist/serv/auth/http-adapter.d.ts.map +1 -1
- package/dist/serv/auth/http-adapter.js +7 -2
- package/dist/serv/auth/http-adapter.js.map +1 -1
- package/dist/serv/middleware/tenant.d.ts.map +1 -1
- package/dist/serv/middleware/tenant.js +1 -0
- package/dist/serv/middleware/tenant.js.map +1 -1
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +173 -155
- package/dist/server.js.map +1 -1
- package/dist/settings-persistence.d.ts +10 -0
- package/dist/settings-persistence.d.ts.map +1 -1
- package/dist/settings-persistence.js +25 -4
- package/dist/settings-persistence.js.map +1 -1
- package/dist/shared/audit.d.ts.map +1 -1
- package/dist/shared/audit.js +2 -1
- package/dist/shared/audit.js.map +1 -1
- package/dist/shared/identity.d.ts +50 -0
- package/dist/shared/identity.d.ts.map +1 -0
- package/dist/shared/identity.js +61 -0
- package/dist/shared/identity.js.map +1 -0
- package/dist/shared/memory-sqlite.d.ts.map +1 -1
- package/dist/shared/memory-sqlite.js +1 -0
- package/dist/shared/memory-sqlite.js.map +1 -1
- package/dist/shared/security.d.ts.map +1 -1
- package/dist/shared/security.js +7 -1
- package/dist/shared/security.js.map +1 -1
- package/dist/shared-utils.d.ts.map +1 -1
- package/dist/shared-utils.js +2 -2
- package/dist/shared-utils.js.map +1 -1
- package/dist/tasks/store.d.ts.map +1 -1
- package/dist/tasks/store.js +2 -1
- package/dist/tasks/store.js.map +1 -1
- package/dist/telemetry/context.d.ts.map +1 -1
- package/dist/telemetry/context.js +8 -2
- package/dist/telemetry/context.js.map +1 -1
- package/dist/types/server-types.d.ts +12 -0
- package/dist/types/server-types.d.ts.map +1 -1
- package/dist/version-notify.d.ts.map +1 -1
- package/dist/version-notify.js +2 -1
- package/dist/version-notify.js.map +1 -1
- package/package.json +4 -3
- package/templates/cloudflare/worker.ts.template +182 -4
- package/dist/photons/canvas/ui/canvas.photon.html +0 -1493
- package/dist/photons/canvas.photon.d.ts +0 -400
- package/dist/photons/canvas.photon.d.ts.map +0 -1
- package/dist/photons/canvas.photon.js +0 -662
- package/dist/photons/canvas.photon.js.map +0 -1
- package/dist/photons/canvas.photon.ts +0 -814
- package/dist/photons/ui/canvas.photon.html +0 -624
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-notify.js","sourceRoot":"","sources":["../src/version-notify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAQ9C,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AAErD,SAAS,YAAY;IACnB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,qBAAqB,CAAC,CAAC;
|
|
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.
|
|
3
|
+
"version": "1.35.0",
|
|
4
4
|
"description": "Build MCP servers, CLI tools, and web dashboards for AI agents from a single TypeScript file.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "bun@1.2.20",
|
|
@@ -91,7 +91,8 @@
|
|
|
91
91
|
"test:e2e": "bun run build && playwright test",
|
|
92
92
|
"test:e2e:ui": "bun run build && playwright test --ui",
|
|
93
93
|
"test:visual": "bun run build && bun run build:beam && tsx tests/beam/visual/visual.test.ts",
|
|
94
|
-
"test:contracts": "tsx tests/contract/format-coverage.test.ts && tsx tests/contract/schema-contract.test.ts",
|
|
94
|
+
"test:contracts": "tsx tests/contract/format-coverage.test.ts && tsx tests/contract/schema-contract.test.ts && tsx tests/contract/render-dom.test.ts && tsx tests/contract/security-posture.test.ts && tsx tests/contract/coverage-gate.test.ts",
|
|
95
|
+
"test:conformance": "bun run build && tsx tests/conformance/conformance.test.ts",
|
|
95
96
|
"test:a2ui": "bun run build && tsx tests/a2ui-mapper.test.ts && tsx tests/a2ui-e2e.test.ts && tsx tests/a2ui-renderer-script.test.ts",
|
|
96
97
|
"test:dom": "bun run build && bun run build:beam && tsx tests/contract/dom-structure.test.ts",
|
|
97
98
|
"test:promises": "bun run build && bun run build:beam && tsx tests/promises.test.ts",
|
|
@@ -140,7 +141,7 @@
|
|
|
140
141
|
"@modelcontextprotocol/ext-apps": "^1.0.1",
|
|
141
142
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
142
143
|
"@portel/cli": "^1.1.0",
|
|
143
|
-
"@portel/photon-core": "^2.27.
|
|
144
|
+
"@portel/photon-core": "^2.27.1",
|
|
144
145
|
"boxen": "^8.0.1",
|
|
145
146
|
"chalk": "^5.4.1",
|
|
146
147
|
"chart.js": "^4.5.1",
|
|
@@ -138,6 +138,166 @@ function createMemoryProxy(ctx: DurableObjectState) {
|
|
|
138
138
|
};
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
142
|
+
// Data provider — ctx.storage backing for this.data
|
|
143
|
+
// ════════════════════════════════════════════════════════════════════════════
|
|
144
|
+
|
|
145
|
+
function dataSegment(value: string): string {
|
|
146
|
+
return encodeURIComponent(value).replace(/%/g, '~') || '_';
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function dataPrefix(photonName: string, scope: string, kind: 'table' | 'log', name: string): string {
|
|
150
|
+
const sessionId = requestContext.getStore()?.sessionId;
|
|
151
|
+
const scoped =
|
|
152
|
+
scope === 'photon'
|
|
153
|
+
? `photon:${dataSegment(photonName)}`
|
|
154
|
+
: scope === 'session' && sessionId
|
|
155
|
+
? `session:${dataSegment(sessionId)}:${dataSegment(photonName)}`
|
|
156
|
+
: (() => {
|
|
157
|
+
if (scope === 'global') {
|
|
158
|
+
throw new Error(
|
|
159
|
+
'Global-scoped data on Cloudflare requires a shared global data Durable Object binding'
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
throw new Error(
|
|
163
|
+
'Session-scoped data requires Mcp-Session-Id in the Cloudflare request context'
|
|
164
|
+
);
|
|
165
|
+
})();
|
|
166
|
+
return `data:${scoped}:${kind}:${dataSegment(name)}:`;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function createDataProvider(ctx: DurableObjectState, photonName: string) {
|
|
170
|
+
const cursorOffset = (cursor: string | number | null | undefined): number => {
|
|
171
|
+
if (cursor === null || cursor === undefined || cursor === '') return 0;
|
|
172
|
+
const parsed = Number(cursor);
|
|
173
|
+
return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : 0;
|
|
174
|
+
};
|
|
175
|
+
const safeLimit = (limit: number | undefined, fallback = 100): number => {
|
|
176
|
+
if (limit === undefined) return fallback;
|
|
177
|
+
if (!Number.isFinite(limit) || limit <= 0) return fallback;
|
|
178
|
+
return Math.floor(limit);
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
const table = (name: string, scope = 'photon') => ({
|
|
182
|
+
async get(id: string) {
|
|
183
|
+
const envelope = await ctx.storage.get<any>(
|
|
184
|
+
`${dataPrefix(photonName, scope, 'table', name)}${dataSegment(id)}`
|
|
185
|
+
);
|
|
186
|
+
return envelope === undefined ? null : envelope.value;
|
|
187
|
+
},
|
|
188
|
+
async put(id: string, value: unknown) {
|
|
189
|
+
await ctx.storage.put(
|
|
190
|
+
`${dataPrefix(photonName, scope, 'table', name)}${dataSegment(id)}`,
|
|
191
|
+
{ id, value, updated_at: new Date().toISOString() }
|
|
192
|
+
);
|
|
193
|
+
},
|
|
194
|
+
async delete(id: string) {
|
|
195
|
+
return ctx.storage.delete(`${dataPrefix(photonName, scope, 'table', name)}${dataSegment(id)}`);
|
|
196
|
+
},
|
|
197
|
+
async has(id: string) {
|
|
198
|
+
return (await ctx.storage.get(`${dataPrefix(photonName, scope, 'table', name)}${dataSegment(id)}`)) !== undefined;
|
|
199
|
+
},
|
|
200
|
+
async list(options: { prefix?: string; limit?: number; cursor?: string | number | null } = {}) {
|
|
201
|
+
const prefix = dataPrefix(photonName, scope, 'table', name);
|
|
202
|
+
const rows = Array.from((await ctx.storage.list<any>({ prefix })).values())
|
|
203
|
+
.filter((envelope) => !options.prefix || envelope.id.startsWith(options.prefix))
|
|
204
|
+
.sort((a, b) => String(a.id).localeCompare(String(b.id)));
|
|
205
|
+
const total = rows.length;
|
|
206
|
+
const offset = cursorOffset(options.cursor);
|
|
207
|
+
const limit = safeLimit(options.limit);
|
|
208
|
+
const page = rows.slice(offset, offset + limit);
|
|
209
|
+
return {
|
|
210
|
+
items: page.map((envelope) => ({
|
|
211
|
+
id: envelope.id,
|
|
212
|
+
value: envelope.value,
|
|
213
|
+
updated_at: envelope.updated_at,
|
|
214
|
+
})),
|
|
215
|
+
next_cursor: offset + page.length < total ? String(offset + page.length) : null,
|
|
216
|
+
total,
|
|
217
|
+
};
|
|
218
|
+
},
|
|
219
|
+
async clear() {
|
|
220
|
+
const keys = Array.from((await ctx.storage.list({ prefix: dataPrefix(photonName, scope, 'table', name) })).keys());
|
|
221
|
+
if (keys.length > 0) await ctx.storage.delete(keys);
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
const log = (name: string, scope = 'photon') => {
|
|
226
|
+
const prefix = () => dataPrefix(photonName, scope, 'log', name);
|
|
227
|
+
const metaKey = () => `${prefix()}__meta`;
|
|
228
|
+
const entryKey = (index: number) => `${prefix()}${String(index).padStart(20, '0')}`;
|
|
229
|
+
return {
|
|
230
|
+
async append(value: unknown) {
|
|
231
|
+
const meta = (await ctx.storage.get<{ nextIndex: number }>(metaKey())) ?? { nextIndex: 0 };
|
|
232
|
+
const entry = {
|
|
233
|
+
index: meta.nextIndex,
|
|
234
|
+
value,
|
|
235
|
+
timestamp: new Date().toISOString(),
|
|
236
|
+
};
|
|
237
|
+
await ctx.storage.put(entryKey(entry.index), { value, timestamp: entry.timestamp });
|
|
238
|
+
await ctx.storage.put(metaKey(), { nextIndex: entry.index + 1 });
|
|
239
|
+
return entry;
|
|
240
|
+
},
|
|
241
|
+
async read(options: { after?: string | number; before?: string | number; limit?: number } = {}) {
|
|
242
|
+
const p = prefix();
|
|
243
|
+
const after = options.after === undefined ? -1 : Number(options.after);
|
|
244
|
+
const before = options.before === undefined ? Number.POSITIVE_INFINITY : Number(options.before);
|
|
245
|
+
const entries = Array.from((await ctx.storage.list<any>({ prefix: p })).entries())
|
|
246
|
+
.filter(([key]) => key !== metaKey())
|
|
247
|
+
.map(([key, envelope]) => ({
|
|
248
|
+
index: Number(key.slice(p.length)),
|
|
249
|
+
value: envelope.value,
|
|
250
|
+
timestamp: envelope.timestamp,
|
|
251
|
+
}))
|
|
252
|
+
.filter((entry) => Number.isFinite(entry.index) && entry.index > after && entry.index < before)
|
|
253
|
+
.sort((a, b) => a.index - b.index);
|
|
254
|
+
const total = entries.length;
|
|
255
|
+
const limit = safeLimit(options.limit);
|
|
256
|
+
const page = entries.slice(0, limit);
|
|
257
|
+
return {
|
|
258
|
+
entries: page,
|
|
259
|
+
next_cursor: page.length < total && page.length > 0 ? String(page[page.length - 1].index) : null,
|
|
260
|
+
total,
|
|
261
|
+
};
|
|
262
|
+
},
|
|
263
|
+
async clear() {
|
|
264
|
+
const keys = Array.from((await ctx.storage.list({ prefix: prefix() })).keys());
|
|
265
|
+
if (keys.length > 0) await ctx.storage.delete(keys);
|
|
266
|
+
},
|
|
267
|
+
async delete() {
|
|
268
|
+
await this.clear();
|
|
269
|
+
},
|
|
270
|
+
};
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
return {
|
|
274
|
+
table,
|
|
275
|
+
log,
|
|
276
|
+
get sql() {
|
|
277
|
+
const sql = (ctx.storage as any).sql;
|
|
278
|
+
if (!sql) {
|
|
279
|
+
throw new Error(
|
|
280
|
+
'Data SQL is not available on this Durable Object storage; enable SQLite-backed Durable Objects'
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
return {
|
|
284
|
+
exec: async (query: string, params: unknown[] = []) => {
|
|
285
|
+
const cursor = sql.exec(query, ...params);
|
|
286
|
+
const rows =
|
|
287
|
+
typeof cursor?.toArray === 'function'
|
|
288
|
+
? cursor.toArray()
|
|
289
|
+
: Array.isArray(cursor?.rows)
|
|
290
|
+
? cursor.rows
|
|
291
|
+
: Array.isArray(cursor)
|
|
292
|
+
? cursor
|
|
293
|
+
: [];
|
|
294
|
+
return { rows };
|
|
295
|
+
},
|
|
296
|
+
};
|
|
297
|
+
},
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
|
|
141
301
|
// ════════════════════════════════════════════════════════════════════════════
|
|
142
302
|
// Schedule provider — DO alarm multiplexer
|
|
143
303
|
// ════════════════════════════════════════════════════════════════════════════
|
|
@@ -433,6 +593,13 @@ function withCfCapabilities(
|
|
|
433
593
|
configurable: false,
|
|
434
594
|
});
|
|
435
595
|
|
|
596
|
+
Object.defineProperty(instance, 'data', {
|
|
597
|
+
value: createDataProvider(ctx, photonName),
|
|
598
|
+
writable: false,
|
|
599
|
+
enumerable: false,
|
|
600
|
+
configurable: false,
|
|
601
|
+
});
|
|
602
|
+
|
|
436
603
|
Object.defineProperty(instance, 'emit', {
|
|
437
604
|
value: (event: { emit?: string; [k: string]: unknown }) => {
|
|
438
605
|
// SSE forwarding for in-flight tool calls. When an SSE
|
|
@@ -755,6 +922,8 @@ interface RequestContext {
|
|
|
755
922
|
* the client didn't supply one.
|
|
756
923
|
*/
|
|
757
924
|
progressToken?: string | number;
|
|
925
|
+
/** Client session id from Mcp-Session-Id, used for session-scoped data. */
|
|
926
|
+
sessionId?: string;
|
|
758
927
|
}
|
|
759
928
|
|
|
760
929
|
/**
|
|
@@ -1619,12 +1788,20 @@ abstract class BasePhotonDO extends DurableObject<Env> {
|
|
|
1619
1788
|
// tool calls from JSON-only clients) use the plain JSON path.
|
|
1620
1789
|
const accept = request.headers.get('Accept') ?? '';
|
|
1621
1790
|
const wantsSse = accept.includes('text/event-stream');
|
|
1791
|
+
const sessionId = request.headers.get('Mcp-Session-Id') ?? undefined;
|
|
1622
1792
|
if (body?.method === 'tools/call' && wantsSse) {
|
|
1623
|
-
return mcpAuthContext.run(authContext, () => this._streamToolCall(body));
|
|
1793
|
+
return mcpAuthContext.run(authContext, () => this._streamToolCall(body, sessionId));
|
|
1624
1794
|
}
|
|
1625
1795
|
|
|
1626
|
-
const result = await
|
|
1627
|
-
|
|
1796
|
+
const result = await requestContext.run(
|
|
1797
|
+
{
|
|
1798
|
+
send: async () => {},
|
|
1799
|
+
pendingRequests: this.pendingRequests,
|
|
1800
|
+
sessionId,
|
|
1801
|
+
},
|
|
1802
|
+
() => mcpAuthContext.run(authContext, () =>
|
|
1803
|
+
handleMCPRequest(body, this.photon, this.photonName, this.toolDefinitions)
|
|
1804
|
+
)
|
|
1628
1805
|
);
|
|
1629
1806
|
return Response.json(result, { headers: CORS_HEADERS });
|
|
1630
1807
|
}
|
|
@@ -1635,7 +1812,7 @@ abstract class BasePhotonDO extends DurableObject<Env> {
|
|
|
1635
1812
|
* MCP requests over the same stream and await the client's responses
|
|
1636
1813
|
* (which arrive as separate POST /mcp requests routed by `_handleMcpPost`).
|
|
1637
1814
|
*/
|
|
1638
|
-
private _streamToolCall(rpcRequest: any): Response {
|
|
1815
|
+
private _streamToolCall(rpcRequest: any, sessionId?: string): Response {
|
|
1639
1816
|
this.getPhoton();
|
|
1640
1817
|
const { readable, writable } = new TransformStream();
|
|
1641
1818
|
const writer = writable.getWriter();
|
|
@@ -1653,6 +1830,7 @@ abstract class BasePhotonDO extends DurableObject<Env> {
|
|
|
1653
1830
|
send,
|
|
1654
1831
|
pendingRequests: this.pendingRequests,
|
|
1655
1832
|
progressToken: clientProgressToken ?? `progress_${toolName}`,
|
|
1833
|
+
sessionId,
|
|
1656
1834
|
};
|
|
1657
1835
|
|
|
1658
1836
|
// Fire-and-forget: the response stream stays open as long as the writer
|