@portel/photon 1.28.2 → 1.31.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 +42 -11
- package/dist/asset-resolver.d.ts +44 -0
- package/dist/asset-resolver.d.ts.map +1 -0
- package/dist/asset-resolver.js +105 -0
- package/dist/asset-resolver.js.map +1 -0
- package/dist/auto-ui/beam/external-mcp-manager.d.ts +73 -0
- package/dist/auto-ui/beam/external-mcp-manager.d.ts.map +1 -0
- package/dist/auto-ui/beam/external-mcp-manager.js +65 -0
- package/dist/auto-ui/beam/external-mcp-manager.js.map +1 -0
- package/dist/auto-ui/beam/external-mcp.d.ts.map +1 -1
- package/dist/auto-ui/beam/external-mcp.js +25 -1
- package/dist/auto-ui/beam/external-mcp.js.map +1 -1
- package/dist/auto-ui/beam/photon-management.d.ts.map +1 -1
- package/dist/auto-ui/beam/photon-management.js +11 -8
- package/dist/auto-ui/beam/photon-management.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 +7 -4
- 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 +3 -2
- 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 +6 -2
- package/dist/auto-ui/beam/routes/api-marketplace.js.map +1 -1
- package/dist/auto-ui/beam/startup.js.map +1 -1
- package/dist/auto-ui/beam/types.d.ts +5 -2
- package/dist/auto-ui/beam/types.d.ts.map +1 -1
- package/dist/auto-ui/beam.d.ts.map +1 -1
- package/dist/auto-ui/beam.js +239 -88
- 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 +11 -0
- package/dist/auto-ui/bridge/index.js.map +1 -1
- package/dist/auto-ui/bridge/types.d.ts +2 -0
- package/dist/auto-ui/bridge/types.d.ts.map +1 -1
- package/dist/auto-ui/openapi-generator.js +1 -4
- package/dist/auto-ui/openapi-generator.js.map +1 -1
- package/dist/auto-ui/photon-bridge.d.ts +4 -0
- package/dist/auto-ui/photon-bridge.d.ts.map +1 -1
- package/dist/auto-ui/photon-bridge.js.map +1 -1
- package/dist/auto-ui/photon-host.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 +252 -43
- package/dist/auto-ui/streamable-http-transport.js.map +1 -1
- package/dist/auto-ui/types.d.ts +24 -2
- package/dist/auto-ui/types.d.ts.map +1 -1
- package/dist/auto-ui/types.js.map +1 -1
- package/dist/beam.bundle.js +202 -24
- package/dist/beam.bundle.js.map +3 -3
- package/dist/capability-negotiator.d.ts +39 -1
- package/dist/capability-negotiator.d.ts.map +1 -1
- package/dist/capability-negotiator.js +5 -0
- package/dist/capability-negotiator.js.map +1 -1
- package/dist/cf-bindings-parser.d.ts +15 -0
- package/dist/cf-bindings-parser.d.ts.map +1 -0
- package/dist/cf-bindings-parser.js +98 -0
- package/dist/cf-bindings-parser.js.map +1 -0
- package/dist/cf-usage-scanner.d.ts +76 -0
- package/dist/cf-usage-scanner.d.ts.map +1 -0
- package/dist/cf-usage-scanner.js +179 -0
- package/dist/cf-usage-scanner.js.map +1 -0
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +124 -16
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/cf.d.ts +18 -0
- package/dist/cli/commands/cf.d.ts.map +1 -0
- package/dist/cli/commands/cf.js +207 -0
- package/dist/cli/commands/cf.js.map +1 -0
- package/dist/cli/commands/info.js +1 -1
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +59 -46
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +3 -0
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +43 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +40 -33
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/manager.d.ts +6 -2
- package/dist/daemon/manager.d.ts.map +1 -1
- package/dist/daemon/manager.js +75 -20
- package/dist/daemon/manager.js.map +1 -1
- package/dist/daemon/server.js +69 -11
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/worker-host.js.map +1 -1
- package/dist/deploy/cloudflare.d.ts +27 -0
- package/dist/deploy/cloudflare.d.ts.map +1 -1
- package/dist/deploy/cloudflare.js +210 -3
- 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/embedded-runtime.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 +61 -66
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +315 -327
- package/dist/loader.js.map +1 -1
- package/dist/photon-cli-runner.d.ts.map +1 -1
- package/dist/photon-cli-runner.js +20 -11
- package/dist/photon-cli-runner.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 +55 -15
- 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/runtime/cf-local.d.ts +157 -0
- package/dist/runtime/cf-local.d.ts.map +1 -0
- package/dist/runtime/cf-local.js +406 -0
- package/dist/runtime/cf-local.js.map +1 -0
- package/dist/server.d.ts +117 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +681 -67
- package/dist/server.js.map +1 -1
- package/dist/settings-persistence.d.ts +50 -0
- package/dist/settings-persistence.d.ts.map +1 -0
- package/dist/settings-persistence.js +188 -0
- package/dist/settings-persistence.js.map +1 -0
- 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/audit-sqlite.d.ts.map +1 -1
- package/dist/shared/audit-sqlite.js +0 -1
- package/dist/shared/audit-sqlite.js.map +1 -1
- 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/error-handler.d.ts.map +1 -1
- package/dist/shared/error-handler.js +3 -1
- package/dist/shared/error-handler.js.map +1 -1
- 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/shared/io.d.ts.map +1 -1
- package/dist/shared/io.js +5 -2
- package/dist/shared/io.js.map +1 -1
- package/dist/shared/logger.js.map +1 -1
- package/dist/shared/sqlite-runtime.d.ts.map +1 -1
- package/dist/shared/sqlite-runtime.js +0 -1
- package/dist/shared/sqlite-runtime.js.map +1 -1
- package/dist/task-executor.js.map +1 -1
- package/dist/telemetry/sdk.d.ts.map +1 -1
- package/dist/telemetry/sdk.js +0 -1
- package/dist/telemetry/sdk.js.map +1 -1
- package/dist/test-runner.d.ts.map +1 -1
- package/dist/test-runner.js.map +1 -1
- package/dist/types/server-types.d.ts +16 -7
- package/dist/types/server-types.d.ts.map +1 -1
- package/package.json +14 -4
- package/templates/cloudflare/worker.ts.template +428 -14
- package/templates/cloudflare/wrangler.toml.template +2 -7
- package/templates/photon.template.ts +13 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Cloudflare runtime adapter for the new `Cloudflare` injection
|
|
3
|
+
* surface. Backs `private cf: Cloudflare` constructor params (and the
|
|
4
|
+
* forgiving auto-inject path for plain classes that reference
|
|
5
|
+
* `this.cf.*`) with a miniflare sandbox when a photon runs outside a
|
|
6
|
+
* deployed Worker.
|
|
7
|
+
*
|
|
8
|
+
* Auto-naming rule (single source of truth — `bindingNameFor`):
|
|
9
|
+
* cf.kv() → <photon>_kv
|
|
10
|
+
* cf.kv('x') → <photon>_x_kv
|
|
11
|
+
* cf.ai → AI (shared, single per Worker)
|
|
12
|
+
* cf.images → IMAGES (shared)
|
|
13
|
+
* cf.browser → BROWSER (shared)
|
|
14
|
+
*
|
|
15
|
+
* Photons no longer pick global binding names. The framework derives
|
|
16
|
+
* them from the photon name plus an optional qualifier so per-photon
|
|
17
|
+
* resources never collide.
|
|
18
|
+
*
|
|
19
|
+
* Boot is keyed off the `cf-usage-scanner` output: every literal
|
|
20
|
+
* qualifier the photon uses is configured in miniflare up front, so
|
|
21
|
+
* the first call to a binding doesn't pay a reconfigure cost. Dynamic
|
|
22
|
+
* qualifiers (`cf.kv(this.tenantId)`) only get the default binding
|
|
23
|
+
* unless the author lists overrides in `protected cfBindings`.
|
|
24
|
+
*
|
|
25
|
+
* Storage persists under `<baseDir>/.data/cf-sandbox/<photon>/` so
|
|
26
|
+
* state survives process restarts and matches the Phase A2 layout.
|
|
27
|
+
*/
|
|
28
|
+
import * as path from 'path';
|
|
29
|
+
import { bindingNameFor, } from '@portel/photon-core';
|
|
30
|
+
import { expandScopedBindingNames } from '../cf-usage-scanner.js';
|
|
31
|
+
/**
|
|
32
|
+
* Merge two CfBindingsConfig blobs. Used by the deploy pipeline to
|
|
33
|
+
* stack a per-photon override JSON on top of in-source declarations.
|
|
34
|
+
* Boolean shared flags are last-write-wins; per-binding records merge
|
|
35
|
+
* key-by-key.
|
|
36
|
+
*/
|
|
37
|
+
export function mergeBindings(base, override) {
|
|
38
|
+
const merged = { ...(base ?? {}) };
|
|
39
|
+
if (!override)
|
|
40
|
+
return merged;
|
|
41
|
+
for (const cat of ['kv', 'r2', 'queue', 'vectorize']) {
|
|
42
|
+
const ov = override[cat];
|
|
43
|
+
if (ov) {
|
|
44
|
+
merged[cat] = { ...(merged[cat] ?? {}), ...ov };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (override.d1) {
|
|
48
|
+
merged.d1 = { ...(merged.d1 ?? {}), ...override.d1 };
|
|
49
|
+
}
|
|
50
|
+
for (const cat of ['ai', 'images', 'browser']) {
|
|
51
|
+
if (typeof override[cat] === 'boolean')
|
|
52
|
+
merged[cat] = override[cat];
|
|
53
|
+
}
|
|
54
|
+
return merged;
|
|
55
|
+
}
|
|
56
|
+
const SCOPED = ['kv', 'r2', 'd1', 'queue', 'vectorize'];
|
|
57
|
+
const SHARED_BINDING_NAMES = {
|
|
58
|
+
ai: 'AI',
|
|
59
|
+
images: 'IMAGES',
|
|
60
|
+
browser: 'BROWSER',
|
|
61
|
+
};
|
|
62
|
+
export class CFLocalRuntime {
|
|
63
|
+
mfPromise = null;
|
|
64
|
+
photonName;
|
|
65
|
+
baseDir;
|
|
66
|
+
usage;
|
|
67
|
+
overrides;
|
|
68
|
+
/**
|
|
69
|
+
* Legacy mode means the photon was constructed via the Phase-A2
|
|
70
|
+
* positional `(name, cfBindings, baseDir)` form. In that mode the
|
|
71
|
+
* `qualifier` arg passed to `cf.kv(...)` etc. is treated as a
|
|
72
|
+
* literal binding name (not run through `bindingNameFor`), and
|
|
73
|
+
* miniflare seeds the names declared in `overrides.<category>`.
|
|
74
|
+
* The new options-form constructor flips this to false and the
|
|
75
|
+
* auto-naming convention takes over.
|
|
76
|
+
*/
|
|
77
|
+
legacyMode;
|
|
78
|
+
legacyBooleanFlags;
|
|
79
|
+
constructor(optsOrName, legacyBindings, legacyBaseDir) {
|
|
80
|
+
if (typeof optsOrName === 'string') {
|
|
81
|
+
this.photonName = optsOrName;
|
|
82
|
+
this.baseDir = legacyBaseDir ?? '';
|
|
83
|
+
this.usage = null;
|
|
84
|
+
this.overrides = legacyBindings ?? {};
|
|
85
|
+
this.legacyMode = true;
|
|
86
|
+
this.legacyBooleanFlags = {
|
|
87
|
+
ai: legacyBindings?.ai === true,
|
|
88
|
+
images: legacyBindings?.images === true,
|
|
89
|
+
browser: legacyBindings?.browser === true,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
this.photonName = optsOrName.photonName;
|
|
94
|
+
this.baseDir = optsOrName.baseDir;
|
|
95
|
+
this.usage = optsOrName.usage ?? null;
|
|
96
|
+
this.overrides = optsOrName.overrides ?? {};
|
|
97
|
+
this.legacyMode = false;
|
|
98
|
+
this.legacyBooleanFlags = { ai: false, images: false, browser: false };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Legacy alias retained for callers that built against the Phase-A2 API. */
|
|
102
|
+
getBindings() {
|
|
103
|
+
return this.overrides;
|
|
104
|
+
}
|
|
105
|
+
/** Inspector for tools/CLI: lists every binding miniflare seeded. */
|
|
106
|
+
getSeededBindings() {
|
|
107
|
+
const out = {};
|
|
108
|
+
if (this.legacyMode) {
|
|
109
|
+
// Legacy: seed exactly what `cfBindings` declared, no auto-naming.
|
|
110
|
+
for (const cat of SCOPED) {
|
|
111
|
+
const declared = this.overrides[cat];
|
|
112
|
+
if (!declared) {
|
|
113
|
+
out[cat] = [];
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
out[cat] = Object.keys(declared);
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
if (!this.usage) {
|
|
121
|
+
for (const cat of SCOPED)
|
|
122
|
+
out[cat] = [bindingNameFor(this.photonName, cat)];
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
125
|
+
return expandScopedBindingNames(this.photonName, this.usage);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Resolve the miniflare binding name for a `cf.<cat>(qualifier?)`
|
|
129
|
+
* call. In auto-naming mode runs through `bindingNameFor`; in
|
|
130
|
+
* legacy mode treats the arg as a literal binding name (matching
|
|
131
|
+
* the Phase-A2 `cf.kv(name)` semantics).
|
|
132
|
+
*/
|
|
133
|
+
resolveBindingName(category, qualifier) {
|
|
134
|
+
if (this.legacyMode) {
|
|
135
|
+
// Legacy callers pass the binding name directly. Empty / missing
|
|
136
|
+
// is invalid in this mode (the old API required a name).
|
|
137
|
+
if (!qualifier) {
|
|
138
|
+
throw new Error(`cf.${category}() in legacy mode requires the binding name as an argument ` +
|
|
139
|
+
`(e.g. cf.${category}('cache')). Migrate to the new options-object ` +
|
|
140
|
+
`constructor to use auto-naming.`);
|
|
141
|
+
}
|
|
142
|
+
return qualifier;
|
|
143
|
+
}
|
|
144
|
+
return bindingNameFor(this.photonName, category, qualifier);
|
|
145
|
+
}
|
|
146
|
+
async dispose() {
|
|
147
|
+
if (this.mfPromise) {
|
|
148
|
+
const mf = await this.mfPromise;
|
|
149
|
+
await mf.dispose();
|
|
150
|
+
this.mfPromise = null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// ────────────────────────────────────────────────────────────────
|
|
154
|
+
// Cloudflare interface — scoped categories with auto-naming
|
|
155
|
+
// ────────────────────────────────────────────────────────────────
|
|
156
|
+
kv(qualifier) {
|
|
157
|
+
return this.scopedBinding('kv', qualifier, ['get', 'put', 'delete', 'list']);
|
|
158
|
+
}
|
|
159
|
+
r2(qualifier) {
|
|
160
|
+
return this.scopedBinding('r2', qualifier, [
|
|
161
|
+
'head',
|
|
162
|
+
'get',
|
|
163
|
+
'put',
|
|
164
|
+
'delete',
|
|
165
|
+
'list',
|
|
166
|
+
]);
|
|
167
|
+
}
|
|
168
|
+
d1(qualifier) {
|
|
169
|
+
const name = this.resolveBindingName('d1', qualifier);
|
|
170
|
+
const get = this.getMiniflare.bind(this);
|
|
171
|
+
return {
|
|
172
|
+
prepare: (query) => makeD1PreparedStatement(get, name, query, []),
|
|
173
|
+
batch: async (statements) => {
|
|
174
|
+
const mf = await get();
|
|
175
|
+
const db = (await mf.getD1Database(name));
|
|
176
|
+
const real = await Promise.all(statements.map(async (s) => {
|
|
177
|
+
const candidate = s._materialize;
|
|
178
|
+
return candidate ? candidate() : s;
|
|
179
|
+
}));
|
|
180
|
+
return db.batch(real);
|
|
181
|
+
},
|
|
182
|
+
exec: async (query) => {
|
|
183
|
+
const mf = await get();
|
|
184
|
+
const db = (await mf.getD1Database(name));
|
|
185
|
+
return db.exec(query);
|
|
186
|
+
},
|
|
187
|
+
dump: async () => {
|
|
188
|
+
const mf = await get();
|
|
189
|
+
const db = (await mf.getD1Database(name));
|
|
190
|
+
return db.dump();
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
queue(qualifier) {
|
|
195
|
+
return this.scopedBinding('queue', qualifier, ['send', 'sendBatch']);
|
|
196
|
+
}
|
|
197
|
+
vectorize(qualifier) {
|
|
198
|
+
return this.envBindingProxy(this.resolveBindingName('vectorize', qualifier), [
|
|
199
|
+
'insert',
|
|
200
|
+
'upsert',
|
|
201
|
+
'query',
|
|
202
|
+
'getByIds',
|
|
203
|
+
'deleteByIds',
|
|
204
|
+
]);
|
|
205
|
+
}
|
|
206
|
+
// ────────────────────────────────────────────────────────────────
|
|
207
|
+
// Cloudflare interface — shared categories (single per Worker)
|
|
208
|
+
// ────────────────────────────────────────────────────────────────
|
|
209
|
+
get ai() {
|
|
210
|
+
const enabled = this.usage?.shared.ai === true || this.legacyBooleanFlags.ai;
|
|
211
|
+
if (!enabled) {
|
|
212
|
+
return throwingShared('ai', 'reference this.cf.ai (or cf.ai) somewhere in the photon to enable');
|
|
213
|
+
}
|
|
214
|
+
return this.envBindingProxy(SHARED_BINDING_NAMES.ai, ['run']);
|
|
215
|
+
}
|
|
216
|
+
get images() {
|
|
217
|
+
const enabled = this.usage?.shared.images === true || this.legacyBooleanFlags.images;
|
|
218
|
+
if (!enabled) {
|
|
219
|
+
return throwingShared('images', 'reference this.cf.images (or cf.images) somewhere in the photon to enable');
|
|
220
|
+
}
|
|
221
|
+
return this.envBindingProxy(SHARED_BINDING_NAMES.images, [
|
|
222
|
+
'info',
|
|
223
|
+
'input',
|
|
224
|
+
]);
|
|
225
|
+
}
|
|
226
|
+
get browser() {
|
|
227
|
+
return throwingShared('browser', 'browser rendering requires a Chromium dep and is deferred until a photon dogfoods it');
|
|
228
|
+
}
|
|
229
|
+
fetch(_input, _init) {
|
|
230
|
+
return Promise.reject(new Error('cf.fetch() — not yet supported on the local sandbox. Service-binding ' +
|
|
231
|
+
'fetch lands with the deploy adapter; until then, use plain `fetch()` ' +
|
|
232
|
+
'or wire the photon up to a deployed Worker.'));
|
|
233
|
+
}
|
|
234
|
+
// ────────────────────────────────────────────────────────────────
|
|
235
|
+
// Internals
|
|
236
|
+
// ────────────────────────────────────────────────────────────────
|
|
237
|
+
/** Lazily boot a Miniflare instance scoped to this photon. */
|
|
238
|
+
getMiniflare() {
|
|
239
|
+
if (!this.mfPromise) {
|
|
240
|
+
this.mfPromise = (async () => {
|
|
241
|
+
const { Miniflare } = await import('miniflare');
|
|
242
|
+
const sandbox = path.join(this.baseDir, '.data', 'cf-sandbox', this.photonName);
|
|
243
|
+
const seeded = this.getSeededBindings();
|
|
244
|
+
const options = {
|
|
245
|
+
modules: true,
|
|
246
|
+
script: 'export default { async fetch() { return new Response("noop"); } };',
|
|
247
|
+
};
|
|
248
|
+
if (seeded.kv.length > 0) {
|
|
249
|
+
options.kvNamespaces = seeded.kv;
|
|
250
|
+
options.kvPersist = path.join(sandbox, 'kv');
|
|
251
|
+
}
|
|
252
|
+
if (seeded.r2.length > 0) {
|
|
253
|
+
options.r2Buckets = seeded.r2;
|
|
254
|
+
options.r2Persist = path.join(sandbox, 'r2');
|
|
255
|
+
}
|
|
256
|
+
if (seeded.d1.length > 0) {
|
|
257
|
+
options.d1Databases = seeded.d1;
|
|
258
|
+
options.d1Persist = path.join(sandbox, 'd1');
|
|
259
|
+
}
|
|
260
|
+
if (seeded.queue.length > 0) {
|
|
261
|
+
const producers = {};
|
|
262
|
+
for (const bindingName of seeded.queue) {
|
|
263
|
+
// Local sandbox: queue name == binding name. Overrides only
|
|
264
|
+
// come into play at deploy time.
|
|
265
|
+
producers[bindingName] = { queueName: bindingName };
|
|
266
|
+
}
|
|
267
|
+
options.queueProducers = producers;
|
|
268
|
+
}
|
|
269
|
+
if (seeded.vectorize.length > 0) {
|
|
270
|
+
const indices = {};
|
|
271
|
+
for (const bindingName of seeded.vectorize) {
|
|
272
|
+
indices[bindingName] = { indexName: bindingName };
|
|
273
|
+
}
|
|
274
|
+
options.vectorize = indices;
|
|
275
|
+
}
|
|
276
|
+
if (this.usage?.shared.ai) {
|
|
277
|
+
options.ai = { binding: SHARED_BINDING_NAMES.ai };
|
|
278
|
+
}
|
|
279
|
+
if (this.usage?.shared.images) {
|
|
280
|
+
options.images = { binding: SHARED_BINDING_NAMES.images };
|
|
281
|
+
}
|
|
282
|
+
// browser intentionally omitted — see `get browser` deferral.
|
|
283
|
+
return new Miniflare(options);
|
|
284
|
+
})();
|
|
285
|
+
}
|
|
286
|
+
return this.mfPromise;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Build a thin proxy whose methods defer to a binding fetched via
|
|
290
|
+
* `mf.getKVNamespace(name)` / `mf.getR2Bucket(name)` / etc on first
|
|
291
|
+
* invocation. Avoids paying the boot cost on cold paths.
|
|
292
|
+
*/
|
|
293
|
+
scopedBinding(category, qualifier, methods) {
|
|
294
|
+
const name = this.resolveBindingName(category, qualifier);
|
|
295
|
+
const dynamicCategory = this.usage?.dynamicQualifiers.has(category);
|
|
296
|
+
const knownNames = new Set(this.getSeededBindings()[category]);
|
|
297
|
+
if (!knownNames.has(name) && !dynamicCategory) {
|
|
298
|
+
throw new Error(`cf.${category}(${qualifier ? JSON.stringify(qualifier) : ''}) on ` +
|
|
299
|
+
`${this.photonName} resolves to binding "${name}", which the runtime ` +
|
|
300
|
+
`did not seed. Either reference this binding with a literal qualifier ` +
|
|
301
|
+
`somewhere in your photon source (the boot scanner only sees literals), ` +
|
|
302
|
+
`or add a "${category}" override to \`protected cfBindings\`.`);
|
|
303
|
+
}
|
|
304
|
+
const get = this.getMiniflare.bind(this);
|
|
305
|
+
const out = {};
|
|
306
|
+
for (const method of methods) {
|
|
307
|
+
out[method] = async (...args) => {
|
|
308
|
+
const mf = await get();
|
|
309
|
+
const binding = await getMiniflareBinding(mf, category, name);
|
|
310
|
+
const fn = binding[method];
|
|
311
|
+
if (typeof fn !== 'function') {
|
|
312
|
+
throw new Error(`Miniflare binding "${name}" has no method "${method}" (category=${category}).`);
|
|
313
|
+
}
|
|
314
|
+
return fn.apply(binding, args);
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
return out;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Pull a binding off the miniflare-built env (for AI, Vectorize,
|
|
321
|
+
* Images — categories that surface as env props rather than via a
|
|
322
|
+
* dedicated `mf.getXxx(name)` accessor).
|
|
323
|
+
*/
|
|
324
|
+
envBindingProxy(bindingName, methods) {
|
|
325
|
+
const get = this.getMiniflare.bind(this);
|
|
326
|
+
const out = {};
|
|
327
|
+
for (const method of methods) {
|
|
328
|
+
out[method] = async (...args) => {
|
|
329
|
+
const mf = await get();
|
|
330
|
+
const env = await mf.getBindings();
|
|
331
|
+
const binding = env[bindingName];
|
|
332
|
+
if (!binding) {
|
|
333
|
+
throw new Error(`Miniflare has no binding named '${bindingName}' (photon=${this.photonName}).`);
|
|
334
|
+
}
|
|
335
|
+
return binding[method].apply(binding, args);
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
return out;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
async function getMiniflareBinding(mf, category, name) {
|
|
342
|
+
// Each miniflare accessor is typed for its specific binding; the
|
|
343
|
+
// `as never` cast keeps the dispatcher concise without giving up
|
|
344
|
+
// the runtime guarantee that `name` is one of the configured
|
|
345
|
+
// bindings (the dispatcher gate above ensures this).
|
|
346
|
+
switch (category) {
|
|
347
|
+
case 'kv':
|
|
348
|
+
return mf.getKVNamespace(name);
|
|
349
|
+
case 'r2':
|
|
350
|
+
return mf.getR2Bucket(name);
|
|
351
|
+
case 'd1':
|
|
352
|
+
return mf.getD1Database(name);
|
|
353
|
+
case 'queue':
|
|
354
|
+
return mf.getQueueProducer(name);
|
|
355
|
+
case 'vectorize': {
|
|
356
|
+
const env = await mf.getBindings();
|
|
357
|
+
return env[name];
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
function throwingShared(category, hint) {
|
|
362
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
363
|
+
return new Proxy(Object.create(null), {
|
|
364
|
+
get(_target, prop) {
|
|
365
|
+
throw new Error(`cf.${category}.${String(prop)} — ${hint}.`);
|
|
366
|
+
},
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Build a chainable D1 prepared-statement proxy that mirrors
|
|
371
|
+
* `D1PreparedStatement.bind(...).first/all/run/raw()` semantics. We
|
|
372
|
+
* accumulate the bind list on the proxy and materialize the real
|
|
373
|
+
* statement only when a terminal method runs.
|
|
374
|
+
*/
|
|
375
|
+
function makeD1PreparedStatement(get, dbName, query, bound) {
|
|
376
|
+
const materialize = async () => {
|
|
377
|
+
const mf = await get();
|
|
378
|
+
const db = (await mf.getD1Database(dbName));
|
|
379
|
+
const stmt = db.prepare(query);
|
|
380
|
+
if (bound.length > 0)
|
|
381
|
+
return stmt.bind(...bound);
|
|
382
|
+
return stmt;
|
|
383
|
+
};
|
|
384
|
+
const proxy = {
|
|
385
|
+
bind: (...values) => makeD1PreparedStatement(get, dbName, query, [...bound, ...values]),
|
|
386
|
+
first: async (colName) => {
|
|
387
|
+
const real = (await materialize());
|
|
388
|
+
return real.first(colName);
|
|
389
|
+
},
|
|
390
|
+
run: async () => {
|
|
391
|
+
const real = (await materialize());
|
|
392
|
+
return real.run();
|
|
393
|
+
},
|
|
394
|
+
all: async () => {
|
|
395
|
+
const real = (await materialize());
|
|
396
|
+
return real.all();
|
|
397
|
+
},
|
|
398
|
+
raw: async () => {
|
|
399
|
+
const real = (await materialize());
|
|
400
|
+
return real.raw();
|
|
401
|
+
},
|
|
402
|
+
_materialize: materialize,
|
|
403
|
+
};
|
|
404
|
+
return proxy;
|
|
405
|
+
}
|
|
406
|
+
//# sourceMappingURL=cf-local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cf-local.js","sourceRoot":"","sources":["../../src/runtime/cf-local.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -62,6 +62,14 @@ export interface PhotonServerOptions {
|
|
|
62
62
|
};
|
|
63
63
|
/** Embedded @ui HTML templates: photonName → { assetId → html content } */
|
|
64
64
|
embeddedUITemplates?: Record<string, Record<string, string>>;
|
|
65
|
+
/**
|
|
66
|
+
* Embedded asset tree for `<photon>/<name>/assets/**` (v1.29 Track E).
|
|
67
|
+
* Shape: photonName → { relativePath → utf-8 content }. Consumed by the
|
|
68
|
+
* directory-style serving path so SPA chunks (sibling JS/CSS next to a
|
|
69
|
+
* declared @ui index.html) resolve in standalone binaries without a
|
|
70
|
+
* filesystem lookup.
|
|
71
|
+
*/
|
|
72
|
+
embeddedAssetTree?: Record<string, Record<string, string>>;
|
|
65
73
|
/** Channel mode — declares channel capabilities for target clients */
|
|
66
74
|
channelMode?: boolean;
|
|
67
75
|
/** Channel name — becomes the MCP server name and <channel source="name"> */
|
|
@@ -91,6 +99,26 @@ export declare class PhotonServer {
|
|
|
91
99
|
private daemonInstanceName?;
|
|
92
100
|
/** Tracked instance names per SSE session for daemon drift recovery */
|
|
93
101
|
private sseInstanceNames;
|
|
102
|
+
/**
|
|
103
|
+
* Track C closure: per-claim instance pool. Populated lazily on first
|
|
104
|
+
* request from a new authenticated caller when the photon declares
|
|
105
|
+
* `@stateful` + `@auth`. Without this, every authenticated caller
|
|
106
|
+
* shares `this.mcp.instance` — meaning two users on the standalone
|
|
107
|
+
* HTTP server race on the same `this.tasks` / `this.memory`.
|
|
108
|
+
*
|
|
109
|
+
* Daemon path doesn't need this — it has its own per-instance loader
|
|
110
|
+
* (`session-manager.ts`). Cloudflare doesn't need it either — the
|
|
111
|
+
* outer Worker selects a DO per claim before the request arrives.
|
|
112
|
+
* This pool is the standalone HTTP server's equivalent.
|
|
113
|
+
*/
|
|
114
|
+
private instancePool;
|
|
115
|
+
/**
|
|
116
|
+
* True iff the loaded photon declares both `@stateful` and `@auth` —
|
|
117
|
+
* the only shape that actually wants per-caller state isolation. For
|
|
118
|
+
* everything else, instance routing is a no-op and `this.mcp` is used
|
|
119
|
+
* directly.
|
|
120
|
+
*/
|
|
121
|
+
private requiresInstanceRouting;
|
|
94
122
|
/** Whether client capabilities have been logged (one-time on first tools/list) */
|
|
95
123
|
private clientCapabilitiesLogged;
|
|
96
124
|
/** Client capability detection and negotiation */
|
|
@@ -98,9 +126,60 @@ export declare class PhotonServer {
|
|
|
98
126
|
/** Write queue for serialized STDIO notifications (prevents interleaving from concurrent generators) */
|
|
99
127
|
private _notifyQueue;
|
|
100
128
|
/** Compatibility alias for tests that seed raw capabilities directly on PhotonServer */
|
|
101
|
-
rawClientCapabilities: WeakMap<Server
|
|
129
|
+
rawClientCapabilities: WeakMap<Server<{
|
|
130
|
+
method: string;
|
|
131
|
+
params?: {
|
|
132
|
+
[x: string]: unknown;
|
|
133
|
+
_meta?: {
|
|
134
|
+
[x: string]: unknown;
|
|
135
|
+
progressToken?: string | number | undefined;
|
|
136
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
137
|
+
taskId: string;
|
|
138
|
+
} | undefined;
|
|
139
|
+
} | undefined;
|
|
140
|
+
} | undefined;
|
|
141
|
+
}, {
|
|
142
|
+
method: string;
|
|
143
|
+
params?: {
|
|
144
|
+
[x: string]: unknown;
|
|
145
|
+
_meta?: {
|
|
146
|
+
[x: string]: unknown;
|
|
147
|
+
progressToken?: string | number | undefined;
|
|
148
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
149
|
+
taskId: string;
|
|
150
|
+
} | undefined;
|
|
151
|
+
} | undefined;
|
|
152
|
+
} | undefined;
|
|
153
|
+
}, {
|
|
154
|
+
[x: string]: unknown;
|
|
155
|
+
_meta?: {
|
|
156
|
+
[x: string]: unknown;
|
|
157
|
+
progressToken?: string | number | undefined;
|
|
158
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
159
|
+
taskId: string;
|
|
160
|
+
} | undefined;
|
|
161
|
+
} | undefined;
|
|
162
|
+
}>, Record<string, any>>;
|
|
102
163
|
/** Resource listing, reading, and asset serving */
|
|
103
164
|
private resourceServer;
|
|
165
|
+
/**
|
|
166
|
+
* Server-wide registry of `resources/subscribe` state. The STDIO server
|
|
167
|
+
* registers one persistent sink; each SSE session registers a per-session
|
|
168
|
+
* sink at connect and clears its subscriptions at close.
|
|
169
|
+
*/
|
|
170
|
+
private subscriptions;
|
|
171
|
+
/** Stable sink for the STDIO server, registered once on first subscribe. */
|
|
172
|
+
private stdioSink?;
|
|
173
|
+
/**
|
|
174
|
+
* Per-server roots cache. Populated on `oninitialized` if the client
|
|
175
|
+
* declared the `roots` capability, refreshed on
|
|
176
|
+
* `notifications/roots/list_changed`. Read at tool-call time and threaded
|
|
177
|
+
* into ALS so `this.roots` resolves synchronously inside photon code.
|
|
178
|
+
*
|
|
179
|
+
* WeakMap-keyed so dead session servers stop holding cache entries
|
|
180
|
+
* automatically when SSE sessions disconnect.
|
|
181
|
+
*/
|
|
182
|
+
private rootsByServer;
|
|
104
183
|
private currentStatus;
|
|
105
184
|
private logger;
|
|
106
185
|
/** Get the loaded photon (available after start()) */
|
|
@@ -163,6 +242,22 @@ export declare class PhotonServer {
|
|
|
163
242
|
*/
|
|
164
243
|
private resolveChoiceFromFields;
|
|
165
244
|
private handleListTools;
|
|
245
|
+
/**
|
|
246
|
+
* Resolve which photon instance handles this call. For `@stateful` +
|
|
247
|
+
* `@auth` photons we pull claims from the request's `authInfo.extra`
|
|
248
|
+
* (populated by `BeamCompatTransport` from the HTTP headers), look up
|
|
249
|
+
* the binding rule from the `@auth` directive, and lazy-load a fresh
|
|
250
|
+
* photon instance keyed by that claim value. Subsequent calls from
|
|
251
|
+
* the same caller reuse the cached instance so `this.memory` /
|
|
252
|
+
* `this.tasks` persist across requests within their per-user scope.
|
|
253
|
+
*
|
|
254
|
+
* Returns `this.mcp` (the shared singleton) when the photon doesn't
|
|
255
|
+
* declare per-caller routing, when claims are missing, or when the
|
|
256
|
+
* binding rule yields no instance name. The fallback is intentional:
|
|
257
|
+
* unauthenticated requests still execute, they just share the default
|
|
258
|
+
* instance — same as a v1.28 photon would.
|
|
259
|
+
*/
|
|
260
|
+
private resolveInstanceMcp;
|
|
166
261
|
private handleCallTool;
|
|
167
262
|
private handleListPrompts;
|
|
168
263
|
private handleGetPrompt;
|
|
@@ -170,6 +265,19 @@ export declare class PhotonServer {
|
|
|
170
265
|
* Set up MCP protocol handlers (STDIO transport)
|
|
171
266
|
*/
|
|
172
267
|
private setupHandlers;
|
|
268
|
+
/**
|
|
269
|
+
* Wire up `roots/list` discovery + `notifications/roots/list_changed`
|
|
270
|
+
* refresh for one Server instance. Called once for the STDIO server and
|
|
271
|
+
* once per SSE session.
|
|
272
|
+
*
|
|
273
|
+
* Eager fetch on initialize keeps `this.roots` synchronous inside photon
|
|
274
|
+
* code — clients that don't declare the capability skip the fetch
|
|
275
|
+
* entirely. The cache is server-scoped (per-session for SSE) so two
|
|
276
|
+
* clients with different working directories don't see each other's
|
|
277
|
+
* roots.
|
|
278
|
+
*/
|
|
279
|
+
private setupRootsForServer;
|
|
280
|
+
private refreshRootsCache;
|
|
173
281
|
/**
|
|
174
282
|
* Format tool result as text
|
|
175
283
|
*/
|
|
@@ -217,9 +325,16 @@ export declare class PhotonServer {
|
|
|
217
325
|
*/
|
|
218
326
|
start(): Promise<void>;
|
|
219
327
|
/**
|
|
220
|
-
* Start server with stdio transport
|
|
328
|
+
* Start server with stdio transport.
|
|
329
|
+
* @param webPort - when set, start a companion HTTP server on this port
|
|
330
|
+
* to serve @get/@post web routes for stateful photons.
|
|
221
331
|
*/
|
|
222
332
|
private startStdio;
|
|
333
|
+
/**
|
|
334
|
+
* Dispatch an incoming HTTP request to the photon's @get/@post web routes.
|
|
335
|
+
* Used by the companion HTTP server that runs alongside STDIO stateful photons.
|
|
336
|
+
*/
|
|
337
|
+
private handleWebRoute;
|
|
223
338
|
/**
|
|
224
339
|
* Start server with SSE transport (HTTP)
|
|
225
340
|
*/
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|