@ps-generator-bridge/sdk 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/protocol.ts","../src/requestTracker.ts","../src/transport.ts","../src/connection.ts","../src/photoshop/jsx-runner.ts","../src/photoshop/JsxBuilder.ts","../src/photoshop/PhotoshopLayer.ts","../src/photoshop/PhotoshopLayers.ts","../src/photoshop/PhotoshopSelection.ts","../src/photoshop/PhotoshopDocument.ts","../src/photoshop/PhotoshopApp.ts","../src/photoshop/PsPhotoshopProxy.ts","../src/publicConnection.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * The wire contract shared by the SDK client and the server.\n *\n * This package is the single source of truth for the protocol (ADR 0001): the\n * server depends on this module type-only and implements the same shapes. To add\n * a server capability, model it here first (a new entry in `ProtocolMethods`),\n * then implement it on the server and expose a method on the client.\n */\n\n/** Bumped on any breaking change to the envelope or method shapes. */\nexport const PROTOCOL_VERSION = 1;\n\n/**\n * Request method names shared by the sdk type surface and generator registration.\n * Keep new built-in/module Request names here first, then reference these\n * constants from server decorators so the Protocol remains the source of truth.\n */\nexport const ProtocolMethod = {\n GetServerInfo: \"getServerInfo\",\n JsxRun: \"jsx:run\",\n JsxExecute: \"jsx:execute\",\n EventSubscribe: \"event:subscribe\",\n EventUnsubscribe: \"event:unsubscribe\",\n ActionAutoCutout: \"action:autoCutout\",\n ActionRemoveBackground: \"action:removeBackground\",\n LayerGetInfo: \"layer:getInfo\",\n LayerGetInfoById: \"layer:getInfoById\",\n LayerGetInfoByIndex: \"layer:getInfoByIndex\",\n DocumentCurrent: \"document:current\",\n DocumentExport: \"document:export\",\n DocumentSave: \"document:save\",\n ImageExportLayer: \"image:exportLayer\",\n ImageGetPreview: \"image:getPreview\",\n ImageExportDocument: \"image:exportDocument\",\n} as const;\nexport type ProtocolMethod = (typeof ProtocolMethod)[keyof typeof ProtocolMethod];\n\n/** Every method the server exposes, keyed by name -> { params, result }. */\nexport interface ProtocolMethods {\n [ProtocolMethod.GetServerInfo]: {\n params: Record<string, never>;\n result: ServerInfo;\n };\n [ProtocolMethod.JsxRun]: {\n params: { script: string };\n result: unknown;\n };\n [ProtocolMethod.JsxExecute]: {\n params: { name: string; params?: Record<string, unknown> };\n result: unknown;\n };\n [ProtocolMethod.EventSubscribe]: {\n params: { type: PhotoshopEventName };\n result: { ok: true };\n };\n [ProtocolMethod.EventUnsubscribe]: {\n params: { type: PhotoshopEventName };\n result: { ok: true };\n };\n // Feature-module methods (ADR 0006). The `Domain:action` namespace mirrors the\n // packaged jsx layout (`jsx/Action/<name>.jsx`) and keeps module methods from\n // colliding with built-ins as Document/Layer land. Plugin-specific methods\n // (e.g. SidePaint:*) are NOT declared here — a plugin ships its own method type\n // table with its package; callers reach them via the open\n // `Connection.invoke(method: string, params?)` overload or a plugin wrapper.\n [ProtocolMethod.ActionAutoCutout]: {\n params: Record<string, never>;\n result: boolean;\n };\n [ProtocolMethod.ActionRemoveBackground]: {\n params: Record<string, never>;\n result: { success: boolean };\n };\n [ProtocolMethod.LayerGetInfo]: {\n params?: {\n id?: number;\n index?: number;\n getChildren?: boolean;\n getGeneratorSettings?: boolean;\n };\n result: PsLayer;\n };\n [ProtocolMethod.LayerGetInfoById]: {\n params: { layerID: number; options?: { getChildren: boolean } };\n result: PsLayer;\n };\n [ProtocolMethod.LayerGetInfoByIndex]: {\n params: { layerIndex: number; options?: { getChildren: boolean } };\n result: PsLayer;\n };\n [ProtocolMethod.DocumentCurrent]: {\n params: Record<string, never>;\n result: PsDocument;\n };\n [ProtocolMethod.DocumentExport]: {\n params: { filePath: string } & Record<string, unknown>;\n result: unknown;\n };\n [ProtocolMethod.DocumentSave]: {\n params: { savePath?: string };\n result: unknown;\n };\n // Image module methods (RFC 0008). These return a wire-friendly\n // `WsImageResult` (a `data` string, not raw PNG bytes) so they cross the JSON\n // WS protocol cleanly — unlike the module-internal `ImageResult`, whose\n // `buffer` JSON-serializes to garbage. `settings` is widened to\n // `Record<string, unknown>` so the contract does not drag generator-core's\n // `GetPixmapSettings` namespace across the boundary.\n [ProtocolMethod.ImageExportLayer]: {\n params: { documentId?: number; layerSpec: LayerSpec; settings?: Record<string, unknown> };\n result: WsImageResult;\n };\n [ProtocolMethod.ImageGetPreview]: {\n params: { documentId?: number; layerSpec: number };\n result: WsImageResult;\n };\n [ProtocolMethod.ImageExportDocument]: {\n params: { documentId?: number; settings?: Record<string, unknown> };\n result: WsImageResult;\n };\n}\n\nexport type MethodName = keyof ProtocolMethods;\n\n/**\n * A layer spec: either a layer id, or an index range plus the indices of layers\n * to hide (the form Photoshop's `getLayerPixmap.jsx` accepts). Modeled here as a\n * wire type (RFC 0008) so the protocol is self-contained; the generator's image\n * module re-exports it for its plugin-facing API.\n */\nexport type LayerSpec =\n | number\n | { firstLayerIndex: number; lastLayerIndex: number; hidden: number[] };\n\nexport interface PsRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface PsLayer {\n id: number;\n index: number;\n name: string;\n type: number;\n visible: boolean;\n bounds: PsBounds;\n rect: PsRect;\n clip: boolean;\n children?: PsLayer[];\n}\n\nexport interface PsDocument {\n id: number;\n name: string;\n width: number;\n height: number;\n resolution: number;\n isDirty: boolean;\n filePath?: string;\n}\n\n/**\n * The result of an image `@ws` method (RFC 0008). `data` is an out-of-the-box\n * image string the client can drop straight into an `<img src>`:\n * `data:image/png;base64,...` when inlined, or `https://...` when a `CosService`\n * uploaded it. The client tells them apart by the `data`/`http` prefix — there\n * is deliberately no separate discriminator field. `bounds`/`width`/`height`\n * carry the same geometry as the module-internal `ImageResult`.\n */\nexport interface WsImageResult {\n data: string;\n bounds: PsBounds;\n width: number;\n height: number;\n}\n\nexport interface PsBounds {\n left: number;\n right: number;\n top: number;\n bottom: number;\n}\n\nexport interface ServerInfo {\n name: string;\n version: string;\n /** Photoshop version, when the server is connected to PS; omitted otherwise. */\n psVersion?: string;\n plugins?: PluginInfo[];\n}\n\nexport interface PluginInfo {\n id: string;\n}\n\nexport interface Bounds {\n top: number;\n left: number;\n bottom: number;\n right: number;\n}\n\nexport interface ImageChangedLayer {\n id: number;\n pixels?: boolean;\n removed?: boolean;\n bounds?: Bounds;\n}\n\nexport interface ImageChangedEvent {\n version: string;\n timeStamp: number;\n count: number;\n id: number;\n active?: boolean;\n file?: string;\n closed?: boolean;\n metaDataOnly?: boolean;\n selection?: number[];\n layers?: ImageChangedLayer[];\n}\n\nexport interface PhotoshopEventMap {\n workspaceChanged: string;\n toolChanged: string;\n quickMaskStateChanged: string;\n documentChanged: number;\n closedDocument: number;\n newDocumentViewCreated: number;\n activeViewChanged: number;\n currentDocumentChanged: number;\n backgroundColorChanged: string;\n foregroundColorChanged: string;\n imageChanged: ImageChangedEvent;\n}\n\nexport type PhotoshopEventName = keyof PhotoshopEventMap;\n\n/** A request envelope sent client -> server. */\nexport interface RequestEnvelope<M extends MethodName = MethodName> {\n id: string;\n method: M;\n params: ProtocolMethods[M][\"params\"];\n}\n\n/** A response envelope sent server -> client. */\nexport type ResponseEnvelope<M extends MethodName = MethodName> =\n | { id: string; ok: true; result: ProtocolMethods[M][\"result\"] }\n | { id: string; ok: false; error: ProtocolError };\n\n/**\n * Every server -> client push event, keyed by type -> data payload. Open-ended\n * (ADR 0006): declared keys are strongly typed; an undeclared `type` still flows\n * through the looser `on(type: string, ...)` / `EventEnvelope` overloads.\n */\nexport interface ProtocolEvents {\n /** Handshake: the first event after a socket opens, carrying the clientId. */\n connected: { clientId: string };\n workspaceChanged: PhotoshopEventMap[\"workspaceChanged\"];\n toolChanged: PhotoshopEventMap[\"toolChanged\"];\n quickMaskStateChanged: PhotoshopEventMap[\"quickMaskStateChanged\"];\n documentChanged: PhotoshopEventMap[\"documentChanged\"];\n closedDocument: PhotoshopEventMap[\"closedDocument\"];\n newDocumentViewCreated: PhotoshopEventMap[\"newDocumentViewCreated\"];\n activeViewChanged: PhotoshopEventMap[\"activeViewChanged\"];\n currentDocumentChanged: PhotoshopEventMap[\"currentDocumentChanged\"];\n backgroundColorChanged: PhotoshopEventMap[\"backgroundColorChanged\"];\n foregroundColorChanged: PhotoshopEventMap[\"foregroundColorChanged\"];\n imageChanged: PhotoshopEventMap[\"imageChanged\"];\n // Plugin-specific events (e.g. paint_changed/paint_closed) are NOT declared\n // here — a plugin ships its own event type table with its package. The loose\n // `on(type: string, ...)` / `EventEnvelope` overloads still carry undeclared\n // events.\n}\n\nexport type EventName = keyof ProtocolEvents;\n\n/** A one-way event envelope sent server -> client (no id, no response). */\nexport interface EventEnvelope<E extends EventName = EventName> {\n type: E;\n data: ProtocolEvents[E];\n}\n\nexport interface ProtocolError {\n /**\n * Error code. Server-level codes are values of `ErrorCode`; a plugin may throw\n * its own code (defined in its package), which the server surfaces verbatim\n * (open-ended contract, RFC 0006). Typed here as `string` to admit both.\n */\n code: string;\n message: string;\n}\n\n/**\n * Server-level error codes. Plugin-specific codes (e.g. SidePaint's\n * `PAINT_GONE`/`IMPORT_FAILED`/`VALUE_RESOLVE`/`UNSUPPORTED_SCHEME`) live in\n * their plugin package since RFC 0006 and are surfaced verbatim by the server.\n */\nexport const ErrorCode = {\n UnknownMethod: \"UNKNOWN_METHOD\",\n BadRequest: \"BAD_REQUEST\",\n Internal: \"INTERNAL\",\n} as const;\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Frame discriminators shared by both ends (ADR 0005). The three envelope kinds\n * are told apart by characteristic fields: Request has `method`, Response has a\n * boolean `ok`, Event has `type` and no `id`.\n */\nexport function isRequest(value: unknown): value is RequestEnvelope {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return typeof v.id === \"string\" && typeof v.method === \"string\";\n}\n\nexport function isResponse(value: unknown): value is ResponseEnvelope {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return typeof v.id === \"string\" && typeof v.ok === \"boolean\";\n}\n\nexport function isEvent(value: unknown): value is EventEnvelope {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return typeof v.type === \"string\" && v.id === undefined;\n}\n\n/** Decode a raw text frame. Throws on invalid JSON. Shared by both ends. */\nexport function parseFrame(data: string): unknown {\n return JSON.parse(data);\n}\n\n/** Encode a value into a text frame. Shared by both ends. */\nexport function serializeFrame(value: unknown): string {\n return JSON.stringify(value);\n}\n","import {\n isResponse,\n parseFrame,\n serializeFrame,\n type RequestEnvelope,\n type ResponseEnvelope,\n} from \"./protocol\";\nimport type { Transport } from \"./transport\";\n\ninterface Pending {\n resolve: (value: unknown) => void;\n reject: (error: unknown) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\nlet requestCounter = 0;\nfunction nextId(): string {\n requestCounter += 1;\n return `req-${requestCounter}`;\n}\n\n/**\n * Owns Request id generation, pending correlation, timeout handling, and\n * response/error settlement. Connection and the deprecated PsBridgeClient keep\n * their own adapters around readiness/reconnect, but share this lifecycle.\n */\nexport class RequestTracker {\n private readonly pending = new Map<string, Pending>();\n\n constructor(private readonly timeoutMs: number) {}\n\n send<M extends string, P, R>(transport: Transport | undefined, method: M, params: P): Promise<R> {\n const id = nextId();\n const envelope: RequestEnvelope = { id, method, params } as RequestEnvelope;\n return new Promise<R>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`Request \"${method}\" timed out after ${this.timeoutMs}ms`));\n }, this.timeoutMs);\n this.pending.set(id, {\n resolve: resolve as (value: unknown) => void,\n reject,\n timer,\n });\n transport?.send(serializeFrame(envelope));\n });\n }\n\n settleFrame(data: string): boolean {\n let message: unknown;\n try {\n message = parseFrame(data);\n } catch {\n return false;\n }\n return this.settle(message);\n }\n\n settle(message: unknown): boolean {\n if (!isResponse(message)) return false;\n this.settleResponse(message);\n return true;\n }\n\n failAll(error: Error): void {\n for (const pending of this.pending.values()) {\n clearTimeout(pending.timer);\n pending.reject(error);\n }\n this.pending.clear();\n }\n\n private settleResponse(message: ResponseEnvelope): void {\n const pending = this.pending.get(message.id);\n if (!pending) return;\n this.pending.delete(message.id);\n clearTimeout(pending.timer);\n if (message.ok) {\n pending.resolve(message.result);\n } else {\n pending.reject(new Error(`${message.error.code}: ${message.error.message}`));\n }\n }\n}\n","/**\n * Transport seam (ADR 0002). The client only knows this interface; the default\n * implementation uses the global `WebSocket`. Callers on Node 18-21 (which lack a\n * global WebSocket) or in tests inject their own implementation.\n */\nexport interface Transport {\n /** Resolves once the transport is open and ready to send. */\n ready(): Promise<void>;\n send(data: string): void;\n onMessage(listener: (data: string) => void): void;\n /** Fired when the underlying connection drops (used by Connection to reconnect). */\n onClose(listener: () => void): void;\n close(): void;\n}\n\n/**\n * Build a Transport from a WebSocket constructor + url. If none is injected,\n * falls back to the global `WebSocket`, throwing an actionable error when it is\n * absent (Node 18-21) rather than a cryptic `WebSocket is not defined`.\n *\n * The upgrade path (ADR 0002) — auto-resolving `ws` on Node < 22 — would slot in\n * at `resolveGlobalWebSocket` without changing this signature.\n */\nexport function createWebSocketTransport(url: string, WebSocketImpl?: typeof WebSocket): Transport {\n const Ctor = WebSocketImpl ?? resolveGlobalWebSocket();\n const ws = new Ctor(url);\n\n let opened = false;\n let resolveReady!: () => void;\n let rejectReady!: (err: unknown) => void;\n const readyPromise = new Promise<void>((resolve, reject) => {\n resolveReady = resolve;\n rejectReady = reject;\n });\n\n let closeListener: (() => void) | undefined;\n\n ws.addEventListener(\"open\", () => {\n opened = true;\n resolveReady();\n });\n ws.addEventListener(\"error\", () => {\n if (!opened) rejectReady(new Error(`WebSocket connection to ${url} failed`));\n });\n ws.addEventListener(\"close\", () => closeListener?.());\n\n return {\n ready: () => readyPromise,\n send: (data) => ws.send(data),\n onMessage: (listener) =>\n ws.addEventListener(\"message\", (event) => listener(String((event as MessageEvent).data))),\n onClose: (listener) => {\n closeListener = listener;\n },\n close: () => ws.close(),\n };\n}\n\nfunction resolveGlobalWebSocket(): typeof WebSocket {\n const candidate = (globalThis as { WebSocket?: typeof WebSocket }).WebSocket;\n if (!candidate) {\n throw new Error(\n \"No global WebSocket is available (Node 18-21 lack it). Upgrade to Node 22+, \" +\n \"or inject a transport, e.g. \" +\n \"`new PsBridgeClient({ url, WebSocket: (await import('ws')).WebSocket })`.\"\n );\n }\n return candidate;\n}\n","import {\n type MethodName,\n type ProtocolMethods,\n type ServerInfo,\n type ProtocolEvents,\n type EventName,\n parseFrame,\n isEvent,\n} from \"./protocol\";\nimport { RequestTracker } from \"./requestTracker\";\nimport { type Transport, createWebSocketTransport } from \"./transport\";\n\nexport interface RawConnectionOptions {\n /**\n * ws:// URL to connect to. Use `ws://<host>:<port>/ws` for the public root\n * endpoint, or `ws://<host>:<port>/ws/{pluginId}` for a plugin-scoped raw\n * connection that can invoke that plugin's private methods.\n */\n url: string;\n /** Inject a WebSocket implementation for Node 18-21 (e.g. the `ws` package). */\n WebSocket?: typeof WebSocket;\n /** Override transport creation (primary test seam); receives the per-attempt URL. */\n transportFactory?: (url: string) => Transport;\n /** Per-request timeout in ms (default 10000). */\n timeoutMs?: number;\n /** Max reconnect attempts after a drop before failing (default 5). */\n maxRetries?: number;\n /** Delay between reconnect attempts in ms (default 5000). */\n retryDelayMs?: number;\n /** Optional initial clientId to request via ?id= on first connect. */\n clientId?: string;\n}\n\ntype EventListener = (data: unknown) => void;\n\ninterface ReadyWaiter {\n resolve: () => void;\n reject: (error: unknown) => void;\n}\n\n/**\n * Stateful SDK entry point (ADR 0005/0007). Owns a Transport factory and:\n * reconnects on drop (up to maxRetries), remembers and re-sends its clientId,\n * resolves `ready()` only once the server's `connected` handshake arrives,\n * correlates `invoke` requests to responses, and dispatches subscribed Events.\n *\n * Readiness is a state machine, not a single promise: a transient drop moves it\n * back to \"connecting\" so new and queued `invoke`s wait for the next handshake;\n * exhausting the retry budget moves it to \"failed\" and rejects everything.\n */\nexport class RawConnection {\n private readonly maxRetries: number;\n private readonly retryDelayMs: number;\n private readonly requests: RequestTracker;\n private readonly listeners = new Map<string, Set<EventListener>>();\n\n private transport: Transport | undefined;\n private clientId: string | undefined;\n private attempts = 0;\n private state: \"connecting\" | \"ready\" | \"failed\" = \"connecting\";\n private failError: Error | undefined;\n private readyWaiters: ReadyWaiter[] = [];\n private retryTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(private readonly options: RawConnectionOptions) {\n this.maxRetries = options.maxRetries ?? 5;\n this.retryDelayMs = options.retryDelayMs ?? 5_000;\n this.requests = new RequestTracker(options.timeoutMs ?? 10_000);\n this.clientId = options.clientId;\n this.connect();\n }\n\n /** The clientId assigned by the server (undefined until the first handshake). */\n get id(): string | undefined {\n return this.clientId;\n }\n\n /** Resolves once connected (handshake received); rejects if retries are exhausted. */\n ready(): Promise<void> {\n if (this.state === \"ready\") return Promise.resolve();\n if (this.state === \"failed\") return Promise.reject(this.failError);\n return new Promise<void>((resolve, reject) => {\n this.readyWaiters.push({ resolve, reject });\n });\n }\n\n /** Fetch the server's identity + (when connected to PS) its Photoshop version. */\n getServerInfo(): Promise<ServerInfo> {\n return this.invoke(\"getServerInfo\", {});\n }\n\n /** Send a Request and await its correlated response. Queues during reconnect. */\n invoke<M extends MethodName>(\n method: M,\n params: ProtocolMethods[M][\"params\"]\n ): Promise<ProtocolMethods[M][\"result\"]>;\n invoke(method: string, params?: unknown): Promise<unknown>;\n async invoke(method: string, params?: unknown): Promise<unknown> {\n await this.ready();\n return this.requests.send(this.transport, method, params);\n }\n\n /** Subscribe to a server-pushed Event. */\n on<E extends EventName>(type: E, listener: (data: ProtocolEvents[E]) => void): void;\n on(type: string, listener: (data: unknown) => void): void;\n on(type: string, listener: EventListener): void {\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener);\n }\n\n /** Unsubscribe a previously registered Event listener. */\n off(type: string, listener: EventListener): void {\n this.listeners.get(type)?.delete(listener);\n }\n\n /** Close the connection: stop reconnecting and reject all in-flight work. */\n close(): void {\n if (this.state === \"failed\") return;\n if (this.retryTimer) clearTimeout(this.retryTimer);\n this.fail(new Error(\"Connection closed\"));\n this.transport?.close();\n }\n\n private connect(): void {\n if (this.state === \"failed\") return;\n const url = this.buildUrl();\n const transport = this.options.transportFactory\n ? this.options.transportFactory(url)\n : createWebSocketTransport(url, this.options.WebSocket);\n this.transport = transport;\n\n let settled = false;\n const onDead = (): void => {\n if (settled) return;\n settled = true;\n if (this.transport === transport) this.handleDrop();\n };\n transport.onMessage((data) => this.handleMessage(data));\n transport.onClose(onDead);\n transport.ready().then(() => undefined, onDead);\n }\n\n private buildUrl(): string {\n if (!this.clientId) return this.options.url;\n const sep = this.options.url.includes(\"?\") ? \"&\" : \"?\";\n return `${this.options.url}${sep}id=${encodeURIComponent(this.clientId)}`;\n }\n\n private handleMessage(data: string): void {\n let message: unknown;\n try {\n message = parseFrame(data);\n } catch {\n return; // ignore non-JSON noise\n }\n if (isEvent(message)) {\n if (message.type === \"connected\") {\n this.clientId = (message.data as { clientId: string }).clientId;\n this.attempts = 0; // a successful handshake refills the retry budget\n this.markReady();\n }\n this.dispatchEvent(message.type, message.data);\n return;\n }\n this.requests.settle(message);\n }\n\n private handleDrop(): void {\n if (this.state === \"failed\") return;\n this.transport = undefined;\n this.state = \"connecting\"; // queued + future invokes wait for the next handshake\n if (this.attempts >= this.maxRetries) {\n this.fail(\n new Error(`Connection to ${this.options.url} failed after ${this.maxRetries} retries`)\n );\n return;\n }\n this.attempts += 1;\n this.retryTimer = setTimeout(() => this.connect(), this.retryDelayMs);\n }\n\n private markReady(): void {\n this.state = \"ready\";\n const waiters = this.readyWaiters.splice(0);\n for (const waiter of waiters) waiter.resolve();\n }\n\n private fail(error: Error): void {\n this.state = \"failed\";\n this.failError = error;\n const waiters = this.readyWaiters.splice(0);\n for (const waiter of waiters) waiter.reject(error);\n this.requests.failAll(error);\n }\n\n private dispatchEvent(type: string, data: unknown): void {\n const set = this.listeners.get(type);\n if (!set) return;\n for (const listener of set) listener(data);\n }\n}\n\n/** @deprecated Use RawConnectionOptions. */\nexport type ConnectionOptions = RawConnectionOptions;\n","/**\n * The minimal slice of a JSX runner the Photoshop DOM proxy depends on: run a\n * raw ExtendScript string and resolve its evaluation result. Defined locally\n * (not imported from the generator contract) so the proxy stays transport- and\n * host-agnostic and can be wired to any backend that can evaluate a script.\n *\n * The server's `JsxRunnerApi` satisfies this structurally (`plugin.jsx`), so a\n * plugin passes `this.jsx` straight in. A future client-side backend would\n * supply its own adapter.\n */\nexport interface PsJsxRunner {\n run<T = unknown>(script: string): Promise<T>;\n}\n\n/**\n * Evaluate an ExtendScript expression and JSON-parse its result.\n *\n * `run` returns the evaluation verbatim (a string), so wrapping the expression\n * in `JSON.stringify` on the ExtendScript side is what lets numbers, booleans,\n * strings, arrays and objects all cross the bridge with their real type instead\n * of arriving as untyped strings. `JSON` is available because the default\n * engine is primed with polyfills before any plugin runs.\n */\nexport function evalJson<T>(jsx: PsJsxRunner, expr: string): Promise<T> {\n return jsx.run<string>(`JSON.stringify(${expr})`).then((s) => JSON.parse(s) as T);\n}\n\n/**\n * Read a numeric property, coercing on the ExtendScript side first. Document\n * dimensions are `UnitValue` objects, not plain numbers; `Number(...)` collapses\n * them to their scalar before serialization.\n */\nexport function evalNumber(jsx: PsJsxRunner, expr: string): Promise<number> {\n return evalJson<number>(jsx, `Number(${expr})`);\n}\n\n/** Read a string property (coerced with `String(...)` for safety). */\nexport function evalString(jsx: PsJsxRunner, expr: string): Promise<string> {\n return evalJson<string>(jsx, `String(${expr})`);\n}\n\n/** Read a boolean property (coerced with `Boolean(...)`). */\nexport function evalBool(jsx: PsJsxRunner, expr: string): Promise<boolean> {\n return evalJson<boolean>(jsx, `Boolean(${expr})`);\n}\n","/**\n * Builds ExtendScript fragments from typed values.\n * @internal Used only inside `photoshop/`; not exported from the SDK.\n *\n * Responsibilities: escape string arguments against injection, serialize file\n * paths to `new File(path)`, pass enum strings through verbatim, and serialize\n * numbers, booleans and arrays.\n */\nexport class JsxBuilder {\n /**\n * Escape a string into a JSX string literal. `JSON.stringify` handles quotes,\n * newlines and Unicode.\n *\n * @example JsxBuilder.string(\"O'Brien\") // -> \"\\\"O'Brien\\\"\"\n */\n static string(value: string): string {\n return JSON.stringify(value);\n }\n\n /**\n * Serialize a path to an ExtendScript `File` constructor.\n *\n * @example JsxBuilder.file(\"/path/to/file.psd\") // -> 'new File(\"/path/to/file.psd\")'\n */\n static file(path: string): string {\n return `new File(${JSON.stringify(path)})`;\n }\n\n /** Serialize a number, rejecting NaN/Infinity. */\n static number(value: number): string {\n if (!isFinite(value)) {\n throw new Error(`JsxBuilder.number: invalid value ${value}`);\n }\n return String(value);\n }\n\n /** Serialize a boolean. */\n static boolean(value: boolean): string {\n return value ? \"true\" : \"false\";\n }\n\n /** Pass an enum string through (already in `EnumName.MEMBER` form). */\n static enum_(value: string): string {\n return value;\n }\n\n /**\n * Serialize a numeric array to a JSX array literal (bounds, crop, etc.).\n *\n * @example JsxBuilder.numberArray([0, 0, 100, 100]) // -> '[0,0,100,100]'\n */\n static numberArray(arr: number[]): string {\n return JSON.stringify(arr);\n }\n\n /** Serialize a 2-D numeric array (selection boundary points). */\n static regionArray(region: number[][]): string {\n return JSON.stringify(region);\n }\n\n /**\n * Build a method-call expression from pre-serialized args.\n *\n * @example JsxBuilder.call(\"app.open\", [JsxBuilder.file(path)])\n * // -> 'app.open(new File(\"/path/to/file.psd\"))'\n */\n static call(path: string, args: string[]): string {\n return `${path}(${args.join(\", \")})`;\n }\n\n /**\n * Build a property assignment statement.\n *\n * @example JsxBuilder.assign(\"app.activeDocument.activeLayer.name\", JsxBuilder.string(\"New Name\"))\n * // -> 'app.activeDocument.activeLayer.name = \"New Name\"'\n */\n static assign(path: string, value: string): string {\n return `${path} = ${value}`;\n }\n}\n","import type { PsJsxRunner } from \"./jsx-runner\";\nimport { evalNumber, evalString, evalBool, evalJson } from \"./jsx-runner\";\nimport { JsxBuilder } from \"./JsxBuilder\";\nimport type { BlendModeValue, AnchorPositionValue, ElementPlacementValue } from \"./enums\";\nimport type { PsBounds } from \"./types\";\n\n/**\n * Wraps an ExtendScript Layer / ArtLayer / LayerSet: the shared Layer\n * properties and methods plus ArtLayer-only members such as `kind`.\n *\n * @remarks\n * `activeLayer` may be an ArtLayer or a LayerSet. Read `typename` before\n * touching ArtLayer-only members:\n * - \"ArtLayer\" -> a normal layer, `kind` is valid\n * - \"LayerSet\" -> a group, `kind` is unavailable\n *\n * @example\n * const layer = this.photoshop.activeDocument.activeLayer;\n * const name = await layer.name;\n * await layer.setName(\"Background\");\n * await layer.setVisible(false);\n */\nexport class PhotoshopLayer {\n constructor(\n private readonly _jsx: PsJsxRunner,\n private readonly _path: string // e.g. \"app.activeDocument.activeLayer\"\n ) {}\n\n // --- Layer read-only properties -----------------------------------------\n\n /** Unique layer id. */\n get id(): Promise<number> {\n return evalNumber(this._jsx, `${this._path}.id`);\n }\n\n /** Layer name. */\n get name(): Promise<string> {\n return evalString(this._jsx, `${this._path}.name`);\n }\n\n /** Layer visibility. */\n get visible(): Promise<boolean> {\n return evalBool(this._jsx, `${this._path}.visible`);\n }\n\n /** Layer opacity (0-100). */\n get opacity(): Promise<number> {\n return evalNumber(this._jsx, `${this._path}.opacity`);\n }\n\n /** BlendMode code -> enum-name map (all 27 members, plus newer ones). */\n private static readonly _BLEND_MODE_MAP: Record<number, string> = {\n 1: \"PASSTHROUGH\",\n 2: \"NORMAL\",\n 3: \"DISSOLVE\",\n 4: \"DARKEN\",\n 5: \"MULTIPLY\",\n 6: \"COLORBURN\",\n 7: \"LINEARBURN\",\n 8: \"LIGHTEN\",\n 9: \"SCREEN\",\n 10: \"COLORDODGE\",\n 11: \"LINEARDODGE\",\n 12: \"OVERLAY\",\n 13: \"SOFTLIGHT\",\n 14: \"HARDLIGHT\",\n 15: \"VIVIDLIGHT\",\n 16: \"LINEARLIGHT\",\n 17: \"PINLIGHT\",\n 18: \"DIFFERENCE\",\n 19: \"EXCLUSION\",\n 20: \"HUE\",\n 21: \"SATURATION\",\n 22: \"COLORBLEND\",\n 23: \"LUMINOSITY\",\n 26: \"HARDMIX\",\n 27: \"SUBTRACT\",\n 28: \"DARKERCOLOR\",\n 29: \"LIGHTERCOLOR\",\n 30: \"DIVIDE\",\n };\n\n /**\n * Blend mode as an enum-name string (e.g. \"BlendMode.NORMAL\"). ExtendScript\n * yields the numeric code; the static map turns it into a readable name.\n */\n get blendMode(): Promise<string> {\n return evalNumber(this._jsx, `${this._path}.blendMode`).then(\n (code) => PhotoshopLayer._BLEND_MODE_MAP[code] ?? `BlendMode.UNKNOWN_${code}`\n );\n }\n\n /** Whether the layer is fully locked. */\n get allLocked(): Promise<boolean> {\n return evalBool(this._jsx, `${this._path}.allLocked`);\n }\n\n /**\n * Layer bounds `[left, top, right, bottom]`.\n *\n * @remarks Units follow `rulerUnits`; values are not pixels unless it is\n * `Units.PIXELS`.\n */\n get bounds(): Promise<PsBounds> {\n const expr = `(function(){ var b = ${this._path}.bounds; return [b[0], b[1], b[2], b[3]]; })()`;\n return evalJson<PsBounds>(this._jsx, expr);\n }\n\n // --- ArtLayer-only properties -------------------------------------------\n\n /** LayerKind code -> enum-name map. */\n private static readonly _LAYER_KIND_MAP: Record<number, string> = {\n 1: \"NORMAL\",\n 2: \"TEXT\",\n 3: \"SOLIDFILL\",\n 4: \"GRADIENTFILL\",\n 5: \"LEVELS\",\n 6: \"CURVES\",\n 7: \"COLORBALANCE\",\n 8: \"HUESATURATION\",\n 9: \"BRIGHTNESSCONTRAST\",\n 10: \"THRESHOLD\",\n 11: \"POSTERIZE\",\n 12: \"CHANNELMIXER\",\n 13: \"GRADIENTMAP\",\n 14: \"INVERSION\",\n 15: \"EXPOSURE\",\n 16: \"PHOTOFILTER\",\n 17: \"SELECTIVECOLOR\",\n 18: \"SMARTOBJECT\",\n 20: \"VIBRANCE\",\n 21: \"VIDEO\",\n 22: \"BLACKANDWHITE\",\n 23: \"LAYER3D\",\n 26: \"COLORLOOKUP\",\n };\n\n /**\n * Layer kind as an enum-name string (e.g. \"LayerKind.NORMAL\"). ArtLayer only;\n * reading it on a LayerSet throws. Check `typename` first.\n *\n * @remarks GRADIENTFILL=4 and PATTERNFILL=4 collide in Adobe's enums, so a\n * kind of 4 always maps to GRADIENTFILL.\n */\n get kind(): Promise<string> {\n return evalNumber(this._jsx, `${this._path}.kind`).then(\n (code) => PhotoshopLayer._LAYER_KIND_MAP[code] ?? `LayerKind.UNKNOWN_${code}`\n );\n }\n\n /** Object type name (\"ArtLayer\" or \"LayerSet\"). */\n get typename(): Promise<string> {\n return evalString(this._jsx, `${this._path}.typename`);\n }\n\n // --- Property writes -----------------------------------------------------\n\n /** Set the layer name. */\n async setName(value: string): Promise<void> {\n await this._jsx.run(JsxBuilder.assign(`${this._path}.name`, JsxBuilder.string(value)));\n }\n\n /** Set layer visibility. */\n async setVisible(value: boolean): Promise<void> {\n await this._jsx.run(JsxBuilder.assign(`${this._path}.visible`, JsxBuilder.boolean(value)));\n }\n\n /** Set layer opacity (0-100). */\n async setOpacity(value: number): Promise<void> {\n await this._jsx.run(JsxBuilder.assign(`${this._path}.opacity`, JsxBuilder.number(value)));\n }\n\n /**\n * Set the blend mode.\n *\n * @example\n * import { BlendMode } from \"@ps-generator-bridge/sdk/plugin\";\n * await layer.setBlendMode(BlendMode.MULTIPLY);\n */\n async setBlendMode(value: BlendModeValue): Promise<void> {\n await this._jsx.run(JsxBuilder.assign(`${this._path}.blendMode`, JsxBuilder.enum_(value)));\n }\n\n /** Set whether the layer is fully locked. */\n async setAllLocked(value: boolean): Promise<void> {\n await this._jsx.run(JsxBuilder.assign(`${this._path}.allLocked`, JsxBuilder.boolean(value)));\n }\n\n // --- Methods -------------------------------------------------------------\n\n /** Delete this layer. */\n async remove(): Promise<void> {\n await this._jsx.run(`${this._path}.remove()`);\n }\n\n /** Duplicate this layer (the copy becomes `activeLayer`). */\n async duplicate(): Promise<PhotoshopLayer> {\n await this._jsx.run(`${this._path}.duplicate()`);\n return new PhotoshopLayer(this._jsx, \"app.activeDocument.activeLayer\");\n }\n\n /**\n * Move this layer relative to another.\n *\n * @param relativeObjectJsxPath JSX path of the reference layer (e.g.\n * \"app.activeDocument.layers[0]\").\n * @param insertionLocation placement enum.\n *\n * @remarks Pass a bare JSX path expression. A `PhotoshopLayers.getByName()`\n * path contains quotes and cannot be used as a reference expression here.\n *\n * @example\n * import { ElementPlacement } from \"@ps-generator-bridge/sdk/plugin\";\n * await layer.move(\"app.activeDocument.layers[0]\", ElementPlacement.PLACEBEFORE);\n */\n async move(\n relativeObjectJsxPath: string,\n insertionLocation: ElementPlacementValue\n ): Promise<void> {\n await this._jsx.run(\n `${this._path}.move(${relativeObjectJsxPath}, ${JsxBuilder.enum_(insertionLocation)})`\n );\n }\n\n /** Translate the layer by a pixel delta. */\n async translate(deltaX: number, deltaY: number): Promise<void> {\n await this._jsx.run(\n JsxBuilder.call(`${this._path}.translate`, [\n JsxBuilder.number(deltaX),\n JsxBuilder.number(deltaY),\n ])\n );\n }\n\n /**\n * Scale the layer.\n *\n * @param horizontal horizontal scale percent (150 = 150%).\n * @param vertical vertical scale percent.\n * @param anchor scaling anchor (optional).\n */\n async resize(horizontal: number, vertical: number, anchor?: AnchorPositionValue): Promise<void> {\n const args: string[] = [JsxBuilder.number(horizontal), JsxBuilder.number(vertical)];\n if (anchor !== undefined) args.push(JsxBuilder.enum_(anchor));\n await this._jsx.run(JsxBuilder.call(`${this._path}.resize`, args));\n }\n\n /**\n * Rotate the layer.\n *\n * @param angle degrees, clockwise positive.\n * @param anchor rotation anchor (optional).\n */\n async rotate(angle: number, anchor?: AnchorPositionValue): Promise<void> {\n const args: string[] = [JsxBuilder.number(angle)];\n if (anchor !== undefined) args.push(JsxBuilder.enum_(anchor));\n await this._jsx.run(JsxBuilder.call(`${this._path}.rotate`, args));\n }\n\n /** Move the layer to the end of its stack. */\n async moveToEnd(): Promise<void> {\n await this._jsx.run(`${this._path}.moveToEnd()`);\n }\n}\n","import type { PsJsxRunner } from \"./jsx-runner\";\nimport { evalNumber } from \"./jsx-runner\";\nimport { JsxBuilder } from \"./JsxBuilder\";\nimport { PhotoshopLayer } from \"./PhotoshopLayer\";\n\n/**\n * Wraps an ExtendScript Layers collection (`Document.layers` or\n * `LayerSet.layers`).\n *\n * @example\n * const layers = this.photoshop.activeDocument.layers;\n * const count = await layers.length;\n * const first = layers.at(0);\n * const named = layers.getByName(\"Background\");\n */\nexport class PhotoshopLayers {\n constructor(\n private readonly _jsx: PsJsxRunner,\n private readonly _path: string // e.g. \"app.activeDocument.layers\"\n ) {}\n\n /** Number of layers in the collection. */\n get length(): Promise<number> {\n return evalNumber(this._jsx, `${this._path}.length`);\n }\n\n /**\n * Access a layer by index. The collection is 0-based, matching JavaScript;\n * `layers[0]` is the top-most layer.\n */\n at(index: number): PhotoshopLayer {\n return new PhotoshopLayer(this._jsx, `${this._path}[${index}]`);\n }\n\n /**\n * Look up a layer by name (case-sensitive). The returned wrapper works for\n * property reads/writes but its path contains a `getByName(...)` call, so it\n * must not be passed as `PhotoshopLayer.move()`'s reference path.\n */\n getByName(name: string): PhotoshopLayer {\n const escapedName = JsxBuilder.string(name);\n return new PhotoshopLayer(this._jsx, `${this._path}.getByName(${escapedName})`);\n }\n}\n","import type { PsJsxRunner } from \"./jsx-runner\";\nimport { evalBool, evalJson } from \"./jsx-runner\";\nimport { JsxBuilder } from \"./JsxBuilder\";\nimport type { SelectionTypeValue } from \"./enums\";\nimport type { PsBounds } from \"./types\";\n\n/**\n * Wraps `Document.selection`.\n *\n * @example\n * const sel = this.photoshop.activeDocument.selection;\n * await sel.selectAll();\n * const bounds = await sel.bounds;\n * await sel.deselect();\n */\nexport class PhotoshopSelection {\n constructor(\n private readonly _jsx: PsJsxRunner,\n private readonly _path: string // e.g. \"app.activeDocument.selection\"\n ) {}\n\n /**\n * Selection bounds `[left, top, right, bottom]`. Throws when there is no\n * selection.\n *\n * @remarks Units follow `rulerUnits`.\n */\n get bounds(): Promise<PsBounds> {\n const expr = `(function(){ var b = ${this._path}.bounds; return [b[0], b[1], b[2], b[3]]; })()`;\n return evalJson<PsBounds>(this._jsx, expr);\n }\n\n /** Whether the selection is a solid (un-feathered) rectangle. */\n get solid(): Promise<boolean> {\n return evalBool(this._jsx, `${this._path}.solid`);\n }\n\n // --- Methods -------------------------------------------------------------\n\n /** Select the whole canvas. */\n async selectAll(): Promise<void> {\n await this._jsx.run(`${this._path}.selectAll()`);\n }\n\n /** Deselect. */\n async deselect(): Promise<void> {\n await this._jsx.run(`${this._path}.deselect()`);\n }\n\n /** Invert the selection. */\n async invert(): Promise<void> {\n await this._jsx.run(`${this._path}.invert()`);\n }\n\n /**\n * Create a selection from a region of points.\n *\n * @param region polygon points, e.g. `[[0,0],[100,0],[100,100],[0,100]]`.\n * @param type selection operation (optional, defaults to replace).\n * @param feather feather radius in pixels (optional).\n * @param antiAlias anti-alias the edges (optional).\n *\n * @example\n * import { SelectionType } from \"@ps-generator-bridge/sdk/plugin\";\n * await sel.select([[0,0],[100,0],[100,100],[0,100]], SelectionType.REPLACE, 0, true);\n */\n async select(\n region: number[][],\n type?: SelectionTypeValue,\n feather?: number,\n antiAlias?: boolean\n ): Promise<void> {\n const args: string[] = [JsxBuilder.regionArray(region)];\n if (type !== undefined) args.push(JsxBuilder.enum_(type));\n if (feather !== undefined) args.push(JsxBuilder.number(feather));\n if (antiAlias !== undefined) args.push(JsxBuilder.boolean(antiAlias));\n await this._jsx.run(JsxBuilder.call(`${this._path}.select`, args));\n }\n\n /** Grow the selection by `by` pixels. */\n async expand(by: number): Promise<void> {\n await this._jsx.run(JsxBuilder.call(`${this._path}.expand`, [JsxBuilder.number(by)]));\n }\n\n /** Shrink the selection by `by` pixels. */\n async contract(by: number): Promise<void> {\n await this._jsx.run(JsxBuilder.call(`${this._path}.contract`, [JsxBuilder.number(by)]));\n }\n\n /** Feather the selection edge by `by` pixels. */\n async feather(by: number): Promise<void> {\n await this._jsx.run(JsxBuilder.call(`${this._path}.feather`, [JsxBuilder.number(by)]));\n }\n\n /** Translate the selection boundary (content stays put). */\n async translateBoundary(deltaX: number, deltaY: number): Promise<void> {\n await this._jsx.run(\n JsxBuilder.call(`${this._path}.translateBoundary`, [\n JsxBuilder.number(deltaX),\n JsxBuilder.number(deltaY),\n ])\n );\n }\n}\n","import type { PsJsxRunner } from \"./jsx-runner\";\nimport { evalNumber, evalString, evalBool, evalJson } from \"./jsx-runner\";\nimport { JsxBuilder } from \"./JsxBuilder\";\nimport { PhotoshopLayer } from \"./PhotoshopLayer\";\nimport { PhotoshopLayers } from \"./PhotoshopLayers\";\nimport { PhotoshopSelection } from \"./PhotoshopSelection\";\nimport type { SaveOptionsValue } from \"./enums\";\nimport type { PsBounds } from \"./types\";\n\n/**\n * Wraps an ExtendScript Document.\n *\n * @example\n * const doc = this.photoshop.activeDocument;\n * const name = await doc.name;\n * const [width, height] = await Promise.all([doc.width, doc.height]);\n * await doc.save();\n */\nexport class PhotoshopDocument {\n constructor(\n private readonly _jsx: PsJsxRunner,\n private readonly _path: string // e.g. \"app.activeDocument\"\n ) {}\n\n // --- Read-only properties -----------------------------------------------\n\n /** Document name (file name, without directory). */\n get name(): Promise<string> {\n return evalString(this._jsx, `${this._path}.name`);\n }\n\n /** Unique document id. */\n get id(): Promise<number> {\n return evalNumber(this._jsx, `${this._path}.id`);\n }\n\n /**\n * Document width.\n *\n * @remarks The unit follows Photoshop's current `app.preferences.rulerUnits`.\n * For guaranteed pixels, set `rulerUnits` to `Units.PIXELS` first (e.g. via\n * `this.jsx.run(...)`).\n */\n get width(): Promise<number> {\n return evalNumber(this._jsx, `${this._path}.width`);\n }\n\n /**\n * Document height.\n *\n * @remarks The unit follows `rulerUnits` (see {@link width}).\n */\n get height(): Promise<number> {\n return evalNumber(this._jsx, `${this._path}.height`);\n }\n\n /** Document resolution (PPI). */\n get resolution(): Promise<number> {\n return evalNumber(this._jsx, `${this._path}.resolution`);\n }\n\n /** Document color mode as an enum-name string (e.g. \"DocumentMode.RGB\"). */\n get mode(): Promise<string> {\n const expr = `(function(){\n var m = ${this._path}.mode;\n if (m === DocumentMode.RGB) return \"DocumentMode.RGB\";\n if (m === DocumentMode.CMYK) return \"DocumentMode.CMYK\";\n if (m === DocumentMode.GRAYSCALE) return \"DocumentMode.GRAYSCALE\";\n if (m === DocumentMode.LAB) return \"DocumentMode.LAB\";\n if (m === DocumentMode.BITMAP) return \"DocumentMode.BITMAP\";\n if (m === DocumentMode.INDEXEDCOLOR) return \"DocumentMode.INDEXEDCOLOR\";\n if (m === DocumentMode.MULTICHANNEL) return \"DocumentMode.MULTICHANNEL\";\n if (m === DocumentMode.DUOTONE) return \"DocumentMode.DUOTONE\";\n return String(m);\n })()`;\n return evalJson<string>(this._jsx, expr);\n }\n\n /** Whether the document is saved since its last change. */\n get saved(): Promise<boolean> {\n return evalBool(this._jsx, `${this._path}.saved`);\n }\n\n /**\n * Full document path (native `fsName`). For an unsaved document this may\n * return a temporary path or throw.\n */\n get fullName(): Promise<string> {\n return evalString(this._jsx, `${this._path}.fullName.fsName`);\n }\n\n /** Directory containing the document (native `fsName`). */\n get path(): Promise<string> {\n return evalString(this._jsx, `${this._path}.path.fsName`);\n }\n\n // --- Child navigation (synchronous; no request) -------------------------\n\n /** The active layer. */\n get activeLayer(): PhotoshopLayer {\n return new PhotoshopLayer(this._jsx, `${this._path}.activeLayer`);\n }\n\n /** The Layers collection (ArtLayers + LayerSets). */\n get layers(): PhotoshopLayers {\n return new PhotoshopLayers(this._jsx, `${this._path}.layers`);\n }\n\n /** The selection. */\n get selection(): PhotoshopSelection {\n return new PhotoshopSelection(this._jsx, `${this._path}.selection`);\n }\n\n // --- Methods -------------------------------------------------------------\n\n /** Save the document in its current format. */\n async save(): Promise<void> {\n await this._jsx.run(`${this._path}.save()`);\n }\n\n /**\n * Close the document.\n *\n * @param saving save behavior before closing (defaults to not saving).\n *\n * @example\n * import { SaveOptions } from \"@ps-generator-bridge/sdk/plugin\";\n * await doc.close(SaveOptions.DONOTSAVECHANGES);\n */\n async close(saving: SaveOptionsValue = \"SaveOptions.DONOTSAVECHANGES\"): Promise<void> {\n await this._jsx.run(JsxBuilder.call(`${this._path}.close`, [JsxBuilder.enum_(saving)]));\n }\n\n /**\n * Save to a path. Mirrors ExtendScript\n * `saveAs(saveIn, options?, asCopy?, extensionType?)`; only `saveIn` and\n * `asCopy` are exposed, `options` is undefined and `extensionType` is left to\n * the Photoshop default.\n *\n * @param saveIn destination path.\n * @param asCopy save as a copy (does not change the document's saved state).\n */\n async saveAs(saveIn: string, asCopy?: boolean): Promise<void> {\n const script = `${this._path}.saveAs(${JsxBuilder.file(saveIn)}${\n asCopy !== undefined ? `, undefined, ${JsxBuilder.boolean(asCopy)}` : \"\"\n })`;\n await this._jsx.run(script);\n }\n\n /** Flatten all layers into a single background layer. */\n async flatten(): Promise<void> {\n await this._jsx.run(`${this._path}.flatten()`);\n }\n\n /** Merge all visible layers. */\n async mergeVisibleLayers(): Promise<void> {\n await this._jsx.run(`${this._path}.mergeVisibleLayers()`);\n }\n\n /** Rasterize all layers. */\n async rasterizeAllLayers(): Promise<void> {\n await this._jsx.run(`${this._path}.rasterizeAllLayers()`);\n }\n\n /**\n * Duplicate the document.\n *\n * @param name optional name for the copy.\n * @returns the duplicated document.\n *\n * @remarks Assumes `duplicate()` makes the copy the active document, so the\n * result points at `app.activeDocument`.\n */\n async duplicate(name?: string): Promise<PhotoshopDocument> {\n const args = name !== undefined ? [JsxBuilder.string(name)] : [];\n await this._jsx.run(JsxBuilder.call(`${this._path}.duplicate`, args));\n return new PhotoshopDocument(this._jsx, \"app.activeDocument\");\n }\n\n /**\n * Resize the canvas.\n *\n * @param width new width in pixels.\n * @param height new height in pixels.\n * @param anchor anchor position (optional, defaults to center).\n *\n * @example\n * import { AnchorPosition } from \"@ps-generator-bridge/sdk/plugin\";\n * await doc.resizeCanvas(1920, 1080, AnchorPosition.MIDDLECENTER);\n */\n async resizeCanvas(width: number, height: number, anchor?: string): Promise<void> {\n const args: string[] = [JsxBuilder.number(width), JsxBuilder.number(height)];\n if (anchor !== undefined) args.push(JsxBuilder.enum_(anchor));\n await this._jsx.run(JsxBuilder.call(`${this._path}.resizeCanvas`, args));\n }\n\n /**\n * Resize the image.\n *\n * @param width new width in pixels (optional).\n * @param height new height in pixels (optional).\n * @param resolution new resolution in PPI (optional).\n */\n async resizeImage(width?: number, height?: number, resolution?: number): Promise<void> {\n const args: string[] = [\n width !== undefined ? JsxBuilder.number(width) : \"undefined\",\n height !== undefined ? JsxBuilder.number(height) : \"undefined\",\n resolution !== undefined ? JsxBuilder.number(resolution) : \"undefined\",\n ];\n await this._jsx.run(JsxBuilder.call(`${this._path}.resizeImage`, args));\n }\n\n /** Rotate the canvas by `angle` degrees. */\n async rotateCanvas(angle: number): Promise<void> {\n await this._jsx.run(JsxBuilder.call(`${this._path}.rotateCanvas`, [JsxBuilder.number(angle)]));\n }\n\n /**\n * Crop the document to `bounds` `[left, top, right, bottom]` (pixels).\n *\n * @remarks Only `bounds` is exposed; ExtendScript `crop()` also takes angle,\n * width and height — reach those via `this.jsx.run(...)` if needed.\n */\n async crop(bounds: PsBounds): Promise<void> {\n const script = `${this._path}.crop(${JsxBuilder.numberArray(Array.from(bounds))})`;\n await this._jsx.run(script);\n }\n}\n","import type { PsJsxRunner } from \"./jsx-runner\";\nimport { evalString, evalJson } from \"./jsx-runner\";\nimport { JsxBuilder } from \"./JsxBuilder\";\nimport { PhotoshopDocument } from \"./PhotoshopDocument\";\nimport type { PsColor } from \"./types\";\n\n/**\n * Wraps the ExtendScript global `app` object.\n *\n * @example\n * const version = await this.photoshop.app.version; // \"25.0\"\n * await this.photoshop.app.open(\"/path/to/design.psd\");\n */\nexport class PhotoshopApp {\n private readonly _path = \"app\";\n\n constructor(private readonly _jsx: PsJsxRunner) {}\n\n // --- Read-only properties -----------------------------------------------\n\n /** Photoshop version (e.g. \"25.0\"). */\n get version(): Promise<string> {\n return evalString(this._jsx, `${this._path}.version`);\n }\n\n /** Application locale (e.g. \"zh_CN\"). */\n get locale(): Promise<string> {\n return evalString(this._jsx, `${this._path}.locale`);\n }\n\n /** Application name (e.g. \"Adobe Photoshop\"). */\n get name(): Promise<string> {\n return evalString(this._jsx, `${this._path}.name`);\n }\n\n /** Internal build number. */\n get build(): Promise<string> {\n return evalString(this._jsx, `${this._path}.build`);\n }\n\n /**\n * Install path (native `fsName`). `app.path` is a File in ExtendScript, so the\n * string comes from `.fsName`.\n */\n get path(): Promise<string> {\n return evalString(this._jsx, `${this._path}.path.fsName`);\n }\n\n /**\n * Current foreground color (RGB).\n *\n * @remarks The first version returns only the RGB approximation; in CMYK/Lab\n * documents this is Photoshop's converted RGB and may lose precision. The\n * `cmyk` field is reserved and currently always undefined.\n */\n get foregroundColor(): Promise<PsColor> {\n const expr = `(function(){\n var c = ${this._path}.foregroundColor;\n return {\n model: \"rgb\",\n rgb: { red: c.rgb.red, green: c.rgb.green, blue: c.rgb.blue, hexValue: c.rgb.hexValue }\n };\n })()`;\n return evalJson<PsColor>(this._jsx, expr);\n }\n\n /** Shortcut for `activeDocument` reached through the `app` path. */\n get activeDocument(): PhotoshopDocument {\n return new PhotoshopDocument(this._jsx, `${this._path}.activeDocument`);\n }\n\n // --- Methods -------------------------------------------------------------\n\n /**\n * Open a file and return its Document wrapper. The opened document becomes the\n * active document.\n *\n * @param filePath native or POSIX path.\n *\n * @example\n * const doc = await this.photoshop.app.open(\"/Users/me/design.psd\");\n */\n async open(filePath: string): Promise<PhotoshopDocument> {\n const script = JsxBuilder.call(`${this._path}.open`, [JsxBuilder.file(filePath)]);\n await this._jsx.run(script);\n return new PhotoshopDocument(this._jsx, `${this._path}.activeDocument`);\n }\n\n /** Emit a beep. */\n async beep(): Promise<void> {\n await this._jsx.run(`${this._path}.beep()`);\n }\n}\n","import type { PsJsxRunner } from \"./jsx-runner\";\nimport { PhotoshopApp } from \"./PhotoshopApp\";\nimport { PhotoshopDocument } from \"./PhotoshopDocument\";\n\n/**\n * Entry point of the Photoshop DOM proxy. A plugin reaches it through\n * `this.photoshop`:\n *\n * ```ts\n * const version = await this.photoshop.app.version;\n * const name = await this.photoshop.activeDocument.name;\n * ```\n *\n * Transport-agnostic: every property read and method call lowers to an\n * ExtendScript string run through the injected {@link PsJsxRunner}. The proxy\n * holds no PS state of its own.\n *\n * @remarks\n * - `app` maps to the ExtendScript global `app` (Application).\n * - `activeDocument` is a shortcut for `app.activeDocument`.\n * - With no active document, reading any property of `activeDocument` throws.\n */\nexport class PsPhotoshopProxy {\n /** Application wrapper; its path is fixed to \"app\". */\n readonly app: PhotoshopApp;\n\n private readonly _jsx: PsJsxRunner;\n\n constructor(jsx: PsJsxRunner) {\n this._jsx = jsx;\n this.app = new PhotoshopApp(this._jsx);\n }\n\n /**\n * The active document (shortcut for `app.activeDocument`). A fresh wrapper is\n * created on each access; wrappers are lightweight and stateless.\n */\n get activeDocument(): PhotoshopDocument {\n return new PhotoshopDocument(this._jsx, \"app.activeDocument\");\n }\n}\n","import {\n ProtocolMethod,\n type MethodName,\n type PhotoshopEventMap,\n type PhotoshopEventName,\n type PluginInfo,\n type ProtocolMethods,\n type ServerInfo,\n} from \"./protocol\";\nimport { RawConnection, type RawConnectionOptions } from \"./connection\";\nimport { PsPhotoshopProxy, type PsJsxRunner } from \"./photoshop\";\n\nexport const DEFAULT_CONNECTION_URL = \"ws://127.0.0.1:7700/ws\";\n\nexport interface ConnectionOptions extends Omit<RawConnectionOptions, \"url\"> {\n /** Root ws:// URL. Defaults to ws://127.0.0.1:7700/ws. */\n url?: string;\n}\n\ntype PublicListener<K extends PhotoshopEventName> = (data: PhotoshopEventMap[K]) => void;\ntype Invoker = <M extends MethodName>(\n method: M,\n params: ProtocolMethods[M][\"params\"]\n) => Promise<ProtocolMethods[M][\"result\"]>;\n\nclass PublicEventClient {\n private readonly listeners = new Map<\n PhotoshopEventName,\n Set<PublicListener<PhotoshopEventName>>\n >();\n private readonly wrappers = new WeakMap<\n PublicListener<PhotoshopEventName>,\n PublicListener<PhotoshopEventName>\n >();\n private readonly activeSubscriptions = new Set<PhotoshopEventName>();\n private readonly pendingSubscriptions = new Set<PhotoshopEventName>();\n\n constructor(private readonly invoke: Invoker) {}\n\n on<K extends PhotoshopEventName>(type: K, listener: PublicListener<K>): void {\n const hadListeners = this.listenerCount(type) > 0;\n this.add(type, listener as PublicListener<PhotoshopEventName>);\n if (!hadListeners) this.subscribe(type);\n }\n\n once<K extends PhotoshopEventName>(type: K, listener: PublicListener<K>): void {\n const wrapped = ((data: PhotoshopEventMap[K]) => {\n this.off(type, wrapped as PublicListener<K>);\n listener(data);\n }) as PublicListener<PhotoshopEventName>;\n this.wrappers.set(listener as PublicListener<PhotoshopEventName>, wrapped);\n this.on(type, wrapped as PublicListener<K>);\n }\n\n off<K extends PhotoshopEventName>(type: K, listener: PublicListener<K>): void {\n const key = listener as PublicListener<PhotoshopEventName>;\n const wrapped = this.wrappers.get(key);\n this.wrappers.delete(key);\n const removed = this.remove(type, wrapped ?? key);\n if (removed && this.listenerCount(type) === 0) this.unsubscribe(type);\n }\n\n dispatch(type: string, data: unknown): void {\n const set = this.listeners.get(type as PhotoshopEventName);\n if (!set) return;\n for (const listener of set) listener(data as never);\n }\n\n replay(): void {\n this.activeSubscriptions.clear();\n for (const type of this.listeners.keys()) this.subscribe(type);\n }\n\n private add(type: PhotoshopEventName, listener: PublicListener<PhotoshopEventName>): void {\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener);\n }\n\n private remove(type: PhotoshopEventName, listener: PublicListener<PhotoshopEventName>): boolean {\n const set = this.listeners.get(type);\n if (!set) return false;\n const removed = set.delete(listener);\n if (set.size === 0) this.listeners.delete(type);\n return removed;\n }\n\n private listenerCount(type: PhotoshopEventName): number {\n return this.listeners.get(type)?.size ?? 0;\n }\n\n private subscribe(type: PhotoshopEventName): void {\n if (this.activeSubscriptions.has(type) || this.pendingSubscriptions.has(type)) return;\n this.pendingSubscriptions.add(type);\n void this.invoke(ProtocolMethod.EventSubscribe, { type })\n .then(() => {\n if (this.listenerCount(type) > 0) this.activeSubscriptions.add(type);\n })\n .catch((error) =>\n console.warn(`event subscribe failed for ${type}: ${(error as Error).message}`)\n )\n .finally(() => this.pendingSubscriptions.delete(type));\n }\n\n private unsubscribe(type: PhotoshopEventName): void {\n this.activeSubscriptions.delete(type);\n this.pendingSubscriptions.delete(type);\n void this.invoke(ProtocolMethod.EventUnsubscribe, { type }).catch((error) =>\n console.warn(`event unsubscribe failed for ${type}: ${(error as Error).message}`)\n );\n }\n}\n\nclass PublicJsxRunner implements PsJsxRunner {\n constructor(private readonly invoke: Invoker) {}\n\n run<T = unknown>(script: string): Promise<T> {\n return this.invoke(ProtocolMethod.JsxRun, { script }) as Promise<T>;\n }\n\n execute<T = unknown>(name: string, params?: Record<string, unknown>): Promise<T> {\n return this.invoke(ProtocolMethod.JsxExecute, { name, params }) as Promise<T>;\n }\n}\n\nclass PublicPluginClient {\n constructor(private readonly getServerInfo: () => Promise<ServerInfo>) {}\n\n async list(): Promise<PluginInfo[]> {\n return (await this.getServerInfo()).plugins ?? [];\n }\n\n async has(id: string): Promise<boolean> {\n return (await this.list()).some((plugin) => plugin.id === id);\n }\n}\n\nclass PublicModules {\n readonly layer = {\n getLayerInfo: (params?: ProtocolMethods[typeof ProtocolMethod.LayerGetInfo][\"params\"]) =>\n this.invoke(ProtocolMethod.LayerGetInfo, params),\n getLayerInfoByID: (layerID: number, options?: { getChildren: boolean }) =>\n this.invoke(ProtocolMethod.LayerGetInfoById, { layerID, options }),\n getLayerInfoByIndex: (layerIndex: number, options?: { getChildren: boolean }) =>\n this.invoke(ProtocolMethod.LayerGetInfoByIndex, { layerIndex, options }),\n };\n\n readonly document = {\n getCurrentDocument: () => this.invoke(ProtocolMethod.DocumentCurrent, {}),\n exportDocument: (params: ProtocolMethods[typeof ProtocolMethod.DocumentExport][\"params\"]) =>\n this.invoke(ProtocolMethod.DocumentExport, params),\n saveDocument: (params: ProtocolMethods[typeof ProtocolMethod.DocumentSave][\"params\"]) =>\n this.invoke(ProtocolMethod.DocumentSave, params),\n };\n\n readonly action = {\n autoCutout: () => this.invoke(ProtocolMethod.ActionAutoCutout, {}),\n removeBackground: () => this.invoke(ProtocolMethod.ActionRemoveBackground, {}),\n };\n\n constructor(private readonly invoke: Invoker) {}\n}\n\n/**\n * Public root /ws facade. It exposes framework-owned surfaces only: Photoshop\n * events, jsx, Photoshop DOM proxy, plugin discovery, and built-in modules.\n */\nexport class Connection {\n private readonly raw: RawConnection;\n private readonly call: Invoker;\n private readonly eventClient: PublicEventClient;\n private readonly jsxClient: PublicJsxRunner;\n\n readonly event: Pick<PublicEventClient, \"on\" | \"once\" | \"off\">;\n readonly jsx: Pick<PublicJsxRunner, \"run\" | \"execute\">;\n readonly photoshop: PsPhotoshopProxy;\n readonly plugin: PublicPluginClient;\n readonly modules: PublicModules;\n\n constructor(options: ConnectionOptions = {}) {\n this.raw = new RawConnection({ ...options, url: options.url ?? DEFAULT_CONNECTION_URL });\n this.call = (method, params) => this.raw.invoke(method, params);\n this.eventClient = new PublicEventClient(this.call);\n this.jsxClient = new PublicJsxRunner(this.call);\n this.event = this.eventClient;\n this.jsx = this.jsxClient;\n this.photoshop = new PsPhotoshopProxy(this.jsxClient);\n this.plugin = new PublicPluginClient(() => this.getServerInfo());\n this.modules = new PublicModules(this.call);\n this.raw.on(\"connected\", () => this.eventClient.replay());\n }\n\n get id(): string | undefined {\n return this.raw.id;\n }\n\n ready(): Promise<void> {\n return this.raw.ready();\n }\n\n close(): void {\n this.raw.close();\n }\n\n getServerInfo(): Promise<ServerInfo> {\n return this.call(ProtocolMethod.GetServerInfo, {});\n }\n}\n","import { type MethodName, type ProtocolMethods, type ServerInfo } from \"./protocol\";\nimport { RequestTracker } from \"./requestTracker\";\nimport { type Transport, createWebSocketTransport } from \"./transport\";\n\nexport interface PsBridgeClientOptions {\n /** ws:// URL of the server. Required unless a custom `transport` is given. */\n url?: string;\n /** Inject a transport (primary seam; tests pass a FakeTransport). */\n transport?: Transport;\n /** Inject a WebSocket implementation for Node 18-21 (e.g. the `ws` package). */\n WebSocket?: typeof WebSocket;\n /** Per-request timeout in ms (default 10000). */\n timeoutMs?: number;\n}\n\n/**\n * Typed client over a {@link Transport}. Correlates each request to its response\n * by id; rejects on protocol errors, timeouts, or close.\n *\n * @deprecated Use {@link Connection}, which adds reconnect, a stable clientId, and\n * Event subscription. Retained until existing callers migrate.\n */\nexport class PsBridgeClient {\n private readonly transport: Transport;\n private readonly requests: RequestTracker;\n\n constructor(options: PsBridgeClientOptions) {\n this.requests = new RequestTracker(options.timeoutMs ?? 10_000);\n if (options.transport) {\n this.transport = options.transport;\n } else if (options.url) {\n this.transport = createWebSocketTransport(options.url, options.WebSocket);\n } else {\n throw new Error(\"PsBridgeClient requires either `url` or `transport`.\");\n }\n this.transport.onMessage((data) => this.handleMessage(data));\n }\n\n /** Fetch the server's identity + (when connected to PS) its Photoshop version. */\n getServerInfo(): Promise<ServerInfo> {\n return this.request(\"getServerInfo\", {});\n }\n\n /** Send a typed request and await its correlated response. */\n async request<M extends MethodName>(\n method: M,\n params: ProtocolMethods[M][\"params\"]\n ): Promise<ProtocolMethods[M][\"result\"]> {\n await this.transport.ready();\n return this.requests.send(this.transport, method, params);\n }\n\n /** Reject all in-flight requests and close the transport. */\n close(): void {\n this.requests.failAll(new Error(\"Client closed\"));\n this.transport.close();\n }\n\n private handleMessage(data: string): void {\n this.requests.settleFrame(data);\n }\n}\n"]}
@@ -0,0 +1,210 @@
1
+ import { S as ServerInfo, M as MethodName, P as ProtocolMethods, E as EventName, a as ProtocolEvents, b as PhotoshopEventName, c as PhotoshopEventMap, d as PsJsxRunner, e as PsPhotoshopProxy, f as PluginInfo, g as ProtocolMethod, h as PsLayer, i as PsDocument } from './PsPhotoshopProxy-BjnvziWn.cjs';
2
+ export { B as Bounds, j as ErrorCode, k as EventEnvelope, I as ImageChangedEvent, l as ImageChangedLayer, L as LayerSpec, m as PROTOCOL_VERSION, n as ProtocolError, o as PsBounds, p as PsRect, R as RequestEnvelope, q as ResponseEnvelope, W as WsImageResult, r as isEvent, s as isRequest, t as isResponse, u as parseFrame, v as serializeFrame } from './PsPhotoshopProxy-BjnvziWn.cjs';
3
+
4
+ /**
5
+ * Transport seam (ADR 0002). The client only knows this interface; the default
6
+ * implementation uses the global `WebSocket`. Callers on Node 18-21 (which lack a
7
+ * global WebSocket) or in tests inject their own implementation.
8
+ */
9
+ interface Transport {
10
+ /** Resolves once the transport is open and ready to send. */
11
+ ready(): Promise<void>;
12
+ send(data: string): void;
13
+ onMessage(listener: (data: string) => void): void;
14
+ /** Fired when the underlying connection drops (used by Connection to reconnect). */
15
+ onClose(listener: () => void): void;
16
+ close(): void;
17
+ }
18
+ /**
19
+ * Build a Transport from a WebSocket constructor + url. If none is injected,
20
+ * falls back to the global `WebSocket`, throwing an actionable error when it is
21
+ * absent (Node 18-21) rather than a cryptic `WebSocket is not defined`.
22
+ *
23
+ * The upgrade path (ADR 0002) — auto-resolving `ws` on Node < 22 — would slot in
24
+ * at `resolveGlobalWebSocket` without changing this signature.
25
+ */
26
+ declare function createWebSocketTransport(url: string, WebSocketImpl?: typeof WebSocket): Transport;
27
+
28
+ interface RawConnectionOptions {
29
+ /**
30
+ * ws:// URL to connect to. Use `ws://<host>:<port>/ws` for the public root
31
+ * endpoint, or `ws://<host>:<port>/ws/{pluginId}` for a plugin-scoped raw
32
+ * connection that can invoke that plugin's private methods.
33
+ */
34
+ url: string;
35
+ /** Inject a WebSocket implementation for Node 18-21 (e.g. the `ws` package). */
36
+ WebSocket?: typeof WebSocket;
37
+ /** Override transport creation (primary test seam); receives the per-attempt URL. */
38
+ transportFactory?: (url: string) => Transport;
39
+ /** Per-request timeout in ms (default 10000). */
40
+ timeoutMs?: number;
41
+ /** Max reconnect attempts after a drop before failing (default 5). */
42
+ maxRetries?: number;
43
+ /** Delay between reconnect attempts in ms (default 5000). */
44
+ retryDelayMs?: number;
45
+ /** Optional initial clientId to request via ?id= on first connect. */
46
+ clientId?: string;
47
+ }
48
+ type EventListener = (data: unknown) => void;
49
+ /**
50
+ * Stateful SDK entry point (ADR 0005/0007). Owns a Transport factory and:
51
+ * reconnects on drop (up to maxRetries), remembers and re-sends its clientId,
52
+ * resolves `ready()` only once the server's `connected` handshake arrives,
53
+ * correlates `invoke` requests to responses, and dispatches subscribed Events.
54
+ *
55
+ * Readiness is a state machine, not a single promise: a transient drop moves it
56
+ * back to "connecting" so new and queued `invoke`s wait for the next handshake;
57
+ * exhausting the retry budget moves it to "failed" and rejects everything.
58
+ */
59
+ declare class RawConnection {
60
+ private readonly options;
61
+ private readonly maxRetries;
62
+ private readonly retryDelayMs;
63
+ private readonly requests;
64
+ private readonly listeners;
65
+ private transport;
66
+ private clientId;
67
+ private attempts;
68
+ private state;
69
+ private failError;
70
+ private readyWaiters;
71
+ private retryTimer;
72
+ constructor(options: RawConnectionOptions);
73
+ /** The clientId assigned by the server (undefined until the first handshake). */
74
+ get id(): string | undefined;
75
+ /** Resolves once connected (handshake received); rejects if retries are exhausted. */
76
+ ready(): Promise<void>;
77
+ /** Fetch the server's identity + (when connected to PS) its Photoshop version. */
78
+ getServerInfo(): Promise<ServerInfo>;
79
+ /** Send a Request and await its correlated response. Queues during reconnect. */
80
+ invoke<M extends MethodName>(method: M, params: ProtocolMethods[M]["params"]): Promise<ProtocolMethods[M]["result"]>;
81
+ invoke(method: string, params?: unknown): Promise<unknown>;
82
+ /** Subscribe to a server-pushed Event. */
83
+ on<E extends EventName>(type: E, listener: (data: ProtocolEvents[E]) => void): void;
84
+ on(type: string, listener: (data: unknown) => void): void;
85
+ /** Unsubscribe a previously registered Event listener. */
86
+ off(type: string, listener: EventListener): void;
87
+ /** Close the connection: stop reconnecting and reject all in-flight work. */
88
+ close(): void;
89
+ private connect;
90
+ private buildUrl;
91
+ private handleMessage;
92
+ private handleDrop;
93
+ private markReady;
94
+ private fail;
95
+ private dispatchEvent;
96
+ }
97
+
98
+ declare const DEFAULT_CONNECTION_URL = "ws://127.0.0.1:7700/ws";
99
+ interface ConnectionOptions extends Omit<RawConnectionOptions, "url"> {
100
+ /** Root ws:// URL. Defaults to ws://127.0.0.1:7700/ws. */
101
+ url?: string;
102
+ }
103
+ type PublicListener<K extends PhotoshopEventName> = (data: PhotoshopEventMap[K]) => void;
104
+ type Invoker = <M extends MethodName>(method: M, params: ProtocolMethods[M]["params"]) => Promise<ProtocolMethods[M]["result"]>;
105
+ declare class PublicEventClient {
106
+ private readonly invoke;
107
+ private readonly listeners;
108
+ private readonly wrappers;
109
+ private readonly activeSubscriptions;
110
+ private readonly pendingSubscriptions;
111
+ constructor(invoke: Invoker);
112
+ on<K extends PhotoshopEventName>(type: K, listener: PublicListener<K>): void;
113
+ once<K extends PhotoshopEventName>(type: K, listener: PublicListener<K>): void;
114
+ off<K extends PhotoshopEventName>(type: K, listener: PublicListener<K>): void;
115
+ dispatch(type: string, data: unknown): void;
116
+ replay(): void;
117
+ private add;
118
+ private remove;
119
+ private listenerCount;
120
+ private subscribe;
121
+ private unsubscribe;
122
+ }
123
+ declare class PublicJsxRunner implements PsJsxRunner {
124
+ private readonly invoke;
125
+ constructor(invoke: Invoker);
126
+ run<T = unknown>(script: string): Promise<T>;
127
+ execute<T = unknown>(name: string, params?: Record<string, unknown>): Promise<T>;
128
+ }
129
+ declare class PublicPluginClient {
130
+ private readonly getServerInfo;
131
+ constructor(getServerInfo: () => Promise<ServerInfo>);
132
+ list(): Promise<PluginInfo[]>;
133
+ has(id: string): Promise<boolean>;
134
+ }
135
+ declare class PublicModules {
136
+ private readonly invoke;
137
+ readonly layer: {
138
+ getLayerInfo: (params?: ProtocolMethods[typeof ProtocolMethod.LayerGetInfo]["params"]) => Promise<PsLayer>;
139
+ getLayerInfoByID: (layerID: number, options?: {
140
+ getChildren: boolean;
141
+ }) => Promise<PsLayer>;
142
+ getLayerInfoByIndex: (layerIndex: number, options?: {
143
+ getChildren: boolean;
144
+ }) => Promise<PsLayer>;
145
+ };
146
+ readonly document: {
147
+ getCurrentDocument: () => Promise<PsDocument>;
148
+ exportDocument: (params: ProtocolMethods[typeof ProtocolMethod.DocumentExport]["params"]) => Promise<unknown>;
149
+ saveDocument: (params: ProtocolMethods[typeof ProtocolMethod.DocumentSave]["params"]) => Promise<unknown>;
150
+ };
151
+ readonly action: {
152
+ autoCutout: () => Promise<boolean>;
153
+ removeBackground: () => Promise<{
154
+ success: boolean;
155
+ }>;
156
+ };
157
+ constructor(invoke: Invoker);
158
+ }
159
+ /**
160
+ * Public root /ws facade. It exposes framework-owned surfaces only: Photoshop
161
+ * events, jsx, Photoshop DOM proxy, plugin discovery, and built-in modules.
162
+ */
163
+ declare class Connection {
164
+ private readonly raw;
165
+ private readonly call;
166
+ private readonly eventClient;
167
+ private readonly jsxClient;
168
+ readonly event: Pick<PublicEventClient, "on" | "once" | "off">;
169
+ readonly jsx: Pick<PublicJsxRunner, "run" | "execute">;
170
+ readonly photoshop: PsPhotoshopProxy;
171
+ readonly plugin: PublicPluginClient;
172
+ readonly modules: PublicModules;
173
+ constructor(options?: ConnectionOptions);
174
+ get id(): string | undefined;
175
+ ready(): Promise<void>;
176
+ close(): void;
177
+ getServerInfo(): Promise<ServerInfo>;
178
+ }
179
+
180
+ interface PsBridgeClientOptions {
181
+ /** ws:// URL of the server. Required unless a custom `transport` is given. */
182
+ url?: string;
183
+ /** Inject a transport (primary seam; tests pass a FakeTransport). */
184
+ transport?: Transport;
185
+ /** Inject a WebSocket implementation for Node 18-21 (e.g. the `ws` package). */
186
+ WebSocket?: typeof WebSocket;
187
+ /** Per-request timeout in ms (default 10000). */
188
+ timeoutMs?: number;
189
+ }
190
+ /**
191
+ * Typed client over a {@link Transport}. Correlates each request to its response
192
+ * by id; rejects on protocol errors, timeouts, or close.
193
+ *
194
+ * @deprecated Use {@link Connection}, which adds reconnect, a stable clientId, and
195
+ * Event subscription. Retained until existing callers migrate.
196
+ */
197
+ declare class PsBridgeClient {
198
+ private readonly transport;
199
+ private readonly requests;
200
+ constructor(options: PsBridgeClientOptions);
201
+ /** Fetch the server's identity + (when connected to PS) its Photoshop version. */
202
+ getServerInfo(): Promise<ServerInfo>;
203
+ /** Send a typed request and await its correlated response. */
204
+ request<M extends MethodName>(method: M, params: ProtocolMethods[M]["params"]): Promise<ProtocolMethods[M]["result"]>;
205
+ /** Reject all in-flight requests and close the transport. */
206
+ close(): void;
207
+ private handleMessage;
208
+ }
209
+
210
+ export { Connection, type ConnectionOptions, DEFAULT_CONNECTION_URL, EventName, MethodName, PhotoshopEventMap, PhotoshopEventName, PluginInfo, ProtocolEvents, ProtocolMethod, ProtocolMethod as ProtocolMethodName, ProtocolMethods, PsBridgeClient, type PsBridgeClientOptions, PsDocument, PsLayer, RawConnection, type RawConnectionOptions, ServerInfo, type Transport, createWebSocketTransport };