@portel/photon 1.8.4 → 1.10.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 +163 -210
- package/dist/async/dedup-map.d.ts +40 -0
- package/dist/async/dedup-map.d.ts.map +1 -0
- package/dist/async/dedup-map.js +80 -0
- package/dist/async/dedup-map.js.map +1 -0
- package/dist/async/index.d.ts +11 -0
- package/dist/async/index.d.ts.map +1 -0
- package/dist/async/index.js +11 -0
- package/dist/async/index.js.map +1 -0
- package/dist/async/loading-gate.d.ts +27 -0
- package/dist/async/loading-gate.d.ts.map +1 -0
- package/dist/async/loading-gate.js +48 -0
- package/dist/async/loading-gate.js.map +1 -0
- package/dist/async/with-timeout.d.ts +6 -0
- package/dist/async/with-timeout.d.ts.map +1 -0
- package/dist/async/with-timeout.js +17 -0
- package/dist/async/with-timeout.js.map +1 -0
- package/dist/auto-ui/beam/class-metadata.d.ts +52 -0
- package/dist/auto-ui/beam/class-metadata.d.ts.map +1 -0
- package/dist/auto-ui/beam/class-metadata.js +133 -0
- package/dist/auto-ui/beam/class-metadata.js.map +1 -0
- package/dist/auto-ui/beam/config.d.ts +13 -0
- package/dist/auto-ui/beam/config.d.ts.map +1 -0
- package/dist/auto-ui/beam/config.js +52 -0
- package/dist/auto-ui/beam/config.js.map +1 -0
- package/dist/auto-ui/beam/external-mcp.d.ts +37 -0
- package/dist/auto-ui/beam/external-mcp.d.ts.map +1 -0
- package/dist/auto-ui/beam/external-mcp.js +311 -0
- package/dist/auto-ui/beam/external-mcp.js.map +1 -0
- package/dist/auto-ui/beam/photon-management.d.ts +51 -0
- package/dist/auto-ui/beam/photon-management.d.ts.map +1 -0
- package/dist/auto-ui/beam/photon-management.js +310 -0
- package/dist/auto-ui/beam/photon-management.js.map +1 -0
- package/dist/auto-ui/beam/routes/api-browse.d.ts +17 -0
- package/dist/auto-ui/beam/routes/api-browse.d.ts.map +1 -0
- package/dist/auto-ui/beam/routes/api-browse.js +531 -0
- package/dist/auto-ui/beam/routes/api-browse.js.map +1 -0
- package/dist/auto-ui/beam/routes/api-config.d.ts +9 -0
- package/dist/auto-ui/beam/routes/api-config.d.ts.map +1 -0
- package/dist/auto-ui/beam/routes/api-config.js +494 -0
- package/dist/auto-ui/beam/routes/api-config.js.map +1 -0
- package/dist/auto-ui/beam/routes/api-marketplace.d.ts +8 -0
- package/dist/auto-ui/beam/routes/api-marketplace.d.ts.map +1 -0
- package/dist/auto-ui/beam/routes/api-marketplace.js +490 -0
- package/dist/auto-ui/beam/routes/api-marketplace.js.map +1 -0
- package/dist/auto-ui/beam/startup.d.ts +41 -0
- package/dist/auto-ui/beam/startup.d.ts.map +1 -0
- package/dist/auto-ui/beam/startup.js +98 -0
- package/dist/auto-ui/beam/startup.js.map +1 -0
- package/dist/auto-ui/beam/subscription.d.ts +35 -0
- package/dist/auto-ui/beam/subscription.d.ts.map +1 -0
- package/dist/auto-ui/beam/subscription.js +151 -0
- package/dist/auto-ui/beam/subscription.js.map +1 -0
- package/dist/auto-ui/beam/types.d.ts +103 -0
- package/dist/auto-ui/beam/types.d.ts.map +1 -0
- package/dist/auto-ui/beam/types.js +8 -0
- package/dist/auto-ui/beam/types.js.map +1 -0
- package/dist/auto-ui/beam.d.ts +2 -0
- package/dist/auto-ui/beam.d.ts.map +1 -1
- package/dist/auto-ui/beam.js +731 -2519
- package/dist/auto-ui/beam.js.map +1 -1
- package/dist/auto-ui/bridge/index.d.ts.map +1 -1
- package/dist/auto-ui/bridge/index.js +10 -2
- package/dist/auto-ui/bridge/index.js.map +1 -1
- package/dist/auto-ui/components/card.d.ts.map +1 -1
- package/dist/auto-ui/components/card.js +3 -1
- package/dist/auto-ui/components/card.js.map +1 -1
- package/dist/auto-ui/components/progress.d.ts.map +1 -1
- package/dist/auto-ui/components/progress.js.map +1 -1
- package/dist/auto-ui/daemon-tools.d.ts +1 -1
- package/dist/auto-ui/daemon-tools.d.ts.map +1 -1
- package/dist/auto-ui/daemon-tools.js +4 -3
- package/dist/auto-ui/daemon-tools.js.map +1 -1
- package/dist/auto-ui/photon-bridge.d.ts +6 -2
- package/dist/auto-ui/photon-bridge.d.ts.map +1 -1
- package/dist/auto-ui/photon-bridge.js +20 -8
- package/dist/auto-ui/photon-bridge.js.map +1 -1
- package/dist/auto-ui/platform-compat.d.ts.map +1 -1
- package/dist/auto-ui/platform-compat.js +4 -0
- package/dist/auto-ui/platform-compat.js.map +1 -1
- package/dist/auto-ui/streamable-http-transport.d.ts +4 -2
- package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
- package/dist/auto-ui/streamable-http-transport.js +120 -30
- package/dist/auto-ui/streamable-http-transport.js.map +1 -1
- package/dist/auto-ui/types.d.ts +4 -2
- package/dist/auto-ui/types.d.ts.map +1 -1
- package/dist/auto-ui/types.js +3 -0
- package/dist/auto-ui/types.js.map +1 -1
- package/dist/beam.bundle.js +9218 -4539
- package/dist/beam.bundle.js.map +4 -4
- package/dist/cli/commands/alias.d.ts +14 -0
- package/dist/cli/commands/alias.d.ts.map +1 -0
- package/dist/cli/commands/alias.js +41 -0
- package/dist/cli/commands/alias.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +9 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +377 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/beam.d.ts +20 -0
- package/dist/cli/commands/beam.d.ts.map +1 -0
- package/dist/cli/commands/beam.js +256 -0
- package/dist/cli/commands/beam.js.map +1 -0
- package/dist/cli/commands/config.d.ts +14 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +165 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +11 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +108 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +14 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +257 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/host.d.ts +11 -0
- package/dist/cli/commands/host.d.ts.map +1 -0
- package/dist/cli/commands/host.js +96 -0
- package/dist/cli/commands/host.js.map +1 -0
- package/dist/cli/commands/info.d.ts +1 -1
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +16 -15
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/init.d.ts +20 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +774 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/maker.d.ts +12 -0
- package/dist/cli/commands/maker.d.ts.map +1 -0
- package/dist/cli/commands/maker.js +605 -0
- package/dist/cli/commands/maker.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +27 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +390 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/package-app.d.ts +1 -1
- package/dist/cli/commands/package-app.d.ts.map +1 -1
- package/dist/cli/commands/package-app.js +5 -4
- package/dist/cli/commands/package-app.js.map +1 -1
- package/dist/cli/commands/package.d.ts +1 -1
- package/dist/cli/commands/package.d.ts.map +1 -1
- package/dist/cli/commands/package.js +134 -32
- package/dist/cli/commands/package.js.map +1 -1
- package/dist/cli/commands/run.d.ts +34 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +334 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/search.d.ts +11 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +60 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +11 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +138 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/test.d.ts +14 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/test.js +51 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/commands/update.d.ts +11 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +72 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +139 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli-alias.js +2 -2
- package/dist/cli-alias.js.map +1 -1
- package/dist/cli.d.ts +3 -16
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -2724
- package/dist/cli.js.map +1 -1
- package/dist/context-store.d.ts +13 -12
- package/dist/context-store.d.ts.map +1 -1
- package/dist/context-store.js +47 -23
- package/dist/context-store.js.map +1 -1
- package/dist/context.d.ts +35 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +38 -0
- package/dist/context.js.map +1 -0
- package/dist/daemon/client.d.ts +25 -13
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +183 -135
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/manager.d.ts +58 -26
- package/dist/daemon/manager.d.ts.map +1 -1
- package/dist/daemon/manager.js +348 -157
- package/dist/daemon/manager.js.map +1 -1
- package/dist/daemon/protocol.d.ts +9 -3
- package/dist/daemon/protocol.d.ts.map +1 -1
- package/dist/daemon/protocol.js +2 -0
- package/dist/daemon/protocol.js.map +1 -1
- package/dist/daemon/server.js +850 -200
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/session-manager.d.ts +16 -2
- package/dist/daemon/session-manager.d.ts.map +1 -1
- package/dist/daemon/session-manager.js +65 -7
- package/dist/daemon/session-manager.js.map +1 -1
- package/dist/daemon/state-machine.d.ts +22 -0
- package/dist/daemon/state-machine.d.ts.map +1 -0
- package/dist/daemon/state-machine.js +48 -0
- package/dist/daemon/state-machine.js.map +1 -0
- package/dist/deploy/cloudflare.d.ts.map +1 -1
- package/dist/deploy/cloudflare.js +5 -5
- package/dist/deploy/cloudflare.js.map +1 -1
- package/dist/loader.d.ts +65 -7
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +587 -63
- package/dist/loader.js.map +1 -1
- package/dist/marketplace-manager.d.ts +87 -13
- package/dist/marketplace-manager.d.ts.map +1 -1
- package/dist/marketplace-manager.js +476 -30
- package/dist/marketplace-manager.js.map +1 -1
- package/dist/path-resolver.d.ts +3 -1
- package/dist/path-resolver.d.ts.map +1 -1
- package/dist/path-resolver.js +4 -3
- package/dist/path-resolver.js.map +1 -1
- package/dist/photon-cli-runner.d.ts +1 -1
- package/dist/photon-cli-runner.d.ts.map +1 -1
- package/dist/photon-cli-runner.js +34 -44
- package/dist/photon-cli-runner.js.map +1 -1
- package/dist/photon-doc-extractor.d.ts +1 -0
- package/dist/photon-doc-extractor.d.ts.map +1 -1
- package/dist/photon-doc-extractor.js +62 -19
- package/dist/photon-doc-extractor.js.map +1 -1
- package/dist/photons/maker.photon.d.ts.map +1 -1
- package/dist/photons/maker.photon.js +4 -4
- package/dist/photons/maker.photon.js.map +1 -1
- package/dist/photons/maker.photon.ts +4 -3
- package/dist/photons/marketplace.photon.d.ts.map +1 -1
- package/dist/photons/marketplace.photon.js +10 -27
- package/dist/photons/marketplace.photon.js.map +1 -1
- package/dist/photons/marketplace.photon.ts +14 -33
- package/dist/photons/tunnel.photon.d.ts.map +1 -1
- package/dist/photons/tunnel.photon.js +4 -8
- package/dist/photons/tunnel.photon.js.map +1 -1
- package/dist/photons/tunnel.photon.ts +4 -7
- package/dist/serv/session/kv-store.d.ts +1 -1
- package/dist/serv/session/kv-store.d.ts.map +1 -1
- package/dist/serv/session/store.d.ts.map +1 -1
- package/dist/serv/session/store.js +16 -14
- package/dist/serv/session/store.js.map +1 -1
- package/dist/serv/vault/token-vault.js +1 -1
- package/dist/serv/vault/token-vault.js.map +1 -1
- package/dist/server.d.ts +34 -12
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +364 -313
- package/dist/server.js.map +1 -1
- package/dist/shared/audit.d.ts +30 -0
- package/dist/shared/audit.d.ts.map +1 -0
- package/dist/shared/audit.js +89 -0
- package/dist/shared/audit.js.map +1 -0
- package/dist/shared/cli-sections.d.ts +0 -4
- package/dist/shared/cli-sections.d.ts.map +1 -1
- package/dist/shared/cli-sections.js +0 -6
- package/dist/shared/cli-sections.js.map +1 -1
- package/dist/shared/cli-utils.d.ts +2 -56
- package/dist/shared/cli-utils.d.ts.map +1 -1
- package/dist/shared/cli-utils.js +1 -87
- package/dist/shared/cli-utils.js.map +1 -1
- package/dist/shared/error-handler.d.ts +6 -72
- package/dist/shared/error-handler.d.ts.map +1 -1
- package/dist/shared/error-handler.js +22 -213
- package/dist/shared/error-handler.js.map +1 -1
- package/dist/shared/security.d.ts +0 -9
- package/dist/shared/security.d.ts.map +1 -1
- package/dist/shared/security.js +0 -30
- package/dist/shared/security.js.map +1 -1
- package/dist/shared-utils.d.ts +0 -26
- package/dist/shared-utils.d.ts.map +1 -1
- package/dist/shared-utils.js +0 -44
- package/dist/shared-utils.js.map +1 -1
- package/dist/shell-completions.d.ts +1 -1
- package/dist/shell-completions.d.ts.map +1 -1
- package/dist/shell-completions.js +5 -5
- package/dist/shell-completions.js.map +1 -1
- package/dist/template-manager.d.ts.map +1 -1
- package/dist/template-manager.js +14 -1
- package/dist/template-manager.js.map +1 -1
- package/dist/test-runner.d.ts +0 -12
- package/dist/test-runner.d.ts.map +1 -1
- package/dist/test-runner.js +4 -39
- package/dist/test-runner.js.map +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +2 -2
- package/dist/testing.js.map +1 -1
- package/dist/version-checker.d.ts +4 -4
- package/dist/version-checker.d.ts.map +1 -1
- package/dist/version-checker.js +33 -4
- package/dist/version-checker.js.map +1 -1
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +14 -12
- package/dist/watcher.js.map +1 -1
- package/package.json +24 -17
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startup.js","sourceRoot":"","sources":["../../../src/auto-ui/beam/startup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscription Management — Ref-counted channel subscriptions + event buffer replay.
|
|
3
|
+
*
|
|
4
|
+
* Manages daemon pub/sub subscriptions with reference counting so channels
|
|
5
|
+
* are subscribed only when at least one client is viewing them.
|
|
6
|
+
* Buffers recent events for delta-sync on reconnect.
|
|
7
|
+
*/
|
|
8
|
+
import type { AnyPhotonInfo } from '../types.js';
|
|
9
|
+
export interface SubscriptionManagerDeps {
|
|
10
|
+
photons: AnyPhotonInfo[];
|
|
11
|
+
workingDir: string;
|
|
12
|
+
}
|
|
13
|
+
export declare class SubscriptionManager {
|
|
14
|
+
private channelSubscriptions;
|
|
15
|
+
private channelEventBuffers;
|
|
16
|
+
private sessionViewState;
|
|
17
|
+
private deps;
|
|
18
|
+
constructor(deps: SubscriptionManagerDeps);
|
|
19
|
+
/** Store an event in the channel buffer */
|
|
20
|
+
bufferEvent(channel: string, method: string, params: Record<string, unknown>): number;
|
|
21
|
+
/** Replay missed events to a session, or signal full sync needed */
|
|
22
|
+
replayEventsToSession(sessionId: string, channel: string, lastTimestamp?: number): {
|
|
23
|
+
replayed: number;
|
|
24
|
+
refreshNeeded: boolean;
|
|
25
|
+
};
|
|
26
|
+
/** Subscribe to a channel (increment ref count, actually subscribe if first) */
|
|
27
|
+
subscribeToChannel(channel: string): Promise<void>;
|
|
28
|
+
/** Unsubscribe from a channel (decrement ref count, actually unsubscribe if last) */
|
|
29
|
+
unsubscribeFromChannel(channel: string): void;
|
|
30
|
+
/** Called when a client starts viewing a board */
|
|
31
|
+
onClientViewingBoard(sessionId: string, photonId: string, itemId: string, lastTimestamp?: number): void;
|
|
32
|
+
/** Called when a client disconnects */
|
|
33
|
+
onClientDisconnect(sessionId: string): void;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=subscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../../src/auto-ui/beam/subscription.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA6BjD,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,oBAAoB,CAA0C;IACtE,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,gBAAgB,CAA6D;IACrF,OAAO,CAAC,IAAI,CAA0B;gBAE1B,IAAI,EAAE,uBAAuB;IAIzC,2CAA2C;IAC3C,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAoBrF,oEAAoE;IACpE,qBAAqB,CACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,GACrB;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,OAAO,CAAA;KAAE;IAqC/C,gFAAgF;IAC1E,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmDxD,qFAAqF;IACrF,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAgB7C,kDAAkD;IAClD,oBAAoB,CAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI;IAoBP,uCAAuC;IACvC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAQ5C"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscription Management — Ref-counted channel subscriptions + event buffer replay.
|
|
3
|
+
*
|
|
4
|
+
* Manages daemon pub/sub subscriptions with reference counting so channels
|
|
5
|
+
* are subscribed only when at least one client is viewing them.
|
|
6
|
+
* Buffers recent events for delta-sync on reconnect.
|
|
7
|
+
*/
|
|
8
|
+
import { subscribeChannel, pingDaemon } from '../../daemon/client.js';
|
|
9
|
+
import { broadcastToBeam, sendToSession } from '../streamable-http-transport.js';
|
|
10
|
+
import { logger } from '../../shared/logger.js';
|
|
11
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
12
|
+
// SUBSCRIPTION MANAGER
|
|
13
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
14
|
+
/** Buffer retention window — events older than this are purged */
|
|
15
|
+
const EVENT_BUFFER_DURATION_MS = 5 * 60 * 1000; // 5 minutes
|
|
16
|
+
export class SubscriptionManager {
|
|
17
|
+
channelSubscriptions = new Map();
|
|
18
|
+
channelEventBuffers = new Map();
|
|
19
|
+
sessionViewState = new Map();
|
|
20
|
+
deps;
|
|
21
|
+
constructor(deps) {
|
|
22
|
+
this.deps = deps;
|
|
23
|
+
}
|
|
24
|
+
/** Store an event in the channel buffer */
|
|
25
|
+
bufferEvent(channel, method, params) {
|
|
26
|
+
let buffer = this.channelEventBuffers.get(channel);
|
|
27
|
+
if (!buffer) {
|
|
28
|
+
buffer = { events: [] };
|
|
29
|
+
this.channelEventBuffers.set(channel, buffer);
|
|
30
|
+
}
|
|
31
|
+
const now = Date.now();
|
|
32
|
+
const event = { id: now, method, params, timestamp: now };
|
|
33
|
+
buffer.events.push(event);
|
|
34
|
+
// Purge events older than retention window
|
|
35
|
+
const cutoff = now - EVENT_BUFFER_DURATION_MS;
|
|
36
|
+
while (buffer.events.length > 0 && buffer.events[0].timestamp < cutoff) {
|
|
37
|
+
buffer.events.shift();
|
|
38
|
+
}
|
|
39
|
+
return now;
|
|
40
|
+
}
|
|
41
|
+
/** Replay missed events to a session, or signal full sync needed */
|
|
42
|
+
replayEventsToSession(sessionId, channel, lastTimestamp) {
|
|
43
|
+
const buffer = this.channelEventBuffers.get(channel);
|
|
44
|
+
if (!buffer || buffer.events.length === 0) {
|
|
45
|
+
return { replayed: 0, refreshNeeded: false };
|
|
46
|
+
}
|
|
47
|
+
if (lastTimestamp === undefined) {
|
|
48
|
+
return { replayed: 0, refreshNeeded: false };
|
|
49
|
+
}
|
|
50
|
+
const oldestEvent = buffer.events[0];
|
|
51
|
+
// Stale: client's timestamp is older than buffer window → full sync needed
|
|
52
|
+
if (lastTimestamp < oldestEvent.timestamp) {
|
|
53
|
+
sendToSession(sessionId, 'photon/refresh-needed', { channel });
|
|
54
|
+
logger.info(`📡 Stale client on ${channel} - last seen ${new Date(lastTimestamp).toISOString()}, oldest buffered ${new Date(oldestEvent.timestamp).toISOString()}, full sync needed`);
|
|
55
|
+
return { replayed: 0, refreshNeeded: true };
|
|
56
|
+
}
|
|
57
|
+
// Delta sync: replay events after client's last timestamp
|
|
58
|
+
const eventsToReplay = buffer.events.filter((e) => e.timestamp > lastTimestamp);
|
|
59
|
+
if (eventsToReplay.length === 0) {
|
|
60
|
+
return { replayed: 0, refreshNeeded: false };
|
|
61
|
+
}
|
|
62
|
+
for (const event of eventsToReplay) {
|
|
63
|
+
sendToSession(sessionId, event.method, { ...event.params, _eventId: event.timestamp });
|
|
64
|
+
}
|
|
65
|
+
logger.info(`📡 Delta sync: ${channel} - replayed ${eventsToReplay.length} events`);
|
|
66
|
+
return { replayed: eventsToReplay.length, refreshNeeded: false };
|
|
67
|
+
}
|
|
68
|
+
/** Subscribe to a channel (increment ref count, actually subscribe if first) */
|
|
69
|
+
async subscribeToChannel(channel) {
|
|
70
|
+
const existing = this.channelSubscriptions.get(channel);
|
|
71
|
+
if (existing) {
|
|
72
|
+
existing.refCount++;
|
|
73
|
+
logger.debug(`Channel ${channel} ref count: ${existing.refCount}`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// First subscriber — actually subscribe to daemon
|
|
77
|
+
const subscription = { refCount: 1, unsubscribe: null };
|
|
78
|
+
this.channelSubscriptions.set(channel, subscription);
|
|
79
|
+
try {
|
|
80
|
+
const [photonId, itemId] = channel.split(':');
|
|
81
|
+
const photon = this.deps.photons.find((p) => p.id === photonId);
|
|
82
|
+
if (!photon) {
|
|
83
|
+
logger.warn(`Cannot subscribe to ${channel}: unknown photon ID ${photonId}`);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const photonName = photon.name;
|
|
87
|
+
const daemonChannel = `${photonName}:${itemId}`;
|
|
88
|
+
const isRunning = await pingDaemon(photonName);
|
|
89
|
+
if (isRunning) {
|
|
90
|
+
const unsubscribe = await subscribeChannel(photonName, daemonChannel, (message) => {
|
|
91
|
+
const params = {
|
|
92
|
+
photonId,
|
|
93
|
+
photon: photonName,
|
|
94
|
+
channel: daemonChannel,
|
|
95
|
+
event: message?.event,
|
|
96
|
+
data: message?.data || message,
|
|
97
|
+
};
|
|
98
|
+
const eventId = this.bufferEvent(channel, 'photon/channel-event', params);
|
|
99
|
+
broadcastToBeam('photon/channel-event', { ...params, _eventId: eventId });
|
|
100
|
+
}, { workingDir: this.deps.workingDir });
|
|
101
|
+
subscription.unsubscribe = unsubscribe;
|
|
102
|
+
logger.info(`📡 Subscribed to ${daemonChannel} (id: ${photonId}, ref: 1)`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Daemon not running — in-process events still work
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** Unsubscribe from a channel (decrement ref count, actually unsubscribe if last) */
|
|
110
|
+
unsubscribeFromChannel(channel) {
|
|
111
|
+
const subscription = this.channelSubscriptions.get(channel);
|
|
112
|
+
if (!subscription)
|
|
113
|
+
return;
|
|
114
|
+
subscription.refCount--;
|
|
115
|
+
logger.debug(`Channel ${channel} ref count: ${subscription.refCount}`);
|
|
116
|
+
if (subscription.refCount <= 0) {
|
|
117
|
+
if (subscription.unsubscribe) {
|
|
118
|
+
subscription.unsubscribe();
|
|
119
|
+
logger.info(`📡 Unsubscribed from ${channel}`);
|
|
120
|
+
}
|
|
121
|
+
this.channelSubscriptions.delete(channel);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Called when a client starts viewing a board */
|
|
125
|
+
onClientViewingBoard(sessionId, photonId, itemId, lastTimestamp) {
|
|
126
|
+
const prevState = this.sessionViewState.get(sessionId);
|
|
127
|
+
// Unsubscribe from previous item if different
|
|
128
|
+
if (prevState?.itemId && (prevState.photonId !== photonId || prevState.itemId !== itemId)) {
|
|
129
|
+
const prevChannel = `${prevState.photonId}:${prevState.itemId}`;
|
|
130
|
+
this.unsubscribeFromChannel(prevChannel);
|
|
131
|
+
}
|
|
132
|
+
// Subscribe to new item
|
|
133
|
+
const channel = `${photonId}:${itemId}`;
|
|
134
|
+
this.sessionViewState.set(sessionId, { photonId, itemId });
|
|
135
|
+
void this.subscribeToChannel(channel);
|
|
136
|
+
// Delta sync missed events if lastTimestamp is provided
|
|
137
|
+
if (lastTimestamp !== undefined) {
|
|
138
|
+
void this.replayEventsToSession(sessionId, channel, lastTimestamp);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/** Called when a client disconnects */
|
|
142
|
+
onClientDisconnect(sessionId) {
|
|
143
|
+
const state = this.sessionViewState.get(sessionId);
|
|
144
|
+
if (state?.photonId && state?.itemId) {
|
|
145
|
+
const channel = `${state.photonId}:${state.itemId}`;
|
|
146
|
+
this.unsubscribeFromChannel(channel);
|
|
147
|
+
}
|
|
148
|
+
this.sessionViewState.delete(sessionId);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=subscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../../src/auto-ui/beam/subscription.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BeamState — Shared state for Beam modules.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the ~30 closure variables in startBeam() with a single
|
|
5
|
+
* typed object that route handlers and utility modules can share.
|
|
6
|
+
*/
|
|
7
|
+
import type { PhotonLoader } from '../../loader.js';
|
|
8
|
+
import type { MarketplaceManager } from '../../marketplace-manager.js';
|
|
9
|
+
import type { PhotonContext } from '../../context.js';
|
|
10
|
+
import type { SimpleRateLimiter } from '../../shared/security.js';
|
|
11
|
+
import type { AnyPhotonInfo, ExternalMCPInfo, MCPServerConfig } from '../types.js';
|
|
12
|
+
import type { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
13
|
+
/** Unified config structure for config.json */
|
|
14
|
+
export interface PhotonConfig {
|
|
15
|
+
photons: Record<string, Record<string, string>>;
|
|
16
|
+
mcpServers: Record<string, MCPServerConfig>;
|
|
17
|
+
}
|
|
18
|
+
/** Channel subscription with reference counting */
|
|
19
|
+
export interface ChannelSubscription {
|
|
20
|
+
photonName: string;
|
|
21
|
+
channelPattern: string;
|
|
22
|
+
refCount: number;
|
|
23
|
+
unsubscribe: () => void;
|
|
24
|
+
}
|
|
25
|
+
/** Buffered event for replay on new subscriptions */
|
|
26
|
+
export interface BufferedEvent {
|
|
27
|
+
channel: string;
|
|
28
|
+
data: unknown;
|
|
29
|
+
timestamp: number;
|
|
30
|
+
}
|
|
31
|
+
/** Route handler signature: returns true if it handled the request */
|
|
32
|
+
export type RouteHandler = (req: import('http').IncomingMessage, res: import('http').ServerResponse, url: URL, state: BeamState) => Promise<boolean>;
|
|
33
|
+
/** Callbacks that route handlers can invoke to trigger side effects */
|
|
34
|
+
export interface BeamActions {
|
|
35
|
+
broadcastPhotonChange: () => void;
|
|
36
|
+
handleFileChange: (photonName: string) => Promise<void>;
|
|
37
|
+
loadSinglePhoton: (name: string) => Promise<AnyPhotonInfo | null>;
|
|
38
|
+
reconnectExternalMCP: (name: string) => Promise<{
|
|
39
|
+
success: boolean;
|
|
40
|
+
error?: string;
|
|
41
|
+
}>;
|
|
42
|
+
loadUIAsset: (photonName: string, uiId: string) => Promise<string | null>;
|
|
43
|
+
subscribeToChannel: (channel: string) => Promise<void>;
|
|
44
|
+
unsubscribeFromChannel: (channel: string) => void;
|
|
45
|
+
configurePhotonViaMCP: (photonName: string, config: Record<string, any>) => Promise<any>;
|
|
46
|
+
reloadPhotonViaMCP: (photonName: string) => Promise<any>;
|
|
47
|
+
removePhotonViaMCP: (photonName: string) => Promise<any>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* BeamState — mutable shared state for the Beam server.
|
|
51
|
+
*
|
|
52
|
+
* Created once in startBeam() and passed to all route handlers and utilities.
|
|
53
|
+
* This replaces the closure-captured variables scattered throughout the 4300-line function.
|
|
54
|
+
*/
|
|
55
|
+
export interface BeamState {
|
|
56
|
+
/** Actions (callbacks) that route handlers can invoke */
|
|
57
|
+
actions: BeamActions;
|
|
58
|
+
/** Resolved working directory */
|
|
59
|
+
workingDir: string;
|
|
60
|
+
/** PhotonContext for path resolution */
|
|
61
|
+
ctx: PhotonContext;
|
|
62
|
+
/** Photon loader instance */
|
|
63
|
+
loader: PhotonLoader;
|
|
64
|
+
/** Marketplace manager */
|
|
65
|
+
marketplace: MarketplaceManager;
|
|
66
|
+
/** In-memory mirror of config.json */
|
|
67
|
+
savedConfig: PhotonConfig;
|
|
68
|
+
/** All loaded photons (configured + unconfigured) */
|
|
69
|
+
photons: AnyPhotonInfo[];
|
|
70
|
+
/** Map of photon name → loaded MCP instance */
|
|
71
|
+
photonMCPs: Map<string, any>;
|
|
72
|
+
/** External MCP server info */
|
|
73
|
+
externalMCPs: ExternalMCPInfo[];
|
|
74
|
+
/** Active MCP transport clients for external MCPs */
|
|
75
|
+
externalMCPClients: Map<string, any>;
|
|
76
|
+
/** Direct SDK clients for resource access */
|
|
77
|
+
externalMCPSDKClients: Map<string, Client>;
|
|
78
|
+
/** Channel subscriptions (ref-counted) */
|
|
79
|
+
channelSubscriptions: Map<string, ChannelSubscription>;
|
|
80
|
+
/** Event buffer for replay */
|
|
81
|
+
channelEventBuffers: Map<string, BufferedEvent[]>;
|
|
82
|
+
/** Per-session view state (which board each session is viewing) */
|
|
83
|
+
sessionViewState: Map<string, string>;
|
|
84
|
+
/** API rate limiter */
|
|
85
|
+
apiRateLimiter: SimpleRateLimiter;
|
|
86
|
+
/** HTTP server instance */
|
|
87
|
+
server: import('http').Server | null;
|
|
88
|
+
/** File watchers */
|
|
89
|
+
watchers: import('fs').FSWatcher[];
|
|
90
|
+
/** Pending reload debounce timers */
|
|
91
|
+
pendingReloads: Map<string, NodeJS.Timeout>;
|
|
92
|
+
/** Currently loading photon names (prevents duplicate loads) */
|
|
93
|
+
activeLoads: Set<string>;
|
|
94
|
+
/** Callbacks to run after a load completes */
|
|
95
|
+
pendingAfterLoad: Map<string, Array<() => void>>;
|
|
96
|
+
/** __dirname of the beam module (for resolving static assets) */
|
|
97
|
+
beamDir: string;
|
|
98
|
+
/** Count of configured photons */
|
|
99
|
+
configuredCount: number;
|
|
100
|
+
/** Count of unconfigured photons */
|
|
101
|
+
unconfiguredCount: number;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/auto-ui/beam/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/auto-ui/beam/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/dist/auto-ui/beam.d.ts
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* Uses MCP Streamable HTTP (POST + SSE) for real-time communication.
|
|
6
6
|
* Version: 2.0.0 (SSE Architecture)
|
|
7
7
|
*/
|
|
8
|
+
export type { PhotonConfig } from './beam/types.js';
|
|
9
|
+
export type { BeamState } from './beam/types.js';
|
|
8
10
|
export declare function startBeam(rawWorkingDir: string, port: number): Promise<void>;
|
|
9
11
|
/**
|
|
10
12
|
* Gracefully stop Beam server and clean up resources.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beam.d.ts","sourceRoot":"","sources":["../../src/auto-ui/beam.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"beam.d.ts","sourceRoot":"","sources":["../../src/auto-ui/beam.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4GH,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAuFjD,wBAAsB,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAy+ClF;AAED;;;GAGG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAmB9C"}
|