@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"photon-host.js","sourceRoot":"","sources":["../../src/auto-ui/photon-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAcH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAE1B,MAAM,sBAAsB,CAAC;AAgB9B;;;GAGG;AACH,MAAM,OAAO,UAAU;IACb,MAAM,CAAoB;IAC1B,OAAO,CAAgB;IACvB,eAAe,CAAkB;IACjC,SAAS,CAAsB;IAC/B,mBAAmB,GAAG,IAAI,GAAG,EAMlC,CAAC;IACI,YAAY,CAAgB;IAC5B,YAAY,CAAc;IAC1B,cAAc,CAAuB;IACrC,OAAO,CAAoB;IAEnC,YAAY,MAAyB,EAAE,OAA0B;QAC/D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAEnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC;QAEtC,IAAI,CAAC,OAAO,GAAG;YACb,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK;YACL,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO;SAClC,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG;YACrB,KAAK;YACL,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO;YACjC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,QAAQ;YAC5C,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM;YACpC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO;SAC5C,CAAC;QAEF,uBAAuB;QACvB,IAAI,CAAC,YAAY,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,yBAAyB;QACzB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;;;;OAMG;IACH,UAAU;QACR,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEvD,iDAAiD;QACjD,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW;
|
|
1
|
+
{"version":3,"file":"photon-host.js","sourceRoot":"","sources":["../../src/auto-ui/photon-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAcH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAE1B,MAAM,sBAAsB,CAAC;AAgB9B;;;GAGG;AACH,MAAM,OAAO,UAAU;IACb,MAAM,CAAoB;IAC1B,OAAO,CAAgB;IACvB,eAAe,CAAkB;IACjC,SAAS,CAAsB;IAC/B,mBAAmB,GAAG,IAAI,GAAG,EAMlC,CAAC;IACI,YAAY,CAAgB;IAC5B,YAAY,CAAc;IAC1B,cAAc,CAAuB;IACrC,OAAO,CAAoB;IAEnC,YAAY,MAAyB,EAAE,OAA0B;QAC/D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAEnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC;QAEtC,IAAI,CAAC,OAAO,GAAG;YACb,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK;YACL,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO;SAClC,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG;YACrB,KAAK;YACL,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO;YACjC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,QAAQ;YAC5C,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM;YACpC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO;SAC5C,CAAC;QAEF,uBAAuB;QACvB,IAAI,CAAC,YAAY,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC1C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,yBAAyB;QACzB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;;;;OAMG;IACH,UAAU;QACR,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEvD,iDAAiD;QACjD,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW;SACZ,CAAC,CAAC;QAEH,sDAAsD;QACtD,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,eAAe,EAAE;YAC5D,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;SACZ,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEtB,4CAA4C;QAC5C,IAAI,CAAC,OAAO,CAAC;YACX,IAAI,EAAE,oBAAoB;YAC1B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YACzB,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,WAAW;YAC7C,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAgB;QACvB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,KAAa,EAAE,OAAgB;QAC1C,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAe;QACxB,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,GAAa;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE/C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAEtD,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,YAAY;gBAClB,EAAE;gBACF,KAAK,EAAE,GAAG;aACX,CAAC,CAAC;YAEH,0BAA0B;YAC1B,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBACrC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACpC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC,EAAE,MAAM,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAS;QAClB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAe,EAAE,IAAa;QACtC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAChE,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,OAA+B;QAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAE7C,gEAAgE;QAChE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,gBAAgB;gBACtB,OAAO;gBACP,WAAW;aACZ,CAAC,CAAC;YAEH,wBAAwB;YACxB,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1D,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAuB;QAC9B,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,OAAO;QACL,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3D,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;IACnC,CAAC;IAED,gFAAgF;IAChF,kBAAkB;IAClB,gFAAgF;IAExE,IAAI,CAAC,OAAwB;QACnC,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEO,OAAO,CAAC,OAAY;QAC1B,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,KAAU;QAC9B,uCAAuC;QACvC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE,OAAO;QAEvD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO;QAE5C,4EAA4E;QAC5E,8CAA8C;QAC9C,4EAA4E;QAC5E,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC1B,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC9B,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;iBAAM,IAAI,GAAG,CAAC,MAAM,KAAK,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBAClE,IAAI,CAAC,OAAO;qBACT,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;qBACjD,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;oBACf,IAAI,CAAC,OAAO,CAAC;wBACX,OAAO,EAAE,KAAK;wBACd,EAAE,EAAE,GAAG,CAAC,EAAE;wBACV,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;qBACtE,CAAC,CAAC;gBACL,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBACf,IAAI,CAAC,OAAO,CAAC;wBACX,OAAO,EAAE,KAAK;wBACd,EAAE,EAAE,GAAG,CAAC,EAAE;wBACV,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;qBAChD,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC;YACD,OAAO;QACT,CAAC;QAED,4EAA4E;QAC5E,gCAAgC;QAChC,4EAA4E;QAC5E,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO;QAE5E,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,cAAc;gBACjB,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,wBAAwB;gBACxB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,MAAM;YAER,KAAK,qBAAqB;gBACxB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACrD,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACxC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC7B,CAAC;gBACD,MAAM;YAER,KAAK,kBAAkB;gBACrB,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;oBAC/B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACxC,CAAC;gBACD,MAAM;YAER,KAAK,kBAAkB;gBACrB,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;oBAC5B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACvC,CAAC;gBACD,MAAM;QACV,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAgB;IACtD,OAAO,CAAC,UAAe,EAAE,EAAE;QACzB,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,MAAM,IAAI,UAAU,EAAE,CAAC;YACzE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAgB;IACtD,OAAO,KAAK,EAAE,GAAQ,EAAgB,EAAE;QACtC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -18,6 +18,13 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import type { IncomingMessage, ServerResponse } from 'http';
|
|
20
20
|
import type { AnyPhotonInfo, PhotonInstance, ExternalMCPInfo } from './types.js';
|
|
21
|
+
/**
|
|
22
|
+
* Wire a PhotonLoader's `notifyResourceUpdated` channel into the streamable-HTTP
|
|
23
|
+
* subscription registry. Call once at server start.
|
|
24
|
+
*/
|
|
25
|
+
export declare function attachLoaderForResourceUpdates(loader: {
|
|
26
|
+
setResourceUpdateNotifier: (fn: (uri: string) => void | Promise<void>) => void;
|
|
27
|
+
}): void;
|
|
21
28
|
export declare function stopSessionCleanup(): void;
|
|
22
29
|
export interface StreamableHTTPOptions {
|
|
23
30
|
photons: AnyPhotonInfo[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamable-http-transport.d.ts","sourceRoot":"","sources":["../../src/auto-ui/streamable-http-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"streamable-http-transport.d.ts","sourceRoot":"","sources":["../../src/auto-ui/streamable-http-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import { randomUUID } from 'crypto';
|
|
20
20
|
import { readdir, stat, readFile, writeFile } from 'fs/promises';
|
|
21
|
+
import { readText } from '../shared/io.js';
|
|
21
22
|
import { join, dirname, extname, resolve, normalize } from 'path';
|
|
22
23
|
import { homedir } from 'os';
|
|
23
24
|
import { PHOTON_VERSION } from '../version.js';
|
|
@@ -34,6 +35,7 @@ import { buildToolMetadataExtensions } from './types.js';
|
|
|
34
35
|
import { generateServerCard } from '../server-card.js';
|
|
35
36
|
import { audit } from '../shared/audit.js';
|
|
36
37
|
import { writePhotonEditorDeclaration } from '../photon-editor-declarations.js';
|
|
38
|
+
import { isUriTemplate, matchUriTemplate, parseUriTemplateParams, SubscriptionRegistry, } from '../resource-server.js';
|
|
37
39
|
import { createTask, getTask, updateTask, listTasks, registerController, unregisterController, getController, taskEvents, } from '../tasks/store.js';
|
|
38
40
|
import { toWireFormat, relatedTaskMeta, TERMINAL_STATES } from '../tasks/types.js';
|
|
39
41
|
import { runTaskExecution, resolveTaskInput, waitForTerminalOrInput } from '../tasks/executor.js';
|
|
@@ -76,6 +78,40 @@ const sessions = new Map();
|
|
|
76
78
|
const pendingElicitations = new Map();
|
|
77
79
|
const pendingServerRequests = new Map();
|
|
78
80
|
let nextServerRequestId = 1;
|
|
81
|
+
/**
|
|
82
|
+
* Registry of `resources/subscribe` state for the streamable-HTTP transport.
|
|
83
|
+
* Sinks are keyed by sessionId so per-session disconnect can purge in O(1).
|
|
84
|
+
*
|
|
85
|
+
* `attachLoaderForResourceUpdates(loader)` (exported) bridges photon-author
|
|
86
|
+
* `this.notifyResourceUpdated(uri)` calls into `streamableSubscriptions.notify(uri)`
|
|
87
|
+
* so subscribers get `notifications/resources/updated` over the SSE stream.
|
|
88
|
+
*/
|
|
89
|
+
const streamableSubscriptions = new SubscriptionRegistry();
|
|
90
|
+
const sessionSubscriptionSinks = new Map();
|
|
91
|
+
function getOrCreateSessionSink(sessionId) {
|
|
92
|
+
const existing = sessionSubscriptionSinks.get(sessionId);
|
|
93
|
+
if (existing)
|
|
94
|
+
return existing;
|
|
95
|
+
const sink = (uri) => {
|
|
96
|
+
sendToSession(sessionId, 'notifications/resources/updated', { uri });
|
|
97
|
+
};
|
|
98
|
+
sessionSubscriptionSinks.set(sessionId, sink);
|
|
99
|
+
return sink;
|
|
100
|
+
}
|
|
101
|
+
function disconnectSessionSubscriptions(sessionId) {
|
|
102
|
+
const sink = sessionSubscriptionSinks.get(sessionId);
|
|
103
|
+
if (!sink)
|
|
104
|
+
return;
|
|
105
|
+
streamableSubscriptions.disconnect(sink);
|
|
106
|
+
sessionSubscriptionSinks.delete(sessionId);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Wire a PhotonLoader's `notifyResourceUpdated` channel into the streamable-HTTP
|
|
110
|
+
* subscription registry. Call once at server start.
|
|
111
|
+
*/
|
|
112
|
+
export function attachLoaderForResourceUpdates(loader) {
|
|
113
|
+
loader.setResourceUpdateNotifier((uri) => streamableSubscriptions.notify(uri));
|
|
114
|
+
}
|
|
79
115
|
/**
|
|
80
116
|
* Send a JSON-RPC request to a Beam session over its SSE stream and
|
|
81
117
|
* await the reply. Backs photon-facing providers (sampling, future
|
|
@@ -207,22 +243,26 @@ async function getAllPendingApprovals(photonNames) {
|
|
|
207
243
|
const all = [];
|
|
208
244
|
const now = new Date().toISOString();
|
|
209
245
|
for (const name of photonNames) {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
246
|
+
// Hold the mutex across read-mutate-save so concurrent addApproval /
|
|
247
|
+
// resolveApproval can't lose updates while we expire stale entries.
|
|
248
|
+
await approvalsMutex.acquire(async () => {
|
|
249
|
+
const approvals = await loadApprovals(name);
|
|
250
|
+
let mutated = false;
|
|
251
|
+
for (const a of approvals) {
|
|
252
|
+
if (a.status === 'pending') {
|
|
253
|
+
if (a.expiresAt && a.expiresAt < now) {
|
|
254
|
+
a.status = 'expired';
|
|
255
|
+
mutated = true;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
all.push(a);
|
|
259
|
+
}
|
|
219
260
|
}
|
|
220
261
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
}
|
|
262
|
+
if (mutated) {
|
|
263
|
+
await saveApprovals(name, approvals);
|
|
264
|
+
}
|
|
265
|
+
});
|
|
226
266
|
}
|
|
227
267
|
return all;
|
|
228
268
|
}
|
|
@@ -339,6 +379,7 @@ function startSessionCleanup() {
|
|
|
339
379
|
for (const [id, session] of sessions) {
|
|
340
380
|
if (now - session.lastActivity.getTime() > SESSION_TIMEOUT_MS) {
|
|
341
381
|
sessions.delete(id);
|
|
382
|
+
disconnectSessionSubscriptions(id);
|
|
342
383
|
}
|
|
343
384
|
}
|
|
344
385
|
}, 60 * 1000);
|
|
@@ -556,7 +597,7 @@ const handlers = {
|
|
|
556
597
|
capabilities: {
|
|
557
598
|
tools: { listChanged: true },
|
|
558
599
|
prompts: { listChanged: true },
|
|
559
|
-
resources: { listChanged: true },
|
|
600
|
+
resources: { listChanged: true, subscribe: true },
|
|
560
601
|
tasks: {
|
|
561
602
|
list: {},
|
|
562
603
|
cancel: {},
|
|
@@ -868,6 +909,11 @@ const handlers = {
|
|
|
868
909
|
for (const photon of visiblePhotons) {
|
|
869
910
|
if (!photon.configured || !photon.methods)
|
|
870
911
|
continue;
|
|
912
|
+
// Check if this photon has a @get / web root so we can advertise a web URL.
|
|
913
|
+
const photonClass = ctx.photonMCPs.get(photon.name);
|
|
914
|
+
const httpRoutes = photonClass?._httpRoutes;
|
|
915
|
+
const webRootRoute = httpRoutes?.find((r) => r.method === 'GET' && r.path === '/');
|
|
916
|
+
const webUrl = webRootRoute ? `/web/${photon.name}/` : undefined;
|
|
871
917
|
for (const method of photon.methods) {
|
|
872
918
|
tools.push({
|
|
873
919
|
name: `${photon.name}/${method.name}`,
|
|
@@ -895,6 +941,7 @@ const handlers = {
|
|
|
895
941
|
'x-photon-install-source': photon.installSource,
|
|
896
942
|
'x-photon-prompt-count': photon.promptCount ?? 0,
|
|
897
943
|
'x-photon-resource-count': photon.resourceCount ?? 0,
|
|
944
|
+
...(webUrl ? { 'x-web-url': webUrl, 'x-web-description': photon.description } : {}),
|
|
898
945
|
...buildToolMetadataExtensions(method),
|
|
899
946
|
// MCP Apps standard: _meta.ui for linked UI resources and visibility
|
|
900
947
|
...(method.linkedUi || method.visibility
|
|
@@ -2049,23 +2096,72 @@ const handlers = {
|
|
|
2049
2096
|
}
|
|
2050
2097
|
},
|
|
2051
2098
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
2052
|
-
// Resources
|
|
2099
|
+
// Resources
|
|
2100
|
+
//
|
|
2101
|
+
// Mirrors what STDIO surfaces via ResourceServer (src/resource-server.ts):
|
|
2102
|
+
// - ui://<photon>/<id> UI Apps templates (assets.ui)
|
|
2103
|
+
// - approval://<photon>/<id> pending approval requests
|
|
2104
|
+
// - photon://<photon>/prompts/<id> class-level @prompt static-file
|
|
2105
|
+
// - photon://<photon>/resources/<id> class-level @resource static-file
|
|
2106
|
+
// - <author-defined-uri> method-level @resource / @Static
|
|
2107
|
+
// (non-templated entries from mcp.statics)
|
|
2108
|
+
//
|
|
2109
|
+
// Templated method-level URIs (`person://{slug}`) belong on
|
|
2110
|
+
// resources/templates/list and resolve via resources/read.
|
|
2053
2111
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
2054
2112
|
'resources/list': async (req, session, ctx) => {
|
|
2055
2113
|
const resources = [];
|
|
2056
2114
|
for (const photon of ctx.photons) {
|
|
2057
|
-
if (!photon.configured
|
|
2115
|
+
if (!photon.configured)
|
|
2058
2116
|
continue;
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
uri
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
:
|
|
2068
|
-
|
|
2117
|
+
const mcp = ctx.photonMCPs.get(photon.name);
|
|
2118
|
+
if (photon.assets?.ui) {
|
|
2119
|
+
for (const uiAsset of photon.assets.ui) {
|
|
2120
|
+
const uri = uiAsset.uri || `ui://${photon.name}/${uiAsset.id}`;
|
|
2121
|
+
resources.push({
|
|
2122
|
+
uri,
|
|
2123
|
+
name: uiAsset.id,
|
|
2124
|
+
mimeType: uiAsset.mimeType || 'text/html;profile=mcp-app',
|
|
2125
|
+
description: uiAsset.linkedTool
|
|
2126
|
+
? `UI template for ${photon.name}/${uiAsset.linkedTool}`
|
|
2127
|
+
: `UI template: ${uiAsset.id}`,
|
|
2128
|
+
});
|
|
2129
|
+
}
|
|
2130
|
+
}
|
|
2131
|
+
// Class-level @prompt <id> <path> static-file prompts
|
|
2132
|
+
if (mcp?.assets?.prompts) {
|
|
2133
|
+
for (const prompt of mcp.assets.prompts) {
|
|
2134
|
+
resources.push({
|
|
2135
|
+
uri: `photon://${photon.name}/prompts/${prompt.id}`,
|
|
2136
|
+
name: `prompt:${prompt.id}`,
|
|
2137
|
+
mimeType: 'text/markdown',
|
|
2138
|
+
description: `Prompt template: ${prompt.id}`,
|
|
2139
|
+
});
|
|
2140
|
+
}
|
|
2141
|
+
}
|
|
2142
|
+
// Class-level @resource <id> <path> static-file resources
|
|
2143
|
+
if (mcp?.assets?.resources) {
|
|
2144
|
+
for (const resource of mcp.assets.resources) {
|
|
2145
|
+
resources.push({
|
|
2146
|
+
uri: `photon://${photon.name}/resources/${resource.id}`,
|
|
2147
|
+
name: `resource:${resource.id}`,
|
|
2148
|
+
mimeType: resource.mimeType || 'application/octet-stream',
|
|
2149
|
+
description: `Static resource: ${resource.id}`,
|
|
2150
|
+
});
|
|
2151
|
+
}
|
|
2152
|
+
}
|
|
2153
|
+
// Method-level @resource / @Static — non-templated URIs only.
|
|
2154
|
+
if (mcp?.statics) {
|
|
2155
|
+
for (const stat of mcp.statics) {
|
|
2156
|
+
if (isUriTemplate(stat.uri))
|
|
2157
|
+
continue;
|
|
2158
|
+
resources.push({
|
|
2159
|
+
uri: stat.uri,
|
|
2160
|
+
name: stat.name,
|
|
2161
|
+
mimeType: stat.mimeType || 'text/plain',
|
|
2162
|
+
description: stat.description || `Resource: ${stat.name}`,
|
|
2163
|
+
});
|
|
2164
|
+
}
|
|
2069
2165
|
}
|
|
2070
2166
|
}
|
|
2071
2167
|
// Add pending approval resources (approval:// scheme)
|
|
@@ -2081,9 +2177,30 @@ const handlers = {
|
|
|
2081
2177
|
}
|
|
2082
2178
|
return { jsonrpc: '2.0', id: req.id, result: { resources } };
|
|
2083
2179
|
},
|
|
2180
|
+
'resources/templates/list': async (req, _session, ctx) => {
|
|
2181
|
+
const resourceTemplates = [];
|
|
2182
|
+
for (const photon of ctx.photons) {
|
|
2183
|
+
if (!photon.configured)
|
|
2184
|
+
continue;
|
|
2185
|
+
const mcp = ctx.photonMCPs.get(photon.name);
|
|
2186
|
+
if (!mcp?.statics)
|
|
2187
|
+
continue;
|
|
2188
|
+
for (const stat of mcp.statics) {
|
|
2189
|
+
if (!isUriTemplate(stat.uri))
|
|
2190
|
+
continue;
|
|
2191
|
+
resourceTemplates.push({
|
|
2192
|
+
uriTemplate: stat.uri,
|
|
2193
|
+
name: stat.name,
|
|
2194
|
+
mimeType: stat.mimeType || 'text/plain',
|
|
2195
|
+
description: stat.description || `Resource template: ${stat.name}`,
|
|
2196
|
+
});
|
|
2197
|
+
}
|
|
2198
|
+
}
|
|
2199
|
+
return { jsonrpc: '2.0', id: req.id, result: { resourceTemplates } };
|
|
2200
|
+
},
|
|
2084
2201
|
'resources/read': async (req, session, ctx) => {
|
|
2085
2202
|
const { uri } = req.params;
|
|
2086
|
-
//
|
|
2203
|
+
// approval://<photon>/<id>
|
|
2087
2204
|
const approvalMatch = uri.match(/^approval:\/\/([^/]+)\/(.+)$/);
|
|
2088
2205
|
if (approvalMatch) {
|
|
2089
2206
|
const [, photonName, approvalId] = approvalMatch;
|
|
@@ -2106,36 +2223,128 @@ const handlers = {
|
|
|
2106
2223
|
},
|
|
2107
2224
|
};
|
|
2108
2225
|
}
|
|
2109
|
-
//
|
|
2110
|
-
const
|
|
2111
|
-
if (
|
|
2226
|
+
// ui://<photon>/<id>
|
|
2227
|
+
const uiMatch = uri.match(/^ui:\/\/([^/]+)\/(.+)$/);
|
|
2228
|
+
if (uiMatch) {
|
|
2229
|
+
const [, photonName, uiId] = uiMatch;
|
|
2230
|
+
const result = await ctx.loadUIAsset(photonName, uiId);
|
|
2231
|
+
if (!result) {
|
|
2232
|
+
return {
|
|
2233
|
+
jsonrpc: '2.0',
|
|
2234
|
+
id: req.id,
|
|
2235
|
+
error: { code: -32602, message: `Resource not found: ${uri}` },
|
|
2236
|
+
};
|
|
2237
|
+
}
|
|
2238
|
+
const mimeType = result.isPhotonTemplate
|
|
2239
|
+
? 'text/html;profile=mcp-app;photon-template=true'
|
|
2240
|
+
: 'text/html;profile=mcp-app';
|
|
2112
2241
|
return {
|
|
2113
2242
|
jsonrpc: '2.0',
|
|
2114
2243
|
id: req.id,
|
|
2115
|
-
|
|
2244
|
+
result: { contents: [{ uri, mimeType, text: result.content }] },
|
|
2116
2245
|
};
|
|
2117
2246
|
}
|
|
2118
|
-
|
|
2119
|
-
const
|
|
2120
|
-
if (
|
|
2247
|
+
// photon://<photon>/(prompts|resources)/<id> — class-level static-file assets
|
|
2248
|
+
const assetMatch = uri.match(/^photon:\/\/([^/]+)\/(prompts|resources)\/(.+)$/);
|
|
2249
|
+
if (assetMatch) {
|
|
2250
|
+
const [, photonName, kind, assetId] = assetMatch;
|
|
2251
|
+
const mcp = ctx.photonMCPs.get(photonName);
|
|
2252
|
+
if (!mcp?.assets) {
|
|
2253
|
+
return {
|
|
2254
|
+
jsonrpc: '2.0',
|
|
2255
|
+
id: req.id,
|
|
2256
|
+
error: { code: -32602, message: `Photon assets not found: ${uri}` },
|
|
2257
|
+
};
|
|
2258
|
+
}
|
|
2259
|
+
const list = kind === 'prompts' ? mcp.assets.prompts : mcp.assets.resources;
|
|
2260
|
+
const asset = list?.find((a) => a.id === assetId);
|
|
2261
|
+
const resolvedPath = asset?.resolvedPath;
|
|
2262
|
+
if (!resolvedPath) {
|
|
2263
|
+
return {
|
|
2264
|
+
jsonrpc: '2.0',
|
|
2265
|
+
id: req.id,
|
|
2266
|
+
error: { code: -32602, message: `Asset not found: ${uri}` },
|
|
2267
|
+
};
|
|
2268
|
+
}
|
|
2269
|
+
const text = await readText(resolvedPath);
|
|
2270
|
+
const mimeType = kind === 'prompts'
|
|
2271
|
+
? 'text/markdown'
|
|
2272
|
+
: asset?.mimeType || 'application/octet-stream';
|
|
2121
2273
|
return {
|
|
2122
2274
|
jsonrpc: '2.0',
|
|
2123
2275
|
id: req.id,
|
|
2124
|
-
|
|
2276
|
+
result: { contents: [{ uri, mimeType, text }] },
|
|
2125
2277
|
};
|
|
2126
2278
|
}
|
|
2127
|
-
//
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2279
|
+
// Method-level @resource / @Static — match against any photon's statics.
|
|
2280
|
+
// The URI may be exact or match a registered template; on match, dispatch
|
|
2281
|
+
// through the loader so middleware (auth, logging, audit) applies.
|
|
2282
|
+
for (const photon of ctx.photons) {
|
|
2283
|
+
const mcp = ctx.photonMCPs.get(photon.name);
|
|
2284
|
+
if (!mcp?.statics)
|
|
2285
|
+
continue;
|
|
2286
|
+
for (const stat of mcp.statics) {
|
|
2287
|
+
const matched = stat.uri === uri || matchUriTemplate(stat.uri, uri);
|
|
2288
|
+
if (!matched)
|
|
2289
|
+
continue;
|
|
2290
|
+
const params = isUriTemplate(stat.uri) ? parseUriTemplateParams(stat.uri, uri) : {};
|
|
2291
|
+
if (!ctx.loader) {
|
|
2292
|
+
return {
|
|
2293
|
+
jsonrpc: '2.0',
|
|
2294
|
+
id: req.id,
|
|
2295
|
+
error: {
|
|
2296
|
+
code: -32603,
|
|
2297
|
+
message: 'Loader not available for static resource resolution',
|
|
2298
|
+
},
|
|
2299
|
+
};
|
|
2300
|
+
}
|
|
2301
|
+
const result = await ctx.loader.executeTool(mcp, stat.name, params);
|
|
2302
|
+
const text = typeof result === 'string' ? result : JSON.stringify(result, null, 2);
|
|
2303
|
+
return {
|
|
2304
|
+
jsonrpc: '2.0',
|
|
2305
|
+
id: req.id,
|
|
2306
|
+
result: {
|
|
2307
|
+
contents: [{ uri, mimeType: stat.mimeType || 'text/plain', text }],
|
|
2308
|
+
},
|
|
2309
|
+
};
|
|
2310
|
+
}
|
|
2311
|
+
}
|
|
2131
2312
|
return {
|
|
2132
2313
|
jsonrpc: '2.0',
|
|
2133
2314
|
id: req.id,
|
|
2134
|
-
|
|
2135
|
-
contents: [{ uri, mimeType, text: result.content }],
|
|
2136
|
-
},
|
|
2315
|
+
error: { code: -32602, message: `Resource not found: ${uri}` },
|
|
2137
2316
|
};
|
|
2138
2317
|
},
|
|
2318
|
+
// resources/subscribe and resources/unsubscribe — exact-URI keyed.
|
|
2319
|
+
// The session's sink is keyed off session.id so disconnect logic in the
|
|
2320
|
+
// session-cleanup path can purge subscriptions in O(1).
|
|
2321
|
+
'resources/subscribe': async (req, session) => {
|
|
2322
|
+
const { uri } = req.params;
|
|
2323
|
+
if (typeof uri !== 'string' || !uri) {
|
|
2324
|
+
return {
|
|
2325
|
+
jsonrpc: '2.0',
|
|
2326
|
+
id: req.id,
|
|
2327
|
+
error: { code: -32602, message: 'resources/subscribe requires `uri`' },
|
|
2328
|
+
};
|
|
2329
|
+
}
|
|
2330
|
+
const sink = getOrCreateSessionSink(session.id);
|
|
2331
|
+
streamableSubscriptions.subscribe(sink, uri);
|
|
2332
|
+
return { jsonrpc: '2.0', id: req.id, result: {} };
|
|
2333
|
+
},
|
|
2334
|
+
'resources/unsubscribe': async (req, session) => {
|
|
2335
|
+
const { uri } = req.params;
|
|
2336
|
+
if (typeof uri !== 'string' || !uri) {
|
|
2337
|
+
return {
|
|
2338
|
+
jsonrpc: '2.0',
|
|
2339
|
+
id: req.id,
|
|
2340
|
+
error: { code: -32602, message: 'resources/unsubscribe requires `uri`' },
|
|
2341
|
+
};
|
|
2342
|
+
}
|
|
2343
|
+
const sink = sessionSubscriptionSinks.get(session.id);
|
|
2344
|
+
if (sink)
|
|
2345
|
+
streamableSubscriptions.unsubscribe(sink, uri);
|
|
2346
|
+
return { jsonrpc: '2.0', id: req.id, result: {} };
|
|
2347
|
+
},
|
|
2139
2348
|
'prompts/list': async (req, _session, ctx) => {
|
|
2140
2349
|
const prompts = [];
|
|
2141
2350
|
for (const photon of ctx.photons) {
|