@portel/photon 1.4.1 → 1.5.1
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 +287 -1160
- package/dist/auto-ui/beam.d.ts +9 -0
- package/dist/auto-ui/beam.d.ts.map +1 -0
- package/dist/auto-ui/beam.js +2381 -0
- package/dist/auto-ui/beam.js.map +1 -0
- package/dist/auto-ui/components/card.d.ts +13 -0
- package/dist/auto-ui/components/card.d.ts.map +1 -0
- package/dist/auto-ui/components/card.js +64 -0
- package/dist/auto-ui/components/card.js.map +1 -0
- package/dist/auto-ui/components/form.d.ts +15 -0
- package/dist/auto-ui/components/form.d.ts.map +1 -0
- package/dist/auto-ui/components/form.js +72 -0
- package/dist/auto-ui/components/form.js.map +1 -0
- package/dist/auto-ui/components/list.d.ts +13 -0
- package/dist/auto-ui/components/list.d.ts.map +1 -0
- package/dist/auto-ui/components/list.js +58 -0
- package/dist/auto-ui/components/list.js.map +1 -0
- package/dist/auto-ui/components/progress.d.ts +18 -0
- package/dist/auto-ui/components/progress.d.ts.map +1 -0
- package/dist/auto-ui/components/progress.js +125 -0
- package/dist/auto-ui/components/progress.js.map +1 -0
- package/dist/auto-ui/components/table.d.ts +13 -0
- package/dist/auto-ui/components/table.d.ts.map +1 -0
- package/dist/auto-ui/components/table.js +82 -0
- package/dist/auto-ui/components/table.js.map +1 -0
- package/dist/auto-ui/components/tree.d.ts +13 -0
- package/dist/auto-ui/components/tree.d.ts.map +1 -0
- package/dist/auto-ui/components/tree.js +61 -0
- package/dist/auto-ui/components/tree.js.map +1 -0
- package/dist/auto-ui/daemon-tools.d.ts +45 -0
- package/dist/auto-ui/daemon-tools.d.ts.map +1 -0
- package/dist/auto-ui/daemon-tools.js +580 -0
- package/dist/auto-ui/daemon-tools.js.map +1 -0
- package/dist/auto-ui/design-system/index.d.ts +21 -0
- package/dist/auto-ui/design-system/index.d.ts.map +1 -0
- package/dist/auto-ui/design-system/index.js +27 -0
- package/dist/auto-ui/design-system/index.js.map +1 -0
- package/dist/auto-ui/design-system/tokens.d.ts +9 -0
- package/dist/auto-ui/design-system/tokens.d.ts.map +1 -0
- package/dist/auto-ui/design-system/tokens.js +27 -0
- package/dist/auto-ui/design-system/tokens.js.map +1 -0
- package/dist/auto-ui/design-system/transaction-ui.d.ts +70 -0
- package/dist/auto-ui/design-system/transaction-ui.d.ts.map +1 -0
- package/dist/auto-ui/design-system/transaction-ui.js +982 -0
- package/dist/auto-ui/design-system/transaction-ui.js.map +1 -0
- package/dist/auto-ui/frontend/index.html +84 -0
- package/dist/auto-ui/index.d.ts +21 -0
- package/dist/auto-ui/index.d.ts.map +1 -0
- package/dist/auto-ui/index.js +25 -0
- package/dist/auto-ui/index.js.map +1 -0
- package/dist/auto-ui/openapi-generator.d.ts +71 -0
- package/dist/auto-ui/openapi-generator.d.ts.map +1 -0
- package/dist/auto-ui/openapi-generator.js +223 -0
- package/dist/auto-ui/openapi-generator.js.map +1 -0
- package/dist/auto-ui/photon-bridge.d.ts +159 -0
- package/dist/auto-ui/photon-bridge.d.ts.map +1 -0
- package/dist/auto-ui/photon-bridge.js +262 -0
- package/dist/auto-ui/photon-bridge.js.map +1 -0
- package/dist/auto-ui/photon-host.d.ts +113 -0
- package/dist/auto-ui/photon-host.d.ts.map +1 -0
- package/dist/auto-ui/photon-host.js +284 -0
- package/dist/auto-ui/photon-host.js.map +1 -0
- package/dist/auto-ui/platform-compat.d.ts +71 -0
- package/dist/auto-ui/platform-compat.d.ts.map +1 -0
- package/dist/auto-ui/platform-compat.js +574 -0
- package/dist/auto-ui/platform-compat.js.map +1 -0
- package/dist/auto-ui/playground-html.d.ts +15 -0
- package/dist/auto-ui/playground-html.d.ts.map +1 -0
- package/dist/auto-ui/playground-html.js +1113 -0
- package/dist/auto-ui/playground-html.js.map +1 -0
- package/dist/auto-ui/playground-server.d.ts +7 -0
- package/dist/auto-ui/playground-server.d.ts.map +1 -0
- package/dist/auto-ui/playground-server.js +840 -0
- package/dist/auto-ui/playground-server.js.map +1 -0
- package/dist/auto-ui/registry.d.ts +13 -0
- package/dist/auto-ui/registry.d.ts.map +1 -0
- package/dist/auto-ui/registry.js +62 -0
- package/dist/auto-ui/registry.js.map +1 -0
- package/dist/auto-ui/renderer.d.ts +14 -0
- package/dist/auto-ui/renderer.d.ts.map +1 -0
- package/dist/auto-ui/renderer.js +88 -0
- package/dist/auto-ui/renderer.js.map +1 -0
- package/dist/auto-ui/rendering/components.d.ts +29 -0
- package/dist/auto-ui/rendering/components.d.ts.map +1 -0
- package/dist/auto-ui/rendering/components.js +773 -0
- package/dist/auto-ui/rendering/components.js.map +1 -0
- package/dist/auto-ui/rendering/field-analyzer.d.ts +48 -0
- package/dist/auto-ui/rendering/field-analyzer.d.ts.map +1 -0
- package/dist/auto-ui/rendering/field-analyzer.js +270 -0
- package/dist/auto-ui/rendering/field-analyzer.js.map +1 -0
- package/dist/auto-ui/rendering/field-renderers.d.ts +64 -0
- package/dist/auto-ui/rendering/field-renderers.d.ts.map +1 -0
- package/dist/auto-ui/rendering/field-renderers.js +317 -0
- package/dist/auto-ui/rendering/field-renderers.js.map +1 -0
- package/dist/auto-ui/rendering/index.d.ts +28 -0
- package/dist/auto-ui/rendering/index.d.ts.map +1 -0
- package/dist/auto-ui/rendering/index.js +60 -0
- package/dist/auto-ui/rendering/index.js.map +1 -0
- package/dist/auto-ui/rendering/layout-selector.d.ts +48 -0
- package/dist/auto-ui/rendering/layout-selector.d.ts.map +1 -0
- package/dist/auto-ui/rendering/layout-selector.js +352 -0
- package/dist/auto-ui/rendering/layout-selector.js.map +1 -0
- package/dist/auto-ui/rendering/template-engine.d.ts +41 -0
- package/dist/auto-ui/rendering/template-engine.d.ts.map +1 -0
- package/dist/auto-ui/rendering/template-engine.js +238 -0
- package/dist/auto-ui/rendering/template-engine.js.map +1 -0
- package/dist/auto-ui/streamable-http-transport.d.ts +79 -0
- package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -0
- package/dist/auto-ui/streamable-http-transport.js +1314 -0
- package/dist/auto-ui/streamable-http-transport.js.map +1 -0
- package/dist/auto-ui/types.d.ts +310 -0
- package/dist/auto-ui/types.d.ts.map +1 -0
- package/dist/auto-ui/types.js +71 -0
- package/dist/auto-ui/types.js.map +1 -0
- package/dist/beam.bundle.js +13506 -0
- package/dist/beam.bundle.js.map +7 -0
- package/dist/claude-code-plugin.d.ts.map +1 -1
- package/dist/claude-code-plugin.js +30 -30
- package/dist/claude-code-plugin.js.map +1 -1
- package/dist/cli/commands/info.d.ts +11 -0
- package/dist/cli/commands/info.d.ts.map +1 -0
- package/dist/cli/commands/info.js +313 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/marketplace.d.ts +11 -0
- package/dist/cli/commands/marketplace.d.ts.map +1 -0
- package/dist/cli/commands/marketplace.js +198 -0
- package/dist/cli/commands/marketplace.js.map +1 -0
- package/dist/cli/commands/package-app.d.ts +9 -0
- package/dist/cli/commands/package-app.d.ts.map +1 -0
- package/dist/cli/commands/package-app.js +191 -0
- package/dist/cli/commands/package-app.js.map +1 -0
- package/dist/cli/commands/package.d.ts +11 -0
- package/dist/cli/commands/package.d.ts.map +1 -0
- package/dist/cli/commands/package.js +573 -0
- package/dist/cli/commands/package.js.map +1 -0
- package/dist/cli-alias.d.ts.map +1 -1
- package/dist/cli-alias.js +30 -28
- package/dist/cli-alias.js.map +1 -1
- package/dist/cli-formatter.d.ts +8 -24
- package/dist/cli-formatter.d.ts.map +1 -1
- package/dist/cli-formatter.js +8 -325
- package/dist/cli-formatter.js.map +1 -1
- package/dist/cli.d.ts +15 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1157 -1132
- package/dist/cli.js.map +1 -1
- package/dist/daemon/client.d.ts +79 -0
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +532 -8
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/manager.d.ts +46 -12
- package/dist/daemon/manager.d.ts.map +1 -1
- package/dist/daemon/manager.js +102 -61
- package/dist/daemon/manager.js.map +1 -1
- package/dist/daemon/protocol.d.ts +62 -6
- package/dist/daemon/protocol.d.ts.map +1 -1
- package/dist/daemon/protocol.js +76 -1
- package/dist/daemon/protocol.js.map +1 -1
- package/dist/daemon/server.d.ts +6 -6
- package/dist/daemon/server.js +743 -133
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/session-manager.d.ts +8 -1
- package/dist/daemon/session-manager.d.ts.map +1 -1
- package/dist/daemon/session-manager.js +32 -9
- package/dist/daemon/session-manager.js.map +1 -1
- package/dist/deploy/cloudflare.d.ts +12 -0
- package/dist/deploy/cloudflare.d.ts.map +1 -0
- package/dist/deploy/cloudflare.js +216 -0
- package/dist/deploy/cloudflare.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +168 -21
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +1120 -318
- package/dist/loader.js.map +1 -1
- package/dist/markdown-utils.d.ts +8 -0
- package/dist/markdown-utils.d.ts.map +1 -0
- package/dist/markdown-utils.js +63 -0
- package/dist/markdown-utils.js.map +1 -0
- package/dist/marketplace-manager.d.ts +10 -0
- package/dist/marketplace-manager.d.ts.map +1 -1
- package/dist/marketplace-manager.js +112 -28
- package/dist/marketplace-manager.js.map +1 -1
- package/dist/mcp-client.d.ts +9 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +11 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/mcp-elicitation.d.ts +32 -0
- package/dist/mcp-elicitation.d.ts.map +1 -0
- package/dist/mcp-elicitation.js +26 -0
- package/dist/mcp-elicitation.js.map +1 -0
- package/dist/path-resolver.d.ts +9 -12
- package/dist/path-resolver.d.ts.map +1 -1
- package/dist/path-resolver.js +13 -43
- package/dist/path-resolver.js.map +1 -1
- package/dist/photon-cli-runner.d.ts.map +1 -1
- package/dist/photon-cli-runner.js +202 -77
- package/dist/photon-cli-runner.js.map +1 -1
- package/dist/photon-doc-extractor.d.ts +88 -0
- package/dist/photon-doc-extractor.d.ts.map +1 -1
- package/dist/photon-doc-extractor.js +536 -27
- package/dist/photon-doc-extractor.js.map +1 -1
- package/dist/photons/maker.photon.d.ts +182 -0
- package/dist/photons/maker.photon.d.ts.map +1 -0
- package/dist/photons/maker.photon.js +504 -0
- package/dist/photons/maker.photon.js.map +1 -0
- package/dist/photons/maker.photon.ts +626 -0
- package/dist/photons/marketplace.photon.d.ts +110 -0
- package/dist/photons/marketplace.photon.d.ts.map +1 -0
- package/dist/photons/marketplace.photon.js +260 -0
- package/dist/photons/marketplace.photon.js.map +1 -0
- package/dist/photons/marketplace.photon.ts +378 -0
- package/dist/photons/tunnel.photon.d.ts +80 -0
- package/dist/photons/tunnel.photon.d.ts.map +1 -0
- package/dist/photons/tunnel.photon.js +269 -0
- package/dist/photons/tunnel.photon.js.map +1 -0
- package/dist/photons/tunnel.photon.ts +345 -0
- package/dist/security-scanner.d.ts.map +1 -1
- package/dist/security-scanner.js +18 -15
- package/dist/security-scanner.js.map +1 -1
- package/dist/serv/auth/jwt.d.ts +89 -0
- package/dist/serv/auth/jwt.d.ts.map +1 -0
- package/dist/serv/auth/jwt.js +239 -0
- package/dist/serv/auth/jwt.js.map +1 -0
- package/dist/serv/auth/oauth.d.ts +117 -0
- package/dist/serv/auth/oauth.d.ts.map +1 -0
- package/dist/serv/auth/oauth.js +395 -0
- package/dist/serv/auth/oauth.js.map +1 -0
- package/dist/serv/auth/well-known.d.ts +60 -0
- package/dist/serv/auth/well-known.d.ts.map +1 -0
- package/dist/serv/auth/well-known.js +154 -0
- package/dist/serv/auth/well-known.js.map +1 -0
- package/dist/serv/db/d1-client.d.ts +65 -0
- package/dist/serv/db/d1-client.d.ts.map +1 -0
- package/dist/serv/db/d1-client.js +137 -0
- package/dist/serv/db/d1-client.js.map +1 -0
- package/dist/serv/db/d1-stores.d.ts +62 -0
- package/dist/serv/db/d1-stores.d.ts.map +1 -0
- package/dist/serv/db/d1-stores.js +307 -0
- package/dist/serv/db/d1-stores.js.map +1 -0
- package/dist/serv/index.d.ts +114 -0
- package/dist/serv/index.d.ts.map +1 -0
- package/dist/serv/index.js +172 -0
- package/dist/serv/index.js.map +1 -0
- package/dist/serv/local.d.ts +118 -0
- package/dist/serv/local.d.ts.map +1 -0
- package/dist/serv/local.js +392 -0
- package/dist/serv/local.js.map +1 -0
- package/dist/serv/middleware/auth.d.ts +66 -0
- package/dist/serv/middleware/auth.d.ts.map +1 -0
- package/dist/serv/middleware/auth.js +178 -0
- package/dist/serv/middleware/auth.js.map +1 -0
- package/dist/serv/middleware/tenant.d.ts +94 -0
- package/dist/serv/middleware/tenant.d.ts.map +1 -0
- package/dist/serv/middleware/tenant.js +152 -0
- package/dist/serv/middleware/tenant.js.map +1 -0
- package/dist/serv/runtime/executor.d.ts +76 -0
- package/dist/serv/runtime/executor.d.ts.map +1 -0
- package/dist/serv/runtime/executor.js +105 -0
- package/dist/serv/runtime/executor.js.map +1 -0
- package/dist/serv/runtime/index.d.ts +8 -0
- package/dist/serv/runtime/index.d.ts.map +1 -0
- package/dist/serv/runtime/index.js +10 -0
- package/dist/serv/runtime/index.js.map +1 -0
- package/dist/serv/runtime/oauth-context.d.ts +121 -0
- package/dist/serv/runtime/oauth-context.d.ts.map +1 -0
- package/dist/serv/runtime/oauth-context.js +153 -0
- package/dist/serv/runtime/oauth-context.js.map +1 -0
- package/dist/serv/session/kv-store.d.ts +54 -0
- package/dist/serv/session/kv-store.d.ts.map +1 -0
- package/dist/serv/session/kv-store.js +149 -0
- package/dist/serv/session/kv-store.js.map +1 -0
- package/dist/serv/session/store.d.ts +113 -0
- package/dist/serv/session/store.d.ts.map +1 -0
- package/dist/serv/session/store.js +284 -0
- package/dist/serv/session/store.js.map +1 -0
- package/dist/serv/types/index.d.ts +147 -0
- package/dist/serv/types/index.d.ts.map +1 -0
- package/dist/serv/types/index.js +8 -0
- package/dist/serv/types/index.js.map +1 -0
- package/dist/serv/vault/token-vault.d.ts +102 -0
- package/dist/serv/vault/token-vault.d.ts.map +1 -0
- package/dist/serv/vault/token-vault.js +177 -0
- package/dist/serv/vault/token-vault.js.map +1 -0
- package/dist/server.d.ts +173 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1622 -86
- package/dist/server.js.map +1 -1
- package/dist/shared/cli-sections.d.ts +6 -0
- package/dist/shared/cli-sections.d.ts.map +1 -0
- package/dist/shared/cli-sections.js +16 -0
- package/dist/shared/cli-sections.js.map +1 -0
- package/dist/shared/cli-utils.d.ts +81 -0
- package/dist/shared/cli-utils.d.ts.map +1 -0
- package/dist/shared/cli-utils.js +174 -0
- package/dist/shared/cli-utils.js.map +1 -0
- package/dist/shared/config-docs.d.ts +6 -0
- package/dist/shared/config-docs.d.ts.map +1 -0
- package/dist/shared/config-docs.js +6 -0
- package/dist/shared/config-docs.js.map +1 -0
- package/dist/shared/error-handler.d.ts +128 -0
- package/dist/shared/error-handler.d.ts.map +1 -0
- package/dist/shared/error-handler.js +342 -0
- package/dist/shared/error-handler.js.map +1 -0
- package/dist/shared/logger.d.ts +42 -0
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/logger.js +123 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/performance.d.ts +65 -0
- package/dist/shared/performance.d.ts.map +1 -0
- package/dist/shared/performance.js +136 -0
- package/dist/shared/performance.js.map +1 -0
- package/dist/shared/task-runner.d.ts +2 -0
- package/dist/shared/task-runner.d.ts.map +1 -0
- package/dist/shared/task-runner.js +16 -0
- package/dist/shared/task-runner.js.map +1 -0
- package/dist/shared/validation.d.ts +6 -0
- package/dist/shared/validation.d.ts.map +1 -0
- package/dist/shared/validation.js +6 -0
- package/dist/shared/validation.js.map +1 -0
- package/dist/shared-utils.d.ts +63 -0
- package/dist/shared-utils.d.ts.map +1 -0
- package/dist/shared-utils.js +123 -0
- package/dist/shared-utils.js.map +1 -0
- package/dist/template-manager.d.ts +23 -2
- package/dist/template-manager.d.ts.map +1 -1
- package/dist/template-manager.js +175 -86
- package/dist/template-manager.js.map +1 -1
- package/dist/test-client.d.ts.map +1 -1
- package/dist/test-client.js +10 -8
- package/dist/test-client.js.map +1 -1
- package/dist/test-runner.d.ts +52 -0
- package/dist/test-runner.d.ts.map +1 -0
- package/dist/test-runner.js +785 -0
- package/dist/test-runner.js.map +1 -0
- package/dist/testing.d.ts +103 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +163 -0
- package/dist/testing.js.map +1 -0
- package/dist/version-checker.d.ts.map +1 -1
- package/dist/version-checker.js +2 -2
- package/dist/version-checker.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/dist/watcher.d.ts +6 -3
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +49 -10
- package/dist/watcher.js.map +1 -1
- package/package.json +47 -7
- package/templates/cloudflare/worker.ts.template +381 -0
- package/templates/cloudflare/wrangler.toml.template +9 -0
- package/dist/base.d.ts +0 -58
- package/dist/base.d.ts.map +0 -1
- package/dist/base.js +0 -92
- package/dist/base.js.map +0 -1
- package/dist/dependency-manager.d.ts +0 -49
- package/dist/dependency-manager.d.ts.map +0 -1
- package/dist/dependency-manager.js +0 -165
- package/dist/dependency-manager.js.map +0 -1
- package/dist/registry-manager.d.ts +0 -76
- package/dist/registry-manager.d.ts.map +0 -1
- package/dist/registry-manager.js +0 -220
- package/dist/registry-manager.js.map +0 -1
- package/dist/schema-extractor.d.ts +0 -110
- package/dist/schema-extractor.d.ts.map +0 -1
- package/dist/schema-extractor.js +0 -727
- package/dist/schema-extractor.js.map +0 -1
- package/dist/test-marketplace-sources.d.ts +0 -5
- package/dist/test-marketplace-sources.d.ts.map +0 -1
- package/dist/test-marketplace-sources.js +0 -53
- package/dist/test-marketplace-sources.js.map +0 -1
- package/dist/types.d.ts +0 -109
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -12
- package/dist/types.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@portel/photon",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.1",
|
|
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",
|
|
@@ -12,21 +12,47 @@
|
|
|
12
12
|
"templates"
|
|
13
13
|
],
|
|
14
14
|
"scripts": {
|
|
15
|
-
"build": "tsc",
|
|
15
|
+
"build": "tsc && cp -r src/photons dist/",
|
|
16
16
|
"dev": "tsc --watch",
|
|
17
|
-
"
|
|
17
|
+
"lint": "eslint src/",
|
|
18
|
+
"lint:fix": "eslint src/ --fix",
|
|
19
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
20
|
+
"format:check": "prettier --check \"src/**/*.ts\"",
|
|
21
|
+
"typecheck": "tsc --noEmit",
|
|
22
|
+
"build:beam": "tsx scripts/build-beam.ts",
|
|
23
|
+
"watch:beam": "tsx scripts/build-beam.ts --watch",
|
|
24
|
+
"dev:beam": "npm run build:beam && (tsx scripts/build-beam.ts --watch & tsx watch src/cli.ts beam)",
|
|
25
|
+
"prepublishOnly": "node -e \"const p=require('./package.json'); if(JSON.stringify(p.dependencies).includes('file:')) { console.error('ERROR: file: dependency found. Update to npm version before publishing.'); process.exit(1); }\" && npm run build",
|
|
18
26
|
"test": "npm run test:all",
|
|
19
|
-
"test:all": "npm run build && npm run test:schema && npm run test:marketplace && npm run test:loader && npm run test:server && npm run test:integration && npm run test:cli && npm run test:readme",
|
|
27
|
+
"test:all": "npm run build && npm run test:schema && npm run test:marketplace && npm run test:loader && npm run test:server && npm run test:integration && npm run test:ui-resources && npm run test:zero-config && npm run test:mcp-config && npm run test:cli && npm run test:logger && npm run test:error-handler && npm run test:performance && npm run test:validation && npm run test:daemon-pubsub && npm run test:daemon-tools && npm run test:daemon-buffer && npm run test:readme",
|
|
28
|
+
"test:zero-config": "npx tsx tests/zero-config.test.ts",
|
|
29
|
+
"test:mcp-config": "npx tsx tests/mcp-configuration.test.ts",
|
|
30
|
+
"test:coverage": "npm run build && c8 --include='dist/**/*.js' --reporter=text --reporter=html npm run test:unit",
|
|
31
|
+
"test:unit": "npx tsx tests/schema-extractor.test.ts && npx tsx tests/marketplace-manager.test.ts && npx tsx tests/loader.test.ts && npx tsx tests/loader.comprehensive.test.ts && npx tsx tests/server.test.ts && npx tsx tests/server.comprehensive.test.ts && npx tsx tests/cli-runner.test.ts && npx tsx tests/cli.comprehensive.test.ts && npx tsx tests/logger.test.ts && npx tsx tests/error-handler.test.ts && npx tsx tests/performance.test.ts && npx tsx tests/validation.test.ts && npx tsx tests/daemon-pubsub.test.ts && npx tsx tests/daemon-tools.test.ts && npx tsx tests/shared-utils.test.ts",
|
|
32
|
+
"test:cli:comprehensive": "npx tsx tests/cli.comprehensive.test.ts",
|
|
33
|
+
"test:loader:comprehensive": "npx tsx tests/loader.comprehensive.test.ts",
|
|
34
|
+
"test:server:comprehensive": "npx tsx tests/server.comprehensive.test.ts",
|
|
35
|
+
"test:daemon-pubsub": "npx tsx tests/daemon-pubsub.test.ts",
|
|
36
|
+
"test:daemon-tools": "npx tsx tests/daemon-tools.test.ts",
|
|
37
|
+
"test:daemon-buffer": "npx tsx tests/daemon-event-buffer.test.ts",
|
|
20
38
|
"test:cli": "npx tsx tests/cli-runner.test.ts",
|
|
39
|
+
"test:logger": "npx tsx tests/logger.test.ts",
|
|
40
|
+
"test:error-handler": "npx tsx tests/error-handler.test.ts",
|
|
41
|
+
"test:performance": "npx tsx tests/performance.test.ts",
|
|
42
|
+
"test:validation": "npx tsx tests/validation.test.ts",
|
|
21
43
|
"test:readme": "bash tests/readme-validation.sh",
|
|
22
44
|
"test:schema": "npx tsx tests/schema-extractor.test.ts",
|
|
23
45
|
"test:marketplace": "npx tsx tests/marketplace-manager.test.ts",
|
|
24
46
|
"test:loader": "npx tsx tests/loader.test.ts",
|
|
25
47
|
"test:server": "npx tsx tests/server.test.ts",
|
|
26
48
|
"test:integration": "npx tsx tests/integration.test.ts",
|
|
49
|
+
"test:ui-resources": "npx tsx tests/ui-resources.test.ts",
|
|
27
50
|
"test:load": "npm run build && node --expose-gc --max-old-space-size=4096 node_modules/.bin/tsx tests/load-test.ts",
|
|
28
51
|
"test:sqlite": "npm run build && npx tsx tests/sqlite.test.ts",
|
|
29
52
|
"test:github": "npm run build && npx tsx tests/github-issues.test.ts",
|
|
53
|
+
"test:beam": "npm run build && npx tsx tests/beam/rendering.test.ts",
|
|
54
|
+
"test:e2e": "npm run build && npx playwright test",
|
|
55
|
+
"test:e2e:ui": "npm run build && npx playwright test --ui",
|
|
30
56
|
"release": "release-it",
|
|
31
57
|
"release:minor": "release-it minor",
|
|
32
58
|
"release:major": "release-it major",
|
|
@@ -51,19 +77,33 @@
|
|
|
51
77
|
"author": "Portel Dev",
|
|
52
78
|
"license": "MIT",
|
|
53
79
|
"dependencies": {
|
|
54
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
55
|
-
"@portel/photon-core": "^
|
|
80
|
+
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
81
|
+
"@portel/photon-core": "^2.3.0",
|
|
56
82
|
"chokidar": "^4.0.3",
|
|
57
83
|
"cli-highlight": "^2.1.11",
|
|
58
84
|
"commander": "^12.1.0",
|
|
59
85
|
"esbuild": "^0.27.0",
|
|
60
|
-
"
|
|
86
|
+
"lit": "^3.3.2",
|
|
87
|
+
"typescript": "^5.0.0",
|
|
88
|
+
"ws": "^8.19.0"
|
|
61
89
|
},
|
|
62
90
|
"devDependencies": {
|
|
91
|
+
"@eslint/js": "^9.39.2",
|
|
92
|
+
"@playwright/test": "^1.58.0",
|
|
63
93
|
"@release-it/conventional-changelog": "^10.0.1",
|
|
94
|
+
"@types/inquirer": "^9.0.9",
|
|
64
95
|
"@types/node": "^22.10.2",
|
|
96
|
+
"@types/ws": "^8.18.1",
|
|
97
|
+
"@typescript-eslint/eslint-plugin": "^8.53.0",
|
|
98
|
+
"@typescript-eslint/parser": "^8.53.0",
|
|
65
99
|
"autocannon": "^8.0.0",
|
|
100
|
+
"c8": "^10.1.3",
|
|
66
101
|
"clinic": "^13.0.0",
|
|
102
|
+
"eslint": "^9.39.2",
|
|
103
|
+
"eslint-config-prettier": "^10.1.8",
|
|
104
|
+
"openapi-types": "^12.1.3",
|
|
105
|
+
"playwright": "^1.57.0",
|
|
106
|
+
"prettier": "^3.8.0",
|
|
67
107
|
"release-it": "^19.0.6",
|
|
68
108
|
"tsx": "^4.20.6",
|
|
69
109
|
"typescript": "^5.7.3"
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Photon MCP Worker for Cloudflare
|
|
3
|
+
* Auto-generated - do not edit directly
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// @ts-ignore - Will be replaced during build
|
|
7
|
+
import PhotonClass from './photon';
|
|
8
|
+
|
|
9
|
+
interface Env {
|
|
10
|
+
// Add your environment variables here
|
|
11
|
+
[key: string]: string | undefined;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
type SSESession = {
|
|
15
|
+
writer: WritableStreamDefaultWriter<Uint8Array>;
|
|
16
|
+
encoder: TextEncoder;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const sessions = new Map<string, SSESession>();
|
|
20
|
+
|
|
21
|
+
// Tool definitions extracted at build time
|
|
22
|
+
// @ts-ignore - Will be replaced during build
|
|
23
|
+
const TOOL_DEFINITIONS: any[] = __TOOL_DEFINITIONS__;
|
|
24
|
+
const PHOTON_NAME = '__PHOTON_NAME__';
|
|
25
|
+
const DEV_MODE = __DEV_MODE__;
|
|
26
|
+
|
|
27
|
+
// Instantiate photon
|
|
28
|
+
let photonInstance: InstanceType<typeof PhotonClass> | null = null;
|
|
29
|
+
|
|
30
|
+
function getPhoton(env: Env): InstanceType<typeof PhotonClass> {
|
|
31
|
+
if (!photonInstance) {
|
|
32
|
+
// Pass env vars as constructor params if needed
|
|
33
|
+
photonInstance = new PhotonClass();
|
|
34
|
+
}
|
|
35
|
+
return photonInstance;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// MCP JSON-RPC handler
|
|
39
|
+
async function handleMCPRequest(request: any, env: Env): Promise<any> {
|
|
40
|
+
const { method, params, id } = request;
|
|
41
|
+
const photon = getPhoton(env);
|
|
42
|
+
|
|
43
|
+
switch (method) {
|
|
44
|
+
case 'initialize':
|
|
45
|
+
return {
|
|
46
|
+
jsonrpc: '2.0',
|
|
47
|
+
id,
|
|
48
|
+
result: {
|
|
49
|
+
protocolVersion: '2024-11-05',
|
|
50
|
+
capabilities: { tools: {} },
|
|
51
|
+
serverInfo: { name: PHOTON_NAME, version: '1.0.0' },
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
case 'tools/list':
|
|
56
|
+
return {
|
|
57
|
+
jsonrpc: '2.0',
|
|
58
|
+
id,
|
|
59
|
+
result: { tools: TOOL_DEFINITIONS },
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
case 'tools/call': {
|
|
63
|
+
const { name, arguments: args } = params;
|
|
64
|
+
try {
|
|
65
|
+
const method = (photon as any)[name];
|
|
66
|
+
if (typeof method !== 'function') {
|
|
67
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
68
|
+
}
|
|
69
|
+
const result = await method.call(photon, args || {});
|
|
70
|
+
return {
|
|
71
|
+
jsonrpc: '2.0',
|
|
72
|
+
id,
|
|
73
|
+
result: {
|
|
74
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
} catch (error: any) {
|
|
78
|
+
return {
|
|
79
|
+
jsonrpc: '2.0',
|
|
80
|
+
id,
|
|
81
|
+
result: {
|
|
82
|
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
|
83
|
+
isError: true,
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
case 'notifications/initialized':
|
|
90
|
+
case 'ping':
|
|
91
|
+
return { jsonrpc: '2.0', id, result: {} };
|
|
92
|
+
|
|
93
|
+
default:
|
|
94
|
+
return {
|
|
95
|
+
jsonrpc: '2.0',
|
|
96
|
+
id,
|
|
97
|
+
error: { code: -32601, message: `Method not found: ${method}` },
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// SSE stream handler
|
|
103
|
+
async function handleSSE(request: Request, env: Env): Promise<Response> {
|
|
104
|
+
const sessionId = crypto.randomUUID();
|
|
105
|
+
const encoder = new TextEncoder();
|
|
106
|
+
|
|
107
|
+
const { readable, writable } = new TransformStream();
|
|
108
|
+
const writer = writable.getWriter();
|
|
109
|
+
|
|
110
|
+
sessions.set(sessionId, { writer, encoder });
|
|
111
|
+
|
|
112
|
+
// Send session ID
|
|
113
|
+
await writer.write(encoder.encode(`event: session\ndata: ${JSON.stringify({ sessionId })}\n\n`));
|
|
114
|
+
|
|
115
|
+
// Keep-alive
|
|
116
|
+
const interval = setInterval(async () => {
|
|
117
|
+
try {
|
|
118
|
+
await writer.write(encoder.encode(`: keepalive\n\n`));
|
|
119
|
+
} catch {
|
|
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 });
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const session = sessions.get(sessionId)!;
|
|
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
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Playground HTML
|
|
164
|
+
function getPlaygroundHTML(): string {
|
|
165
|
+
return `<!DOCTYPE html>
|
|
166
|
+
<html lang="en">
|
|
167
|
+
<head>
|
|
168
|
+
<meta charset="UTF-8">
|
|
169
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
170
|
+
<title>${PHOTON_NAME} - Playground</title>
|
|
171
|
+
<style>
|
|
172
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
173
|
+
:root { --bg: #0a0a0f; --card: #12121a; --border: #1e1e2e; --text: #e4e4e7; --muted: #71717a; --accent: #6366f1; --green: #22c55e; }
|
|
174
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg); color: var(--text); min-height: 100vh; }
|
|
175
|
+
.header { background: var(--card); border-bottom: 1px solid var(--border); padding: 16px 24px; display: flex; align-items: center; gap: 12px; }
|
|
176
|
+
.header h1 { font-size: 18px; font-weight: 600; }
|
|
177
|
+
.header h1::before { content: ''; width: 8px; height: 8px; background: var(--green); border-radius: 50%; display: inline-block; margin-right: 8px; box-shadow: 0 0 8px var(--green); }
|
|
178
|
+
.badge { background: #f97316; color: white; padding: 2px 8px; border-radius: 4px; font-size: 11px; font-weight: 600; }
|
|
179
|
+
.container { display: grid; grid-template-columns: 300px 1fr; height: calc(100vh - 57px); }
|
|
180
|
+
.sidebar { background: var(--card); border-right: 1px solid var(--border); padding: 16px; overflow-y: auto; }
|
|
181
|
+
.tool { padding: 12px; border-radius: 8px; cursor: pointer; margin-bottom: 8px; border: 1px solid var(--border); }
|
|
182
|
+
.tool:hover { border-color: var(--accent); }
|
|
183
|
+
.tool.active { border-color: var(--accent); background: rgba(99, 102, 241, 0.1); }
|
|
184
|
+
.tool-name { font-weight: 600; font-size: 14px; margin-bottom: 4px; }
|
|
185
|
+
.tool-desc { font-size: 12px; color: var(--muted); }
|
|
186
|
+
.main { padding: 24px; display: flex; flex-direction: column; gap: 16px; overflow-y: auto; }
|
|
187
|
+
.panel { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 16px; }
|
|
188
|
+
.panel h3 { font-size: 14px; margin-bottom: 12px; color: var(--muted); }
|
|
189
|
+
.form-group { margin-bottom: 12px; }
|
|
190
|
+
.form-group label { display: block; font-size: 12px; color: var(--muted); margin-bottom: 4px; }
|
|
191
|
+
.form-group input, .form-group select { width: 100%; padding: 8px 12px; background: var(--bg); border: 1px solid var(--border); border-radius: 6px; color: var(--text); font-size: 14px; }
|
|
192
|
+
.btn { background: var(--accent); color: white; border: none; padding: 10px 20px; border-radius: 6px; cursor: pointer; font-weight: 600; }
|
|
193
|
+
.btn:hover { opacity: 0.9; }
|
|
194
|
+
.btn:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
195
|
+
pre { background: var(--bg); padding: 12px; border-radius: 6px; overflow-x: auto; font-size: 13px; white-space: pre-wrap; }
|
|
196
|
+
.preview { flex: 1; min-height: 300px; }
|
|
197
|
+
.preview iframe { width: 100%; height: 100%; border: none; border-radius: 6px; background: white; }
|
|
198
|
+
</style>
|
|
199
|
+
</head>
|
|
200
|
+
<body>
|
|
201
|
+
<div class="header">
|
|
202
|
+
<h1>${PHOTON_NAME}</h1>
|
|
203
|
+
<span class="badge">Cloudflare Workers</span>
|
|
204
|
+
</div>
|
|
205
|
+
<div class="container">
|
|
206
|
+
<div class="sidebar">
|
|
207
|
+
<div id="tools"></div>
|
|
208
|
+
</div>
|
|
209
|
+
<div class="main">
|
|
210
|
+
<div class="panel">
|
|
211
|
+
<h3>Parameters</h3>
|
|
212
|
+
<div id="params"></div>
|
|
213
|
+
<button class="btn" id="call" disabled>Call Tool</button>
|
|
214
|
+
</div>
|
|
215
|
+
<div class="panel">
|
|
216
|
+
<h3>Response</h3>
|
|
217
|
+
<pre id="response">Select a tool to get started</pre>
|
|
218
|
+
</div>
|
|
219
|
+
</div>
|
|
220
|
+
</div>
|
|
221
|
+
<script>
|
|
222
|
+
const tools = ${JSON.stringify(TOOL_DEFINITIONS)};
|
|
223
|
+
let selectedTool = null;
|
|
224
|
+
|
|
225
|
+
function renderTools() {
|
|
226
|
+
const container = document.getElementById('tools');
|
|
227
|
+
container.innerHTML = tools.map(t => \`
|
|
228
|
+
<div class="tool" data-name="\${t.name}">
|
|
229
|
+
<div class="tool-name">\${t.name}</div>
|
|
230
|
+
<div class="tool-desc">\${t.description || ''}</div>
|
|
231
|
+
</div>
|
|
232
|
+
\`).join('');
|
|
233
|
+
|
|
234
|
+
container.querySelectorAll('.tool').forEach(el => {
|
|
235
|
+
el.onclick = () => selectTool(el.dataset.name);
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function selectTool(name) {
|
|
240
|
+
selectedTool = tools.find(t => t.name === name);
|
|
241
|
+
document.querySelectorAll('.tool').forEach(el => el.classList.remove('active'));
|
|
242
|
+
document.querySelector(\`[data-name="\${name}"]\`).classList.add('active');
|
|
243
|
+
renderParams();
|
|
244
|
+
document.getElementById('call').disabled = false;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function renderParams() {
|
|
248
|
+
const container = document.getElementById('params');
|
|
249
|
+
const props = selectedTool?.inputSchema?.properties || {};
|
|
250
|
+
const required = selectedTool?.inputSchema?.required || [];
|
|
251
|
+
|
|
252
|
+
if (Object.keys(props).length === 0) {
|
|
253
|
+
container.innerHTML = '<p style="color: var(--muted); font-size: 13px;">No parameters required</p>';
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
container.innerHTML = Object.entries(props).map(([key, schema]) => {
|
|
258
|
+
const req = required.includes(key) ? ' *' : '';
|
|
259
|
+
if (schema.enum) {
|
|
260
|
+
return \`<div class="form-group">
|
|
261
|
+
<label>\${key}\${req}</label>
|
|
262
|
+
<select name="\${key}">
|
|
263
|
+
<option value="">Select...</option>
|
|
264
|
+
\${schema.enum.map(v => \`<option value="\${v}">\${v}</option>\`).join('')}
|
|
265
|
+
</select>
|
|
266
|
+
</div>\`;
|
|
267
|
+
}
|
|
268
|
+
const type = schema.type === 'number' ? 'number' : 'text';
|
|
269
|
+
return \`<div class="form-group">
|
|
270
|
+
<label>\${key}\${req}</label>
|
|
271
|
+
<input type="\${type}" name="\${key}" placeholder="\${schema.description || ''}">
|
|
272
|
+
</div>\`;
|
|
273
|
+
}).join('');
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
document.getElementById('call').onclick = async () => {
|
|
277
|
+
if (!selectedTool) return;
|
|
278
|
+
const form = document.getElementById('params');
|
|
279
|
+
const args = {};
|
|
280
|
+
form.querySelectorAll('input, select').forEach(el => {
|
|
281
|
+
if (el.value) {
|
|
282
|
+
args[el.name] = el.type === 'number' ? Number(el.value) : el.value;
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
document.getElementById('response').textContent = 'Calling...';
|
|
287
|
+
|
|
288
|
+
try {
|
|
289
|
+
const res = await fetch('/api/call', {
|
|
290
|
+
method: 'POST',
|
|
291
|
+
headers: { 'Content-Type': 'application/json' },
|
|
292
|
+
body: JSON.stringify({ tool: selectedTool.name, args })
|
|
293
|
+
});
|
|
294
|
+
const data = await res.json();
|
|
295
|
+
document.getElementById('response').textContent = JSON.stringify(data, null, 2);
|
|
296
|
+
} catch (e) {
|
|
297
|
+
document.getElementById('response').textContent = 'Error: ' + e.message;
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
renderTools();
|
|
302
|
+
</script>
|
|
303
|
+
</body>
|
|
304
|
+
</html>`;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Main fetch handler
|
|
308
|
+
export default {
|
|
309
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
310
|
+
const url = new URL(request.url);
|
|
311
|
+
|
|
312
|
+
// CORS preflight
|
|
313
|
+
if (request.method === 'OPTIONS') {
|
|
314
|
+
return new Response(null, {
|
|
315
|
+
headers: {
|
|
316
|
+
'Access-Control-Allow-Origin': '*',
|
|
317
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
318
|
+
'Access-Control-Allow-Headers': 'Content-Type',
|
|
319
|
+
},
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Info endpoint
|
|
324
|
+
if (url.pathname === '/' && request.method === 'GET') {
|
|
325
|
+
return Response.json({
|
|
326
|
+
name: PHOTON_NAME,
|
|
327
|
+
transport: 'sse',
|
|
328
|
+
runtime: 'cloudflare-workers',
|
|
329
|
+
endpoints: {
|
|
330
|
+
sse: '/mcp',
|
|
331
|
+
messages: '/mcp/messages',
|
|
332
|
+
...(DEV_MODE ? { playground: '/playground' } : {}),
|
|
333
|
+
},
|
|
334
|
+
tools: TOOL_DEFINITIONS.length,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// SSE endpoint
|
|
339
|
+
if (url.pathname === '/mcp' && request.method === 'GET') {
|
|
340
|
+
return handleSSE(request, env);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Message endpoint
|
|
344
|
+
if (url.pathname === '/mcp/messages' && request.method === 'POST') {
|
|
345
|
+
return handleMessage(request, env);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// Dev-only endpoints
|
|
349
|
+
if (DEV_MODE) {
|
|
350
|
+
// Playground
|
|
351
|
+
if (url.pathname === '/playground') {
|
|
352
|
+
return new Response(getPlaygroundHTML(), {
|
|
353
|
+
headers: { 'Content-Type': 'text/html' },
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// API: List tools
|
|
358
|
+
if (url.pathname === '/api/tools') {
|
|
359
|
+
return Response.json({ tools: TOOL_DEFINITIONS });
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// API: Call tool
|
|
363
|
+
if (url.pathname === '/api/call' && request.method === 'POST') {
|
|
364
|
+
const { tool, args } = await request.json();
|
|
365
|
+
const photon = getPhoton(env);
|
|
366
|
+
try {
|
|
367
|
+
const method = (photon as any)[tool];
|
|
368
|
+
if (typeof method !== 'function') {
|
|
369
|
+
throw new Error(`Unknown tool: ${tool}`);
|
|
370
|
+
}
|
|
371
|
+
const result = await method.call(photon, args || {});
|
|
372
|
+
return Response.json({ success: true, data: result });
|
|
373
|
+
} catch (error: any) {
|
|
374
|
+
return Response.json({ success: false, error: error.message }, { status: 500 });
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
return new Response('Not Found', { status: 404 });
|
|
380
|
+
},
|
|
381
|
+
};
|
package/dist/base.d.ts
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PhotonMCP Base Class
|
|
3
|
-
*
|
|
4
|
-
* Optional base class for creating Photon MCPs.
|
|
5
|
-
* You don't need to extend this - any class with async methods works!
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* ```typescript
|
|
9
|
-
* export default class Calculator extends PhotonMCP {
|
|
10
|
-
* /**
|
|
11
|
-
* * Add two numbers together
|
|
12
|
-
* * @param a First number
|
|
13
|
-
* * @param b Second number
|
|
14
|
-
* *\/
|
|
15
|
-
* async add(params: { a: number; b: number }) {
|
|
16
|
-
* return params.a + params.b;
|
|
17
|
-
* }
|
|
18
|
-
* }
|
|
19
|
-
* ```
|
|
20
|
-
*
|
|
21
|
-
* Or without extending (plain class):
|
|
22
|
-
* ```typescript
|
|
23
|
-
* export default class Calculator {
|
|
24
|
-
* async add(params: { a: number; b: number }) {
|
|
25
|
-
* return params.a + params.b;
|
|
26
|
-
* }
|
|
27
|
-
* }
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
/**
|
|
31
|
-
* Simple base class for creating Photon MCPs
|
|
32
|
-
*
|
|
33
|
-
* - Class name = MCP name
|
|
34
|
-
* - Public async methods = Tools
|
|
35
|
-
* - Return value = Tool result
|
|
36
|
-
*/
|
|
37
|
-
export declare class PhotonMCP {
|
|
38
|
-
/**
|
|
39
|
-
* Get MCP name from class name
|
|
40
|
-
* Converts PascalCase to kebab-case (e.g., MyAwesomeMCP → my-awesome-mcp)
|
|
41
|
-
*/
|
|
42
|
-
static getMCPName(): string;
|
|
43
|
-
/**
|
|
44
|
-
* Get all tool methods from this class
|
|
45
|
-
* Returns all public async methods except lifecycle hooks
|
|
46
|
-
*/
|
|
47
|
-
static getToolMethods(): string[];
|
|
48
|
-
/**
|
|
49
|
-
* Execute a tool method
|
|
50
|
-
*/
|
|
51
|
-
executeTool(toolName: string, parameters: any): Promise<any>;
|
|
52
|
-
/**
|
|
53
|
-
* Optional lifecycle hooks
|
|
54
|
-
*/
|
|
55
|
-
onInitialize?(): Promise<void>;
|
|
56
|
-
onShutdown?(): Promise<void>;
|
|
57
|
-
}
|
|
58
|
-
//# sourceMappingURL=base.d.ts.map
|
package/dist/base.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB;;;OAGG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM;IAQ3B;;;OAGG;IACH,MAAM,CAAC,cAAc,IAAI,MAAM,EAAE;IA0BjC;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAgBlE;;OAEG;IACG,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;IAC9B,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CACnC"}
|
package/dist/base.js
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PhotonMCP Base Class
|
|
3
|
-
*
|
|
4
|
-
* Optional base class for creating Photon MCPs.
|
|
5
|
-
* You don't need to extend this - any class with async methods works!
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* ```typescript
|
|
9
|
-
* export default class Calculator extends PhotonMCP {
|
|
10
|
-
* /**
|
|
11
|
-
* * Add two numbers together
|
|
12
|
-
* * @param a First number
|
|
13
|
-
* * @param b Second number
|
|
14
|
-
* *\/
|
|
15
|
-
* async add(params: { a: number; b: number }) {
|
|
16
|
-
* return params.a + params.b;
|
|
17
|
-
* }
|
|
18
|
-
* }
|
|
19
|
-
* ```
|
|
20
|
-
*
|
|
21
|
-
* Or without extending (plain class):
|
|
22
|
-
* ```typescript
|
|
23
|
-
* export default class Calculator {
|
|
24
|
-
* async add(params: { a: number; b: number }) {
|
|
25
|
-
* return params.a + params.b;
|
|
26
|
-
* }
|
|
27
|
-
* }
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
/**
|
|
31
|
-
* Simple base class for creating Photon MCPs
|
|
32
|
-
*
|
|
33
|
-
* - Class name = MCP name
|
|
34
|
-
* - Public async methods = Tools
|
|
35
|
-
* - Return value = Tool result
|
|
36
|
-
*/
|
|
37
|
-
export class PhotonMCP {
|
|
38
|
-
/**
|
|
39
|
-
* Get MCP name from class name
|
|
40
|
-
* Converts PascalCase to kebab-case (e.g., MyAwesomeMCP → my-awesome-mcp)
|
|
41
|
-
*/
|
|
42
|
-
static getMCPName() {
|
|
43
|
-
return this.name
|
|
44
|
-
.replace(/MCP$/, '') // Remove "MCP" suffix if present
|
|
45
|
-
.replace(/([A-Z])/g, '-$1')
|
|
46
|
-
.toLowerCase()
|
|
47
|
-
.replace(/^-/, ''); // Remove leading dash
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Get all tool methods from this class
|
|
51
|
-
* Returns all public async methods except lifecycle hooks
|
|
52
|
-
*/
|
|
53
|
-
static getToolMethods() {
|
|
54
|
-
const prototype = this.prototype;
|
|
55
|
-
const methods = [];
|
|
56
|
-
// Get all property names from prototype chain
|
|
57
|
-
let current = prototype;
|
|
58
|
-
while (current && current !== PhotonMCP.prototype) {
|
|
59
|
-
Object.getOwnPropertyNames(current).forEach((name) => {
|
|
60
|
-
// Skip constructor, private methods (starting with _), and lifecycle hooks
|
|
61
|
-
if (name !== 'constructor' &&
|
|
62
|
-
!name.startsWith('_') &&
|
|
63
|
-
name !== 'onInitialize' &&
|
|
64
|
-
name !== 'onShutdown' &&
|
|
65
|
-
typeof prototype[name] === 'function' &&
|
|
66
|
-
!methods.includes(name)) {
|
|
67
|
-
methods.push(name);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
current = Object.getPrototypeOf(current);
|
|
71
|
-
}
|
|
72
|
-
return methods;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Execute a tool method
|
|
76
|
-
*/
|
|
77
|
-
async executeTool(toolName, parameters) {
|
|
78
|
-
const method = this[toolName];
|
|
79
|
-
if (!method || typeof method !== 'function') {
|
|
80
|
-
throw new Error(`Tool not found: ${toolName}`);
|
|
81
|
-
}
|
|
82
|
-
try {
|
|
83
|
-
const result = await method.call(this, parameters);
|
|
84
|
-
return result;
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
console.error(`Tool execution failed: ${toolName} - ${error.message}`);
|
|
88
|
-
throw error;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=base.js.map
|
package/dist/base.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;;;;;;GAMG;AACH,MAAM,OAAO,SAAS;IACpB;;;OAGG;IACH,MAAM,CAAC,UAAU;QACf,OAAO,IAAI,CAAC,IAAI;aACb,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,iCAAiC;aACrD,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC;aAC1B,WAAW,EAAE;aACb,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,sBAAsB;IAC9C,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,cAAc;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,8CAA8C;QAC9C,IAAI,OAAO,GAAG,SAAS,CAAC;QACxB,OAAO,OAAO,IAAI,OAAO,KAAK,SAAS,CAAC,SAAS,EAAE,CAAC;YAClD,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBACnD,2EAA2E;gBAC3E,IACE,IAAI,KAAK,aAAa;oBACtB,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBACrB,IAAI,KAAK,cAAc;oBACvB,IAAI,KAAK,YAAY;oBACrB,OAAQ,SAAiB,CAAC,IAAI,CAAC,KAAK,UAAU;oBAC9C,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EACvB,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,UAAe;QACjD,MAAM,MAAM,GAAI,IAAY,CAAC,QAAQ,CAAC,CAAC;QAEvC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACnD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,0BAA0B,QAAQ,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACvE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CAOF"}
|