@portel/photon 1.23.0 → 1.24.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 +66 -0
- package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
- package/dist/auto-ui/streamable-http-transport.js +262 -18
- package/dist/auto-ui/streamable-http-transport.js.map +1 -1
- package/dist/beam.bundle.js +58287 -56177
- package/dist/beam.bundle.js.map +4 -4
- package/dist/capability-negotiator.d.ts +9 -0
- package/dist/capability-negotiator.d.ts.map +1 -1
- package/dist/capability-negotiator.js +14 -0
- package/dist/capability-negotiator.js.map +1 -1
- package/dist/cli/commands/claim.d.ts +17 -0
- package/dist/cli/commands/claim.d.ts.map +1 -0
- package/dist/cli/commands/claim.js +124 -0
- package/dist/cli/commands/claim.js.map +1 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +2 -0
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/daemon/claims.d.ts +108 -0
- package/dist/daemon/claims.d.ts.map +1 -0
- package/dist/daemon/claims.js +245 -0
- package/dist/daemon/claims.js.map +1 -0
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +15 -29
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/cron.d.ts +36 -0
- package/dist/daemon/cron.d.ts.map +1 -0
- package/dist/daemon/cron.js +216 -0
- package/dist/daemon/cron.js.map +1 -0
- package/dist/daemon/schedule-loader.d.ts +76 -0
- package/dist/daemon/schedule-loader.d.ts.map +1 -0
- package/dist/daemon/schedule-loader.js +124 -0
- package/dist/daemon/schedule-loader.js.map +1 -0
- package/dist/daemon/server.js +76 -226
- package/dist/daemon/server.js.map +1 -1
- package/dist/deploy/cloudflare.d.ts.map +1 -1
- package/dist/deploy/cloudflare.js +68 -3
- package/dist/deploy/cloudflare.js.map +1 -1
- package/dist/loader.d.ts +22 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +162 -7
- package/dist/loader.js.map +1 -1
- package/dist/photon-cli-runner.d.ts.map +1 -1
- package/dist/photon-cli-runner.js +17 -0
- package/dist/photon-cli-runner.js.map +1 -1
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +50 -1
- package/dist/server.js.map +1 -1
- package/dist/shared/memory-sqlite.d.ts +37 -0
- package/dist/shared/memory-sqlite.d.ts.map +1 -0
- package/dist/shared/memory-sqlite.js +143 -0
- package/dist/shared/memory-sqlite.js.map +1 -0
- package/dist/shared/sqlite-runtime.d.ts.map +1 -1
- package/dist/shared/sqlite-runtime.js +12 -2
- package/dist/shared/sqlite-runtime.js.map +1 -1
- package/dist/tsx-compiler.d.ts.map +1 -1
- package/dist/tsx-compiler.js +18 -1
- package/dist/tsx-compiler.js.map +1 -1
- package/package.json +6 -2
- package/templates/cloudflare/worker.ts.template +44 -73
|
@@ -42,8 +42,18 @@ export async function loadSqliteCtor() {
|
|
|
42
42
|
cachedCtor = (mod.default ?? mod);
|
|
43
43
|
return cachedCtor;
|
|
44
44
|
}
|
|
45
|
-
catch {
|
|
46
|
-
|
|
45
|
+
catch (err) {
|
|
46
|
+
// Two common causes: not installed, or install script was blocked by
|
|
47
|
+
// Bun's default trust gate so the native binding never compiled.
|
|
48
|
+
// Surface both with copy-pasteable fix commands.
|
|
49
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
50
|
+
const looksTrustBlocked = /MODULE_NOT_FOUND|Cannot find module|find the prebuilt|ELIFECYCLE|postinstall/i.test(msg);
|
|
51
|
+
throw new Error(looksTrustBlocked
|
|
52
|
+
? 'SQLite backend requires better-sqlite3 but its install script was blocked.\n' +
|
|
53
|
+
' Fix (Bun): bun pm -g trust better-sqlite3\n' +
|
|
54
|
+
' Fix (npm): npm rebuild better-sqlite3\n' +
|
|
55
|
+
' Under Bun, bun:sqlite works out of the box without better-sqlite3.'
|
|
56
|
+
: 'SQLite not available on Node: install with `npm install better-sqlite3`. Under Bun no install is needed (bun:sqlite is built in).');
|
|
47
57
|
}
|
|
48
58
|
}
|
|
49
59
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-runtime.js","sourceRoot":"","sources":["../../src/shared/sqlite-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,IAAI,UAAU,GAAsB,IAAI,CAAC;AACzC,IAAI,aAAa,GAA0B,IAAI,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,8DAA8D;IAC9D,MAAM,MAAM,GAAG,OAAQ,UAAkB,CAAC,GAAG,KAAK,WAAW,CAAC;IAC9D,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAClC,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,aAAa,GAAG,OAAO,CAAC;IAExB,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,8DAA8D;QAC9D,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;QAC9C,UAAU,GAAG,GAAG,CAAC,QAAsB,CAAC;QACxC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,CAAC;QACH,8DAA8D;QAC9D,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAClD,UAAU,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAe,CAAC;QAChD,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite-runtime.js","sourceRoot":"","sources":["../../src/shared/sqlite-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tsx-compiler.d.ts","sourceRoot":"","sources":["../src/tsx-compiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"tsx-compiler.d.ts","sourceRoot":"","sources":["../src/tsx-compiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA4MH;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUlE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASxE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUvD"}
|
package/dist/tsx-compiler.js
CHANGED
|
@@ -152,11 +152,28 @@ ${js}
|
|
|
152
152
|
</body>
|
|
153
153
|
</html>`;
|
|
154
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* Detect the "esbuild binary not installed" failure shape. Fires when
|
|
157
|
+
* Bun blocked esbuild's postinstall (default for non-trusted packages),
|
|
158
|
+
* so the platform-specific native binary was never downloaded. The
|
|
159
|
+
* message is actionable rather than mysterious.
|
|
160
|
+
*/
|
|
161
|
+
function esbuildBinaryMissingHint(message) {
|
|
162
|
+
if (/binary was not found|Cannot find module '@esbuild\/|prebuilt|ELIFECYCLE|postinstall/i.test(message)) {
|
|
163
|
+
return ('esbuild native binary is missing — its install script was blocked.\n' +
|
|
164
|
+
' Fix (Bun): bun pm -g trust esbuild\n' +
|
|
165
|
+
' Fix (npm): npm rebuild esbuild\n' +
|
|
166
|
+
'This blocks .tsx view compilation and `photon build`. Other commands still work.');
|
|
167
|
+
}
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
155
170
|
/**
|
|
156
171
|
* Wrap an esbuild error in a developer-friendly HTML error page.
|
|
157
172
|
*/
|
|
158
173
|
function wrapError(filePath, error) {
|
|
159
|
-
const
|
|
174
|
+
const rawMessage = error instanceof Error ? error.message : String(error);
|
|
175
|
+
const hint = esbuildBinaryMissingHint(rawMessage);
|
|
176
|
+
const message = hint ? `${hint}\n\nOriginal error:\n${rawMessage}` : rawMessage;
|
|
160
177
|
const escaped = message.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
161
178
|
return `<!doctype html>
|
|
162
179
|
<html lang="en">
|
package/dist/tsx-compiler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tsx-compiler.js","sourceRoot":"","sources":["../src/tsx-compiler.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tsx-compiler.js","sourceRoot":"","sources":["../src/tsx-compiler.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.24.0",
|
|
4
4
|
"description": "You focus on the business logic. We'll enable the rest. Build MCP servers and CLI tools in a single TypeScript file.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
"@modelcontextprotocol/ext-apps": "^1.0.1",
|
|
114
114
|
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
115
115
|
"@portel/cli": "^1.1.0",
|
|
116
|
-
"@portel/photon-core": "^2.
|
|
116
|
+
"@portel/photon-core": "^2.25.0",
|
|
117
117
|
"boxen": "^8.0.1",
|
|
118
118
|
"chalk": "^5.4.1",
|
|
119
119
|
"chart.js": "^4.5.1",
|
|
@@ -129,6 +129,10 @@
|
|
|
129
129
|
"optionalDependencies": {
|
|
130
130
|
"better-sqlite3": "^12.9.0"
|
|
131
131
|
},
|
|
132
|
+
"trustedDependencies": [
|
|
133
|
+
"better-sqlite3",
|
|
134
|
+
"esbuild"
|
|
135
|
+
],
|
|
132
136
|
"devDependencies": {
|
|
133
137
|
"@codemirror/autocomplete": "^6.20.0",
|
|
134
138
|
"@codemirror/commands": "^6.10.1",
|
|
@@ -11,13 +11,6 @@ interface Env {
|
|
|
11
11
|
[key: string]: string | undefined;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
type SSESession = {
|
|
15
|
-
writer: WritableStreamDefaultWriter<Uint8Array>;
|
|
16
|
-
encoder: TextEncoder;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const sessions = new Map<string, SSESession>();
|
|
20
|
-
|
|
21
14
|
// Tool definitions extracted at build time
|
|
22
15
|
// @ts-ignore - Will be replaced during build
|
|
23
16
|
const TOOL_DEFINITIONS: any[] = __TOOL_DEFINITIONS__;
|
|
@@ -100,66 +93,34 @@ async function handleMCPRequest(request: any, env: Env): Promise<any> {
|
|
|
100
93
|
}
|
|
101
94
|
|
|
102
95
|
// SSE stream handler
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
clearInterval(interval);
|
|
121
|
-
}
|
|
122
|
-
}, 30000);
|
|
123
|
-
|
|
124
|
-
// Cleanup on close
|
|
125
|
-
request.signal.addEventListener('abort', () => {
|
|
126
|
-
clearInterval(interval);
|
|
127
|
-
sessions.delete(sessionId);
|
|
128
|
-
writer.close().catch(() => {});
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
return new Response(readable, {
|
|
132
|
-
headers: {
|
|
133
|
-
'Content-Type': 'text/event-stream',
|
|
134
|
-
'Cache-Control': 'no-cache',
|
|
135
|
-
'Connection': 'keep-alive',
|
|
136
|
-
'Access-Control-Allow-Origin': '*',
|
|
137
|
-
},
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Message handler for SSE
|
|
142
|
-
async function handleMessage(request: Request, env: Env): Promise<Response> {
|
|
143
|
-
const url = new URL(request.url);
|
|
144
|
-
const sessionId = url.searchParams.get('sessionId');
|
|
145
|
-
|
|
146
|
-
if (!sessionId || !sessions.has(sessionId)) {
|
|
147
|
-
return new Response('Invalid session', { status: 400 });
|
|
96
|
+
/**
|
|
97
|
+
* Stateless MCP Streamable HTTP handler.
|
|
98
|
+
*
|
|
99
|
+
* Each POST /mcp is a complete JSON-RPC exchange: body in, result out, no
|
|
100
|
+
* session state carried across requests. This matches the MCP Streamable
|
|
101
|
+
* HTTP spec's single-endpoint pattern and stays within the Cloudflare
|
|
102
|
+
* Workers free tier (no Durable Objects needed for session storage).
|
|
103
|
+
*/
|
|
104
|
+
async function handleStreamableMCP(request: Request, env: Env): Promise<Response> {
|
|
105
|
+
let body: unknown;
|
|
106
|
+
try {
|
|
107
|
+
body = await request.json();
|
|
108
|
+
} catch (error: any) {
|
|
109
|
+
return Response.json(
|
|
110
|
+
{ jsonrpc: '2.0', id: null, error: { code: -32700, message: `Parse error: ${error?.message ?? String(error)}` } },
|
|
111
|
+
{ status: 400, headers: CORS_HEADERS }
|
|
112
|
+
);
|
|
148
113
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
const body = await request.json();
|
|
152
|
-
const response = await handleMCPRequest(body, env);
|
|
153
|
-
|
|
154
|
-
// Send response via SSE
|
|
155
|
-
const data = `event: message\ndata: ${JSON.stringify(response)}\n\n`;
|
|
156
|
-
await session.writer.write(session.encoder.encode(data));
|
|
157
|
-
|
|
158
|
-
return new Response('OK', {
|
|
159
|
-
headers: { 'Access-Control-Allow-Origin': '*' },
|
|
160
|
-
});
|
|
114
|
+
const result = await handleMCPRequest(body, env);
|
|
115
|
+
return Response.json(result, { headers: CORS_HEADERS });
|
|
161
116
|
}
|
|
162
117
|
|
|
118
|
+
const CORS_HEADERS = {
|
|
119
|
+
'Access-Control-Allow-Origin': '*',
|
|
120
|
+
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
|
|
121
|
+
'Access-Control-Allow-Headers': 'Content-Type, Mcp-Session-Id',
|
|
122
|
+
};
|
|
123
|
+
|
|
163
124
|
// Playground HTML
|
|
164
125
|
function getPlaygroundHTML(): string {
|
|
165
126
|
return `<!DOCTYPE html>
|
|
@@ -324,25 +285,35 @@ export default {
|
|
|
324
285
|
if (url.pathname === '/' && request.method === 'GET') {
|
|
325
286
|
return Response.json({
|
|
326
287
|
name: PHOTON_NAME,
|
|
327
|
-
transport: '
|
|
288
|
+
transport: 'streamable-http',
|
|
328
289
|
runtime: 'cloudflare-workers',
|
|
329
290
|
endpoints: {
|
|
330
|
-
|
|
331
|
-
messages: '/mcp/messages',
|
|
291
|
+
mcp: '/mcp',
|
|
332
292
|
...(DEV_MODE ? { playground: '/playground' } : {}),
|
|
333
293
|
},
|
|
334
294
|
tools: TOOL_DEFINITIONS.length,
|
|
335
295
|
});
|
|
336
296
|
}
|
|
337
297
|
|
|
338
|
-
//
|
|
298
|
+
// MCP Streamable HTTP: one endpoint, stateless per request.
|
|
299
|
+
if (url.pathname === '/mcp' && request.method === 'POST') {
|
|
300
|
+
return handleStreamableMCP(request, env);
|
|
301
|
+
}
|
|
339
302
|
if (url.pathname === '/mcp' && request.method === 'GET') {
|
|
340
|
-
|
|
303
|
+
// Spec-compliant no-op: clients that open an SSE stream for server
|
|
304
|
+
// notifications get a valid empty stream. We do not push anything
|
|
305
|
+
// server-initiated from a stateless Worker.
|
|
306
|
+
return new Response(': streamable-http\n\n', {
|
|
307
|
+
headers: {
|
|
308
|
+
'Content-Type': 'text/event-stream',
|
|
309
|
+
'Cache-Control': 'no-cache',
|
|
310
|
+
...CORS_HEADERS,
|
|
311
|
+
},
|
|
312
|
+
});
|
|
341
313
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
return handleMessage(request, env);
|
|
314
|
+
if (url.pathname === '/mcp' && request.method === 'DELETE') {
|
|
315
|
+
// Session termination: stateless, nothing to clean up.
|
|
316
|
+
return new Response(null, { status: 204, headers: CORS_HEADERS });
|
|
346
317
|
}
|
|
347
318
|
|
|
348
319
|
// Dev-only endpoints
|