@portel/photon 1.4.1 → 1.6.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 +326 -1177
- package/dist/auto-ui/beam.d.ts +14 -0
- package/dist/auto-ui/beam.d.ts.map +1 -0
- package/dist/auto-ui/beam.js +3057 -0
- package/dist/auto-ui/beam.js.map +1 -0
- package/dist/auto-ui/bridge/index.d.ts +37 -0
- package/dist/auto-ui/bridge/index.d.ts.map +1 -0
- package/dist/auto-ui/bridge/index.js +555 -0
- package/dist/auto-ui/bridge/index.js.map +1 -0
- package/dist/auto-ui/bridge/openai-shim.d.ts +20 -0
- package/dist/auto-ui/bridge/openai-shim.d.ts.map +1 -0
- package/dist/auto-ui/bridge/openai-shim.js +231 -0
- package/dist/auto-ui/bridge/openai-shim.js.map +1 -0
- package/dist/auto-ui/bridge/photon-app.d.ts +162 -0
- package/dist/auto-ui/bridge/photon-app.d.ts.map +1 -0
- package/dist/auto-ui/bridge/photon-app.js +460 -0
- package/dist/auto-ui/bridge/photon-app.js.map +1 -0
- package/dist/auto-ui/bridge/types.d.ts +128 -0
- package/dist/auto-ui/bridge/types.d.ts.map +1 -0
- package/dist/auto-ui/bridge/types.js +7 -0
- package/dist/auto-ui/bridge/types.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 +23 -0
- package/dist/auto-ui/index.d.ts.map +1 -0
- package/dist/auto-ui/index.js +28 -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 +628 -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 +103 -0
- package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -0
- package/dist/auto-ui/streamable-http-transport.js +1875 -0
- package/dist/auto-ui/streamable-http-transport.js.map +1 -0
- package/dist/auto-ui/types.d.ts +384 -0
- package/dist/auto-ui/types.d.ts.map +1 -0
- package/dist/auto-ui/types.js +92 -0
- package/dist/auto-ui/types.js.map +1 -0
- package/dist/beam.bundle.js +63137 -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 +1166 -1131
- package/dist/cli.js.map +1 -1
- package/dist/daemon/client.d.ts +84 -3
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +561 -11
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/manager.d.ts +51 -12
- package/dist/daemon/manager.d.ts.map +1 -1
- package/dist/daemon/manager.js +122 -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 +191 -21
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +1186 -319
- 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 +204 -77
- package/dist/photon-cli-runner.js.map +1 -1
- package/dist/photon-doc-extractor.d.ts +89 -0
- package/dist/photon-doc-extractor.d.ts.map +1 -1
- package/dist/photon-doc-extractor.js +560 -32
- 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 +184 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1995 -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 +176 -87
- 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 +10 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +21 -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 +57 -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
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PhotonBridge - Unified UI Communication Layer
|
|
3
|
+
*
|
|
4
|
+
* Provides a standardized API for custom UIs to communicate with Photon servers.
|
|
5
|
+
* Compatible with OpenAI Apps SDK patterns and MCP Apps (SEP-1865) proposal.
|
|
6
|
+
*
|
|
7
|
+
* Usage in custom UI (iframe):
|
|
8
|
+
* window.photon.onProgress((data) => updateProgressBar(data.value));
|
|
9
|
+
* window.photon.onElicitation(async (ask) => showMyDialog(ask));
|
|
10
|
+
*
|
|
11
|
+
* @see https://developers.openai.com/apps-sdk/build/chatgpt-ui/
|
|
12
|
+
* @see https://blog.modelcontextprotocol.io/posts/2025-11-21-mcp-apps/
|
|
13
|
+
*/
|
|
14
|
+
// ════════════════════════════════════════════════════════════════════════════════
|
|
15
|
+
// CLIENT IMPLEMENTATION (runs inside iframe)
|
|
16
|
+
// ════════════════════════════════════════════════════════════════════════════════
|
|
17
|
+
/**
|
|
18
|
+
* Create the PhotonBridge instance for use in custom UI iframes.
|
|
19
|
+
* This is injected as window.photon by the PhotonBridgeLoader script.
|
|
20
|
+
*/
|
|
21
|
+
export function createPhotonBridge() {
|
|
22
|
+
// Event listeners
|
|
23
|
+
const progressListeners = [];
|
|
24
|
+
const statusListeners = [];
|
|
25
|
+
const streamListeners = [];
|
|
26
|
+
const emitListeners = [];
|
|
27
|
+
const resultListeners = [];
|
|
28
|
+
const errorListeners = [];
|
|
29
|
+
let elicitationHandler = null;
|
|
30
|
+
// State
|
|
31
|
+
let _toolInput = {};
|
|
32
|
+
let _toolOutput = null;
|
|
33
|
+
let _widgetState = {};
|
|
34
|
+
let _context = {
|
|
35
|
+
theme: 'dark',
|
|
36
|
+
locale: 'en-US',
|
|
37
|
+
photon: '',
|
|
38
|
+
method: '',
|
|
39
|
+
};
|
|
40
|
+
// Check if running in ChatGPT
|
|
41
|
+
const isChatGPT = typeof window.openai !== 'undefined';
|
|
42
|
+
// Message handler
|
|
43
|
+
function handleMessage(event) {
|
|
44
|
+
const msg = event.data;
|
|
45
|
+
if (!msg || typeof msg.type !== 'string' || !msg.type.startsWith('photon:'))
|
|
46
|
+
return;
|
|
47
|
+
switch (msg.type) {
|
|
48
|
+
case 'photon:init':
|
|
49
|
+
_toolInput = msg.toolInput;
|
|
50
|
+
_context = msg.context;
|
|
51
|
+
break;
|
|
52
|
+
case 'photon:emit':
|
|
53
|
+
const emitEvent = msg.event;
|
|
54
|
+
emitListeners.forEach((cb) => cb(emitEvent));
|
|
55
|
+
if (emitEvent.emit === 'progress') {
|
|
56
|
+
progressListeners.forEach((cb) => cb(emitEvent));
|
|
57
|
+
}
|
|
58
|
+
else if (emitEvent.emit === 'status') {
|
|
59
|
+
statusListeners.forEach((cb) => cb(emitEvent));
|
|
60
|
+
}
|
|
61
|
+
else if (emitEvent.emit === 'stream') {
|
|
62
|
+
streamListeners.forEach((cb) => cb(emitEvent));
|
|
63
|
+
}
|
|
64
|
+
break;
|
|
65
|
+
case 'photon:ask':
|
|
66
|
+
if (elicitationHandler) {
|
|
67
|
+
elicitationHandler(msg.event).then((value) => {
|
|
68
|
+
window.parent.postMessage({
|
|
69
|
+
type: 'photon:ask-response',
|
|
70
|
+
id: msg.id,
|
|
71
|
+
value,
|
|
72
|
+
}, '*');
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
case 'photon:result':
|
|
77
|
+
_toolOutput = msg.data;
|
|
78
|
+
resultListeners.forEach((cb) => cb(msg.data));
|
|
79
|
+
break;
|
|
80
|
+
case 'photon:error':
|
|
81
|
+
errorListeners.forEach((cb) => cb(msg.error));
|
|
82
|
+
break;
|
|
83
|
+
case 'photon:context':
|
|
84
|
+
_context = { ..._context, ...msg.context };
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
window.addEventListener('message', handleMessage);
|
|
89
|
+
// Notify host that bridge is ready
|
|
90
|
+
window.parent.postMessage({ type: 'photon:ready' }, '*');
|
|
91
|
+
// Helper to create unsubscribe function
|
|
92
|
+
function subscribe(listeners, callback) {
|
|
93
|
+
listeners.push(callback);
|
|
94
|
+
return () => {
|
|
95
|
+
const idx = listeners.indexOf(callback);
|
|
96
|
+
if (idx >= 0)
|
|
97
|
+
listeners.splice(idx, 1);
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
// Data access
|
|
102
|
+
get toolInput() {
|
|
103
|
+
return _toolInput;
|
|
104
|
+
},
|
|
105
|
+
get toolOutput() {
|
|
106
|
+
return _toolOutput;
|
|
107
|
+
},
|
|
108
|
+
get widgetState() {
|
|
109
|
+
return _widgetState;
|
|
110
|
+
},
|
|
111
|
+
setWidgetState(state) {
|
|
112
|
+
_widgetState = state;
|
|
113
|
+
window.parent.postMessage({
|
|
114
|
+
type: 'photon:set-state',
|
|
115
|
+
state,
|
|
116
|
+
}, '*');
|
|
117
|
+
},
|
|
118
|
+
// Event subscriptions
|
|
119
|
+
onProgress: (cb) => subscribe(progressListeners, cb),
|
|
120
|
+
onStatus: (cb) => subscribe(statusListeners, cb),
|
|
121
|
+
onStream: (cb) => subscribe(streamListeners, cb),
|
|
122
|
+
onEmit: (cb) => subscribe(emitListeners, cb),
|
|
123
|
+
onResult: (cb) => subscribe(resultListeners, cb),
|
|
124
|
+
onError: (cb) => subscribe(errorListeners, cb),
|
|
125
|
+
onElicitation(handler) {
|
|
126
|
+
elicitationHandler = handler;
|
|
127
|
+
return () => {
|
|
128
|
+
elicitationHandler = null;
|
|
129
|
+
};
|
|
130
|
+
},
|
|
131
|
+
// Actions
|
|
132
|
+
async callTool(toolName, args) {
|
|
133
|
+
const callId = 'call_' + Math.random().toString(36).slice(2);
|
|
134
|
+
return new Promise((resolve, reject) => {
|
|
135
|
+
function handleResponse(event) {
|
|
136
|
+
const msg = event.data;
|
|
137
|
+
if (msg?.jsonrpc === '2.0' && msg.id === callId && !msg.method) {
|
|
138
|
+
window.removeEventListener('message', handleResponse);
|
|
139
|
+
if (msg.error)
|
|
140
|
+
reject(new Error(msg.error.message || 'Tool call failed'));
|
|
141
|
+
else
|
|
142
|
+
resolve(msg.result);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
window.addEventListener('message', handleResponse);
|
|
146
|
+
window.parent.postMessage({
|
|
147
|
+
jsonrpc: '2.0',
|
|
148
|
+
id: callId,
|
|
149
|
+
method: 'tools/call',
|
|
150
|
+
params: { name: toolName, arguments: args || {} },
|
|
151
|
+
}, '*');
|
|
152
|
+
});
|
|
153
|
+
},
|
|
154
|
+
// Alias for callTool - used by custom UI templates
|
|
155
|
+
async invoke(toolName, args) {
|
|
156
|
+
return this.callTool(toolName, args);
|
|
157
|
+
},
|
|
158
|
+
async sendFollowUpMessage(message) {
|
|
159
|
+
window.parent.postMessage({
|
|
160
|
+
type: 'photon:follow-up',
|
|
161
|
+
message,
|
|
162
|
+
}, '*');
|
|
163
|
+
},
|
|
164
|
+
// Context
|
|
165
|
+
get theme() {
|
|
166
|
+
return _context.theme;
|
|
167
|
+
},
|
|
168
|
+
get locale() {
|
|
169
|
+
return _context.locale;
|
|
170
|
+
},
|
|
171
|
+
get photon() {
|
|
172
|
+
return _context.photon;
|
|
173
|
+
},
|
|
174
|
+
get method() {
|
|
175
|
+
return _context.method;
|
|
176
|
+
},
|
|
177
|
+
get isChatGPT() {
|
|
178
|
+
return isChatGPT;
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
// ════════════════════════════════════════════════════════════════════════════════
|
|
183
|
+
// LOADER SCRIPT (injected into custom UI HTML)
|
|
184
|
+
// ════════════════════════════════════════════════════════════════════════════════
|
|
185
|
+
/**
|
|
186
|
+
* Generate the script that should be injected into custom UI HTML.
|
|
187
|
+
* This creates window.photon with the full bridge API.
|
|
188
|
+
*/
|
|
189
|
+
export function generateBridgeLoaderScript() {
|
|
190
|
+
// Minified version of createPhotonBridge for injection
|
|
191
|
+
return `
|
|
192
|
+
<script>
|
|
193
|
+
(function() {
|
|
194
|
+
var pL = [], sL = [], strL = [], eL = [], rL = [], errL = [], eH = null;
|
|
195
|
+
var tI = {}, tO = null, wS = {}, ctx = { theme: 'dark', locale: 'en-US', photon: '', method: '' };
|
|
196
|
+
|
|
197
|
+
function sub(arr, cb) { arr.push(cb); return function() { var i = arr.indexOf(cb); if (i >= 0) arr.splice(i, 1); }; }
|
|
198
|
+
|
|
199
|
+
window.addEventListener('message', function(e) {
|
|
200
|
+
var m = e.data;
|
|
201
|
+
if (!m || typeof m.type !== 'string' || m.type.indexOf('photon:') !== 0) return;
|
|
202
|
+
|
|
203
|
+
if (m.type === 'photon:init') { tI = m.toolInput; ctx = m.context; }
|
|
204
|
+
else if (m.type === 'photon:emit') {
|
|
205
|
+
var ev = m.event;
|
|
206
|
+
eL.forEach(function(cb) { cb(ev); });
|
|
207
|
+
if (ev.emit === 'progress') pL.forEach(function(cb) { cb(ev); });
|
|
208
|
+
else if (ev.emit === 'status') sL.forEach(function(cb) { cb(ev); });
|
|
209
|
+
else if (ev.emit === 'stream') strL.forEach(function(cb) { cb(ev); });
|
|
210
|
+
}
|
|
211
|
+
else if (m.type === 'photon:ask' && eH) {
|
|
212
|
+
eH(m.event).then(function(v) {
|
|
213
|
+
window.parent.postMessage({ type: 'photon:ask-response', id: m.id, value: v }, '*');
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
else if (m.type === 'photon:result') { tO = m.data; rL.forEach(function(cb) { cb(m.data); }); }
|
|
217
|
+
else if (m.type === 'photon:error') { errL.forEach(function(cb) { cb(m.error); }); }
|
|
218
|
+
else if (m.type === 'photon:context') { Object.assign(ctx, m.context); }
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
window.parent.postMessage({ type: 'photon:ready' }, '*');
|
|
222
|
+
|
|
223
|
+
window.photon = {
|
|
224
|
+
get toolInput() { return tI; },
|
|
225
|
+
get toolOutput() { return tO; },
|
|
226
|
+
get widgetState() { return wS; },
|
|
227
|
+
setWidgetState: function(s) { wS = s; window.parent.postMessage({ type: 'photon:set-state', state: s }, '*'); },
|
|
228
|
+
onProgress: function(cb) { return sub(pL, cb); },
|
|
229
|
+
onStatus: function(cb) { return sub(sL, cb); },
|
|
230
|
+
onStream: function(cb) { return sub(strL, cb); },
|
|
231
|
+
onEmit: function(cb) { return sub(eL, cb); },
|
|
232
|
+
onResult: function(cb) { return sub(rL, cb); },
|
|
233
|
+
onError: function(cb) { return sub(errL, cb); },
|
|
234
|
+
onElicitation: function(h) { eH = h; return function() { eH = null; }; },
|
|
235
|
+
callTool: function(name, args) {
|
|
236
|
+
var id = 'call_' + Math.random().toString(36).slice(2);
|
|
237
|
+
return new Promise(function(res, rej) {
|
|
238
|
+
function h(e) {
|
|
239
|
+
var m = e.data;
|
|
240
|
+
if (m && m.jsonrpc === '2.0' && m.id === id && !m.method) {
|
|
241
|
+
window.removeEventListener('message', h);
|
|
242
|
+
if (m.error) rej(new Error(m.error.message || 'Tool call failed')); else res(m.result);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
window.addEventListener('message', h);
|
|
246
|
+
window.parent.postMessage({ jsonrpc: '2.0', id: id, method: 'tools/call', params: { name: name, arguments: args || {} } }, '*');
|
|
247
|
+
});
|
|
248
|
+
},
|
|
249
|
+
invoke: function(name, args) { return this.callTool(name, args); },
|
|
250
|
+
sendFollowUpMessage: function(msg) {
|
|
251
|
+
window.parent.postMessage({ type: 'photon:follow-up', message: msg }, '*');
|
|
252
|
+
},
|
|
253
|
+
get theme() { return ctx.theme; },
|
|
254
|
+
get locale() { return ctx.locale; },
|
|
255
|
+
get photon() { return ctx.photon; },
|
|
256
|
+
get method() { return ctx.method; },
|
|
257
|
+
get isChatGPT() { return typeof window.openai !== 'undefined'; }
|
|
258
|
+
};
|
|
259
|
+
})();
|
|
260
|
+
</script>`;
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=photon-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"photon-bridge.js","sourceRoot":"","sources":["../../src/auto-ui/photon-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA2KH,mFAAmF;AACnF,6CAA6C;AAC7C,mFAAmF;AAEnF;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,kBAAkB;IAClB,MAAM,iBAAiB,GAA0C,EAAE,CAAC;IACpE,MAAM,eAAe,GAAwC,EAAE,CAAC;IAChE,MAAM,eAAe,GAAwC,EAAE,CAAC;IAChE,MAAM,aAAa,GAAsC,EAAE,CAAC;IAC5D,MAAM,eAAe,GAAiC,EAAE,CAAC;IACzD,MAAM,cAAc,GAAgD,EAAE,CAAC;IAEvE,IAAI,kBAAkB,GAA6C,IAAI,CAAC;IAExE,QAAQ;IACR,IAAI,UAAU,GAAwB,EAAE,CAAC;IACzC,IAAI,WAAW,GAAQ,IAAI,CAAC;IAC5B,IAAI,YAAY,GAAQ,EAAE,CAAC;IAC3B,IAAI,QAAQ,GAAkB;QAC5B,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,8BAA8B;IAC9B,MAAM,SAAS,GAAG,OAAQ,MAAc,CAAC,MAAM,KAAK,WAAW,CAAC;IAEhE,kBAAkB;IAClB,SAAS,aAAa,CAAC,KAAU;QAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAuB,CAAC;QAC1C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO;QAEpF,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,aAAa;gBAChB,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC;gBAC3B,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC;gBACvB,MAAM;YAER,KAAK,aAAa;gBAChB,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC;gBAC5B,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;gBAE7C,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAClC,iBAAiB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAA0B,CAAC,CAAC,CAAC;gBACpE,CAAC;qBAAM,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACvC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAwB,CAAC,CAAC,CAAC;gBAChE,CAAC;qBAAM,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACvC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAwB,CAAC,CAAC,CAAC;gBAChE,CAAC;gBACD,MAAM;YAER,KAAK,YAAY;gBACf,IAAI,kBAAkB,EAAE,CAAC;oBACvB,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;wBAC3C,MAAM,CAAC,MAAM,CAAC,WAAW,CACvB;4BACE,IAAI,EAAE,qBAAqB;4BAC3B,EAAE,EAAE,GAAG,CAAC,EAAE;4BACV,KAAK;yBACa,EACpB,GAAG,CACJ,CAAC;oBACJ,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM;YAER,KAAK,eAAe;gBAClB,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC;gBACvB,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC9C,MAAM;YAER,KAAK,cAAc;gBACjB,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC9C,MAAM;YAER,KAAK,gBAAgB;gBACnB,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC3C,MAAM;QACV,CAAC;IACH,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAElD,mCAAmC;IACnC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,cAAc,EAAqB,EAAE,GAAG,CAAC,CAAC;IAE5E,wCAAwC;IACxC,SAAS,SAAS,CAAI,SAAc,EAAE,QAAW;QAC/C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,GAAG,IAAI,CAAC;gBAAE,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,cAAc;QACd,IAAI,SAAS;YACX,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,IAAI,UAAU;YACZ,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,IAAI,WAAW;YACb,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,cAAc,CAAC,KAAU;YACvB,YAAY,GAAG,KAAK,CAAC;YACrB,MAAM,CAAC,MAAM,CAAC,WAAW,CACvB;gBACE,IAAI,EAAE,kBAAkB;gBACxB,KAAK;aACa,EACpB,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACpD,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,CAAC;QAChD,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,CAAC;QAChD,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,CAAC;QAC5C,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,CAAC;QAChD,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC;QAE9C,aAAa,CAAC,OAAO;YACnB,kBAAkB,GAAG,OAAO,CAAC;YAC7B,OAAO,GAAG,EAAE;gBACV,kBAAkB,GAAG,IAAI,CAAC;YAC5B,CAAC,CAAC;QACJ,CAAC;QAED,UAAU;QACV,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI;YAC3B,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,SAAS,cAAc,CAAC,KAAU;oBAChC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC;oBACvB,IAAI,GAAG,EAAE,OAAO,KAAK,KAAK,IAAI,GAAG,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;wBAC/D,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;wBACtD,IAAI,GAAG,CAAC,KAAK;4BAAE,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,kBAAkB,CAAC,CAAC,CAAC;;4BACrE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;gBAEnD,MAAM,CAAC,MAAM,CAAC,WAAW,CACvB;oBACE,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,MAAM;oBACV,MAAM,EAAE,YAAY;oBACpB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE;iBAClD,EACD,GAAG,CACJ,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAED,mDAAmD;QACnD,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI;YACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC;QAED,KAAK,CAAC,mBAAmB,CAAC,OAAO;YAC/B,MAAM,CAAC,MAAM,CAAC,WAAW,CACvB;gBACE,IAAI,EAAE,kBAAkB;gBACxB,OAAO;aACW,EACpB,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,UAAU;QACV,IAAI,KAAK;YACP,OAAO,QAAQ,CAAC,KAAK,CAAC;QACxB,CAAC;QACD,IAAI,MAAM;YACR,OAAO,QAAQ,CAAC,MAAM,CAAC;QACzB,CAAC;QACD,IAAI,MAAM;YACR,OAAO,QAAQ,CAAC,MAAM,CAAC;QACzB,CAAC;QACD,IAAI,MAAM;YACR,OAAO,QAAQ,CAAC,MAAM,CAAC;QACzB,CAAC;QACD,IAAI,SAAS;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,+CAA+C;AAC/C,mFAAmF;AAEnF;;;GAGG;AACH,MAAM,UAAU,0BAA0B;IACxC,uDAAuD;IACvD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAqEC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PhotonHost - Host-side manager for custom UI iframes
|
|
3
|
+
*
|
|
4
|
+
* Manages communication between the Photon runtime and custom UI components
|
|
5
|
+
* rendered in iframes. Handles:
|
|
6
|
+
* - Sending emit/progress events to the UI
|
|
7
|
+
* - Routing elicitation requests and collecting responses
|
|
8
|
+
* - Tool invocations from the UI
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* const host = new PhotonHost(iframe, { photon: 'demo', method: 'search' });
|
|
12
|
+
* host.sendEmit({ emit: 'progress', value: 0.5, message: 'Loading...' });
|
|
13
|
+
* const response = await host.askElicitation({ ask: 'text', message: 'Name?' });
|
|
14
|
+
*/
|
|
15
|
+
interface HTMLIFrameElement {
|
|
16
|
+
contentWindow: {
|
|
17
|
+
postMessage(message: any, targetOrigin: string): void;
|
|
18
|
+
} | null;
|
|
19
|
+
}
|
|
20
|
+
import type { EmitEvent, AskEvent, PhotonContext } from './photon-bridge.js';
|
|
21
|
+
export interface PhotonHostOptions {
|
|
22
|
+
photon: string;
|
|
23
|
+
method: string;
|
|
24
|
+
toolInput: Record<string, any>;
|
|
25
|
+
theme?: 'light' | 'dark';
|
|
26
|
+
locale?: string;
|
|
27
|
+
displayMode?: 'inline' | 'fullscreen' | 'modal';
|
|
28
|
+
hostName?: string;
|
|
29
|
+
hostVersion?: string;
|
|
30
|
+
onCallTool?: (toolName: string, args: Record<string, any>) => Promise<any>;
|
|
31
|
+
onFollowUp?: (message: string) => void;
|
|
32
|
+
onStateChange?: (state: any) => void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* PhotonHost manages the host side of the photon bridge communication.
|
|
36
|
+
* Create one instance per custom UI iframe.
|
|
37
|
+
*/
|
|
38
|
+
export declare class PhotonHost {
|
|
39
|
+
private iframe;
|
|
40
|
+
private context;
|
|
41
|
+
private platformContext;
|
|
42
|
+
private toolInput;
|
|
43
|
+
private pendingElicitations;
|
|
44
|
+
private isReady;
|
|
45
|
+
private readyPromise;
|
|
46
|
+
private readyResolve;
|
|
47
|
+
private messageHandler;
|
|
48
|
+
private options;
|
|
49
|
+
constructor(iframe: HTMLIFrameElement, options: PhotonHostOptions);
|
|
50
|
+
/**
|
|
51
|
+
* Wait for the iframe UI to be ready
|
|
52
|
+
*/
|
|
53
|
+
waitForReady(): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Initialize the bridge - call after iframe loads
|
|
56
|
+
* Sends initialization messages for all supported platforms:
|
|
57
|
+
* - MCP Apps Extension (JSON-RPC ui/initialize)
|
|
58
|
+
* - Photon Bridge (photon:init)
|
|
59
|
+
* - OpenAI Apps SDK compatible (openai:set_globals)
|
|
60
|
+
*/
|
|
61
|
+
initialize(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Send an emit event (progress, status, stream) to the UI
|
|
64
|
+
*/
|
|
65
|
+
sendEmit(event: EmitEvent): void;
|
|
66
|
+
/**
|
|
67
|
+
* Send a progress event
|
|
68
|
+
*/
|
|
69
|
+
sendProgress(value: number, message?: string): void;
|
|
70
|
+
/**
|
|
71
|
+
* Send a status message
|
|
72
|
+
*/
|
|
73
|
+
sendStatus(message: string): void;
|
|
74
|
+
/**
|
|
75
|
+
* Request user input via elicitation
|
|
76
|
+
* Returns a promise that resolves with the user's response
|
|
77
|
+
*/
|
|
78
|
+
askElicitation(ask: AskEvent): Promise<any>;
|
|
79
|
+
/**
|
|
80
|
+
* Send the final result to the UI
|
|
81
|
+
*/
|
|
82
|
+
sendResult(data: any): void;
|
|
83
|
+
/**
|
|
84
|
+
* Send an error to the UI
|
|
85
|
+
*/
|
|
86
|
+
sendError(message: string, code?: string): void;
|
|
87
|
+
/**
|
|
88
|
+
* Update context (theme, locale, etc.)
|
|
89
|
+
* Sends updates to all supported platforms.
|
|
90
|
+
*/
|
|
91
|
+
updateContext(context: Partial<PhotonContext>): void;
|
|
92
|
+
/**
|
|
93
|
+
* Update theme across all platforms
|
|
94
|
+
*/
|
|
95
|
+
setTheme(theme: 'light' | 'dark'): void;
|
|
96
|
+
/**
|
|
97
|
+
* Clean up - remove message listener
|
|
98
|
+
*/
|
|
99
|
+
destroy(): void;
|
|
100
|
+
private send;
|
|
101
|
+
private sendRaw;
|
|
102
|
+
private handleMessage;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Create an OutputHandler that forwards events to a PhotonHost
|
|
106
|
+
*/
|
|
107
|
+
export declare function createHostOutputHandler(host: PhotonHost): (yieldValue: any) => void;
|
|
108
|
+
/**
|
|
109
|
+
* Create an InputProvider that uses PhotonHost for elicitations
|
|
110
|
+
*/
|
|
111
|
+
export declare function createHostInputProvider(host: PhotonHost): (ask: any) => Promise<any>;
|
|
112
|
+
export {};
|
|
113
|
+
//# sourceMappingURL=photon-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"photon-host.d.ts","sourceRoot":"","sources":["../../src/auto-ui/photon-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AASH,UAAU,iBAAiB;IACzB,aAAa,EAAE;QAAE,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CACjF;AAED,OAAO,KAAK,EAGV,SAAS,EACT,QAAQ,EACR,aAAa,EACd,MAAM,oBAAoB,CAAC;AAQ5B,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,OAAO,CAAC;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3E,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CACtC;AAED;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,mBAAmB,CAMvB;IACJ,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,OAAO,CAAoB;gBAEvB,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;IAkCjE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC;;;;;;OAMG;IACH,UAAU,IAAI,IAAI;IA4BlB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAIhC;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAInD;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC;;;OAGG;IACG,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;IAsBjD;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAI3B;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAI/C;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAqBpD;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAIvC;;OAEG;IACH,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,aAAa;CAsEtB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,UAAU,IAC9C,YAAY,GAAG,UAKxB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,UAAU,IACxC,KAAK,GAAG,KAAG,OAAO,CAAC,GAAG,CAAC,CAGtC"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PhotonHost - Host-side manager for custom UI iframes
|
|
3
|
+
*
|
|
4
|
+
* Manages communication between the Photon runtime and custom UI components
|
|
5
|
+
* rendered in iframes. Handles:
|
|
6
|
+
* - Sending emit/progress events to the UI
|
|
7
|
+
* - Routing elicitation requests and collecting responses
|
|
8
|
+
* - Tool invocations from the UI
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* const host = new PhotonHost(iframe, { photon: 'demo', method: 'search' });
|
|
12
|
+
* host.sendEmit({ emit: 'progress', value: 0.5, message: 'Loading...' });
|
|
13
|
+
* const response = await host.askElicitation({ ask: 'text', message: 'Name?' });
|
|
14
|
+
*/
|
|
15
|
+
import { getThemeTokens } from './design-system/tokens.js';
|
|
16
|
+
import { createMcpAppsInitialize, createThemeChangeMessages, } from './platform-compat.js';
|
|
17
|
+
/**
|
|
18
|
+
* PhotonHost manages the host side of the photon bridge communication.
|
|
19
|
+
* Create one instance per custom UI iframe.
|
|
20
|
+
*/
|
|
21
|
+
export class PhotonHost {
|
|
22
|
+
iframe;
|
|
23
|
+
context;
|
|
24
|
+
platformContext;
|
|
25
|
+
toolInput;
|
|
26
|
+
pendingElicitations = new Map();
|
|
27
|
+
isReady = false;
|
|
28
|
+
readyPromise;
|
|
29
|
+
readyResolve;
|
|
30
|
+
messageHandler;
|
|
31
|
+
options;
|
|
32
|
+
constructor(iframe, options) {
|
|
33
|
+
this.iframe = iframe;
|
|
34
|
+
this.options = options;
|
|
35
|
+
this.toolInput = options.toolInput;
|
|
36
|
+
const theme = options.theme || 'dark';
|
|
37
|
+
this.context = {
|
|
38
|
+
photon: options.photon,
|
|
39
|
+
method: options.method,
|
|
40
|
+
theme,
|
|
41
|
+
locale: options.locale || 'en-US',
|
|
42
|
+
};
|
|
43
|
+
this.platformContext = {
|
|
44
|
+
theme,
|
|
45
|
+
locale: options.locale || 'en-US',
|
|
46
|
+
displayMode: options.displayMode || 'inline',
|
|
47
|
+
photon: options.photon,
|
|
48
|
+
method: options.method,
|
|
49
|
+
hostName: options.hostName || 'beam',
|
|
50
|
+
hostVersion: options.hostVersion || '1.5.0',
|
|
51
|
+
};
|
|
52
|
+
// Create ready promise
|
|
53
|
+
this.readyPromise = new Promise((resolve) => {
|
|
54
|
+
this.readyResolve = resolve;
|
|
55
|
+
});
|
|
56
|
+
// Set up message handler
|
|
57
|
+
this.messageHandler = this.handleMessage.bind(this);
|
|
58
|
+
window.addEventListener('message', this.messageHandler);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Wait for the iframe UI to be ready
|
|
62
|
+
*/
|
|
63
|
+
async waitForReady() {
|
|
64
|
+
return this.readyPromise;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Initialize the bridge - call after iframe loads
|
|
68
|
+
* Sends initialization messages for all supported platforms:
|
|
69
|
+
* - MCP Apps Extension (JSON-RPC ui/initialize)
|
|
70
|
+
* - Photon Bridge (photon:init)
|
|
71
|
+
* - OpenAI Apps SDK compatible (openai:set_globals)
|
|
72
|
+
*/
|
|
73
|
+
initialize() {
|
|
74
|
+
const themeTokens = getThemeTokens(this.context.theme);
|
|
75
|
+
// 1. Send Photon Bridge init (with theme tokens)
|
|
76
|
+
this.send({
|
|
77
|
+
type: 'photon:init',
|
|
78
|
+
context: this.context,
|
|
79
|
+
toolInput: this.toolInput,
|
|
80
|
+
themeTokens,
|
|
81
|
+
});
|
|
82
|
+
// 2. Send MCP Apps Extension ui/initialize (JSON-RPC)
|
|
83
|
+
const mcpInit = createMcpAppsInitialize(this.platformContext, {
|
|
84
|
+
width: 800,
|
|
85
|
+
height: 600,
|
|
86
|
+
});
|
|
87
|
+
this.sendRaw(mcpInit);
|
|
88
|
+
// 3. Send OpenAI Apps SDK set_globals event
|
|
89
|
+
this.sendRaw({
|
|
90
|
+
type: 'openai:set_globals',
|
|
91
|
+
theme: this.context.theme,
|
|
92
|
+
displayMode: this.platformContext.displayMode,
|
|
93
|
+
locale: this.context.locale,
|
|
94
|
+
toolInput: this.toolInput,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Send an emit event (progress, status, stream) to the UI
|
|
99
|
+
*/
|
|
100
|
+
sendEmit(event) {
|
|
101
|
+
this.send({ type: 'photon:emit', event });
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Send a progress event
|
|
105
|
+
*/
|
|
106
|
+
sendProgress(value, message) {
|
|
107
|
+
this.sendEmit({ emit: 'progress', value, message });
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Send a status message
|
|
111
|
+
*/
|
|
112
|
+
sendStatus(message) {
|
|
113
|
+
this.sendEmit({ emit: 'status', message });
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Request user input via elicitation
|
|
117
|
+
* Returns a promise that resolves with the user's response
|
|
118
|
+
*/
|
|
119
|
+
async askElicitation(ask) {
|
|
120
|
+
const id = Math.random().toString(36).slice(2);
|
|
121
|
+
return new Promise((resolve, reject) => {
|
|
122
|
+
this.pendingElicitations.set(id, { resolve, reject });
|
|
123
|
+
this.send({
|
|
124
|
+
type: 'photon:ask',
|
|
125
|
+
id,
|
|
126
|
+
event: ask,
|
|
127
|
+
});
|
|
128
|
+
// Timeout after 5 minutes
|
|
129
|
+
setTimeout(() => {
|
|
130
|
+
if (this.pendingElicitations.has(id)) {
|
|
131
|
+
this.pendingElicitations.delete(id);
|
|
132
|
+
reject(new Error('Elicitation timeout'));
|
|
133
|
+
}
|
|
134
|
+
}, 300000);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Send the final result to the UI
|
|
139
|
+
*/
|
|
140
|
+
sendResult(data) {
|
|
141
|
+
this.send({ type: 'photon:result', data });
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Send an error to the UI
|
|
145
|
+
*/
|
|
146
|
+
sendError(message, code) {
|
|
147
|
+
this.send({ type: 'photon:error', error: { message, code } });
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Update context (theme, locale, etc.)
|
|
151
|
+
* Sends updates to all supported platforms.
|
|
152
|
+
*/
|
|
153
|
+
updateContext(context) {
|
|
154
|
+
Object.assign(this.context, context);
|
|
155
|
+
Object.assign(this.platformContext, context);
|
|
156
|
+
// Send Photon context update with theme tokens if theme changed
|
|
157
|
+
if (context.theme) {
|
|
158
|
+
const themeTokens = getThemeTokens(context.theme);
|
|
159
|
+
this.send({
|
|
160
|
+
type: 'photon:context',
|
|
161
|
+
context,
|
|
162
|
+
themeTokens,
|
|
163
|
+
});
|
|
164
|
+
// Send to all platforms
|
|
165
|
+
const messages = createThemeChangeMessages(context.theme);
|
|
166
|
+
messages.forEach((msg) => this.sendRaw(msg));
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
this.send({ type: 'photon:context', context });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Update theme across all platforms
|
|
174
|
+
*/
|
|
175
|
+
setTheme(theme) {
|
|
176
|
+
this.updateContext({ theme });
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Clean up - remove message listener
|
|
180
|
+
*/
|
|
181
|
+
destroy() {
|
|
182
|
+
window.removeEventListener('message', this.messageHandler);
|
|
183
|
+
this.pendingElicitations.clear();
|
|
184
|
+
}
|
|
185
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
186
|
+
// Private methods
|
|
187
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
188
|
+
send(message) {
|
|
189
|
+
if (this.iframe.contentWindow) {
|
|
190
|
+
this.iframe.contentWindow.postMessage(message, '*');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
sendRaw(message) {
|
|
194
|
+
if (this.iframe.contentWindow) {
|
|
195
|
+
this.iframe.contentWindow.postMessage(message, '*');
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
handleMessage(event) {
|
|
199
|
+
// Only handle messages from our iframe
|
|
200
|
+
if (event.source !== this.iframe.contentWindow)
|
|
201
|
+
return;
|
|
202
|
+
const msg = event.data;
|
|
203
|
+
if (!msg || typeof msg !== 'object')
|
|
204
|
+
return;
|
|
205
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
206
|
+
// Handle MCP Apps Extension JSON-RPC messages
|
|
207
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
208
|
+
if (msg.jsonrpc === '2.0') {
|
|
209
|
+
if (msg.method === 'ui/ready') {
|
|
210
|
+
this.isReady = true;
|
|
211
|
+
this.readyResolve();
|
|
212
|
+
this.initialize();
|
|
213
|
+
}
|
|
214
|
+
else if (msg.method === 'tools/call' && this.options.onCallTool) {
|
|
215
|
+
this.options
|
|
216
|
+
.onCallTool(msg.params.name, msg.params.arguments)
|
|
217
|
+
.then((result) => {
|
|
218
|
+
this.sendRaw({
|
|
219
|
+
jsonrpc: '2.0',
|
|
220
|
+
id: msg.id,
|
|
221
|
+
result: { content: [{ type: 'text', text: JSON.stringify(result) }] },
|
|
222
|
+
});
|
|
223
|
+
})
|
|
224
|
+
.catch((error) => {
|
|
225
|
+
this.sendRaw({
|
|
226
|
+
jsonrpc: '2.0',
|
|
227
|
+
id: msg.id,
|
|
228
|
+
error: { code: -32000, message: error.message },
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
235
|
+
// Handle Photon Bridge messages
|
|
236
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
237
|
+
if (typeof msg.type !== 'string' || !msg.type.startsWith('photon:'))
|
|
238
|
+
return;
|
|
239
|
+
switch (msg.type) {
|
|
240
|
+
case 'photon:ready':
|
|
241
|
+
this.isReady = true;
|
|
242
|
+
this.readyResolve();
|
|
243
|
+
// Send init after ready
|
|
244
|
+
this.initialize();
|
|
245
|
+
break;
|
|
246
|
+
case 'photon:ask-response':
|
|
247
|
+
const pending = this.pendingElicitations.get(msg.id);
|
|
248
|
+
if (pending) {
|
|
249
|
+
this.pendingElicitations.delete(msg.id);
|
|
250
|
+
pending.resolve(msg.value);
|
|
251
|
+
}
|
|
252
|
+
break;
|
|
253
|
+
case 'photon:set-state':
|
|
254
|
+
if (this.options.onStateChange) {
|
|
255
|
+
this.options.onStateChange(msg.state);
|
|
256
|
+
}
|
|
257
|
+
break;
|
|
258
|
+
case 'photon:follow-up':
|
|
259
|
+
if (this.options.onFollowUp) {
|
|
260
|
+
this.options.onFollowUp(msg.message);
|
|
261
|
+
}
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Create an OutputHandler that forwards events to a PhotonHost
|
|
268
|
+
*/
|
|
269
|
+
export function createHostOutputHandler(host) {
|
|
270
|
+
return (yieldValue) => {
|
|
271
|
+
if (yieldValue && typeof yieldValue === 'object' && 'emit' in yieldValue) {
|
|
272
|
+
host.sendEmit(yieldValue);
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Create an InputProvider that uses PhotonHost for elicitations
|
|
278
|
+
*/
|
|
279
|
+
export function createHostInputProvider(host) {
|
|
280
|
+
return async (ask) => {
|
|
281
|
+
return host.askElicitation(ask);
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=photon-host.js.map
|