zidane 8.2.3 → 8.2.5
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/dist/{acp-oYRjlh71.js → acp-BIInKhVI.js} +6 -6
- package/dist/{acp-oYRjlh71.js.map → acp-BIInKhVI.js.map} +1 -1
- package/dist/acp-cli.js +4 -4
- package/dist/acp.d.ts +2 -2
- package/dist/acp.js +1 -1
- package/dist/{agent-CBQglXtH.js → agent-CmhCOmyO.js} +10 -5
- package/dist/{agent-CBQglXtH.js.map → agent-CmhCOmyO.js.map} +1 -1
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +1 -1
- package/dist/chat/pure.d.ts +4 -4
- package/dist/chat/pure.js +7 -7
- package/dist/chat.d.ts +3 -3
- package/dist/chat.js +16 -16
- package/dist/{cli-shared-E5m_pI8A.js → cli-shared-GOehTeqk.js} +2 -2
- package/dist/{cli-shared-E5m_pI8A.js.map → cli-shared-GOehTeqk.js.map} +1 -1
- package/dist/{client-core-EEEX_u6D.d.ts → client-core-Dz8hELs4.d.ts} +15 -5
- package/dist/client-core-Dz8hELs4.d.ts.map +1 -0
- package/dist/codemode-worker.js +1 -1
- package/dist/codemode.js +1 -1
- package/dist/{connection-loop-CpgfUmuw.d.ts → connection-loop-dm_TN-QD.d.ts} +3 -3
- package/dist/{connection-loop-CpgfUmuw.d.ts.map → connection-loop-dm_TN-QD.d.ts.map} +1 -1
- package/dist/contexts/daytona.d.ts +1 -1
- package/dist/contexts/e2b.d.ts +1 -1
- package/dist/{credentials-B9DfBJP9.js → credentials-DxOQmset.js} +2 -2
- package/dist/{credentials-B9DfBJP9.js.map → credentials-DxOQmset.js.map} +1 -1
- package/dist/daemon-cli.js +2 -2
- package/dist/{dispatcher-Bv9-c6I2.js → dispatcher-D_9_QFO3.js} +22 -18
- package/dist/dispatcher-D_9_QFO3.js.map +1 -0
- package/dist/{engine-XmoPPB6U.js → engine-BsWBWgTB.js} +6 -6
- package/dist/{engine-XmoPPB6U.js.map → engine-BsWBWgTB.js.map} +1 -1
- package/dist/{eval-CfQlBR81.js → eval-CIHIF_Ns.js} +3 -3
- package/dist/{eval-CfQlBR81.js.map → eval-CIHIF_Ns.js.map} +1 -1
- package/dist/eval.d.ts +1 -1
- package/dist/eval.js +1 -1
- package/dist/{executor-BhthPE1q.js → executor-BSesPPcU.js} +3 -3
- package/dist/{executor-BhthPE1q.js.map → executor-BSesPPcU.js.map} +1 -1
- package/dist/{extensions-BgBwogRW.js → extensions-BJof-2mi.js} +3 -3
- package/dist/{extensions-BgBwogRW.js.map → extensions-BJof-2mi.js.map} +1 -1
- package/dist/extensions.d.ts +1 -1
- package/dist/extensions.js +1 -1
- package/dist/{fold-rules-DSypi36k.d.ts → fold-rules-CMpWNPqk.d.ts} +2 -2
- package/dist/{fold-rules-DSypi36k.d.ts.map → fold-rules-CMpWNPqk.d.ts.map} +1 -1
- package/dist/{headless-R4pbpTkm.js → headless-Bs9Lb4vs.js} +4 -4
- package/dist/{headless-R4pbpTkm.js.map → headless-Bs9Lb4vs.js.map} +1 -1
- package/dist/headless.d.ts +1 -1
- package/dist/headless.js +1 -1
- package/dist/history-worker.js +1 -1
- package/dist/{host-scoped-settings-C-Nmb6vr.js → host-scoped-settings-DxxI_yRo.js} +2 -2
- package/dist/{host-scoped-settings-C-Nmb6vr.js.map → host-scoped-settings-DxxI_yRo.js.map} +1 -1
- package/dist/{host-signals-BFudPyCT.js → host-signals-CUKPZZxC.js} +5 -5
- package/dist/{host-signals-BFudPyCT.js.map → host-signals-CUKPZZxC.js.map} +1 -1
- package/dist/{index-DyQyDLX1.d.ts → index-4mDRyTGJ.d.ts} +1722 -1691
- package/dist/index-4mDRyTGJ.d.ts.map +1 -0
- package/dist/{index-CDS7YdUC.d.ts → index-Dlmu8HnG.d.ts} +5 -5
- package/dist/{index-CDS7YdUC.d.ts.map → index-Dlmu8HnG.d.ts.map} +1 -1
- package/dist/{index-AqRZ3gEz.d.ts → index-QsAN9yjZ.d.ts} +3 -3
- package/dist/{index-AqRZ3gEz.d.ts.map → index-QsAN9yjZ.d.ts.map} +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +8 -8
- package/dist/ipc/remote.d.ts +5 -5
- package/dist/ipc/remote.js +3 -3
- package/dist/ipc.d.ts +5 -5
- package/dist/ipc.js +9 -9
- package/dist/{links-rFaWqS2Y.js → links-Bto-5dVu.js} +10 -10
- package/dist/{links-rFaWqS2Y.js.map → links-Bto-5dVu.js.map} +1 -1
- package/dist/{mcp-allowlist-CLXweyxk.js → mcp-allowlist-BbnTBKNN.js} +2 -2
- package/dist/{mcp-allowlist-CLXweyxk.js.map → mcp-allowlist-BbnTBKNN.js.map} +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/{oauth-7_48zR7n.js → oauth-BwPiX0hL.js} +66 -32
- package/dist/oauth-BwPiX0hL.js.map +1 -0
- package/dist/output/stream-json.d.ts +1 -1
- package/dist/output/terminal.d.ts +1 -1
- package/dist/plugins.d.ts +1 -1
- package/dist/{prelude-HzY_JEGq.js → prelude-qjPUkw4f.js} +26 -2
- package/dist/prelude-qjPUkw4f.js.map +1 -0
- package/dist/{presets-DXeHsd24.js → presets-C4hkykN-.js} +2 -2
- package/dist/{presets-DXeHsd24.js.map → presets-C4hkykN-.js.map} +1 -1
- package/dist/presets.d.ts +1 -1
- package/dist/presets.js +1 -1
- package/dist/{protocol-BIv1Yuvl.js → protocol-Do_i6Ras.js} +3 -1
- package/dist/protocol-Do_i6Ras.js.map +1 -0
- package/dist/providers/anthropic.d.ts +1 -1
- package/dist/providers/arcee.d.ts +1 -1
- package/dist/providers/baseten.d.ts +1 -1
- package/dist/providers/cerebras.d.ts +1 -1
- package/dist/providers/google.d.ts +1 -1
- package/dist/providers/local.d.ts +1 -1
- package/dist/providers/neuralwatt.d.ts +1 -1
- package/dist/providers/openai-compat.d.ts +1 -1
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/xai.d.ts +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/{registry-eourRLY2.js → registry-DxPP_tAt.js} +3 -3
- package/dist/{registry-eourRLY2.js.map → registry-DxPP_tAt.js.map} +1 -1
- package/dist/{remote-hosts-DY2J07ut.js → remote-hosts-DcCh7fqp.js} +4 -4
- package/dist/{remote-hosts-DY2J07ut.js.map → remote-hosts-DcCh7fqp.js.map} +1 -1
- package/dist/restate.d.ts +1 -1
- package/dist/{secret-shapes-BjW4l6U0.js → secret-shapes-HvaYVzwc.js} +10 -2
- package/dist/secret-shapes-HvaYVzwc.js.map +1 -0
- package/dist/session/sqlite.d.ts +1 -1
- package/dist/{session-7TUHs42_.js → session-CCsKXID6.js} +6 -2
- package/dist/session-CCsKXID6.js.map +1 -0
- package/dist/{session-factory-CMwIXE-7.js → session-factory-Ct7J9CK1.js} +6 -6
- package/dist/{session-factory-CMwIXE-7.js.map → session-factory-Ct7J9CK1.js.map} +1 -1
- package/dist/session.d.ts +2 -2
- package/dist/session.js +1 -1
- package/dist/{settings-keys-CPdmkTz7.js → settings-keys-CnrJgT1T.js} +4 -4
- package/dist/{settings-keys-CPdmkTz7.js.map → settings-keys-CnrJgT1T.js.map} +1 -1
- package/dist/{shell-path-B8b3EOtK.js → shell-path-rJDa0OMv.js} +4 -4
- package/dist/{shell-path-B8b3EOtK.js.map → shell-path-rJDa0OMv.js.map} +1 -1
- package/dist/skills.d.ts +1 -1
- package/dist/{spaces-CyjMh5Zf.js → spaces-C_x2bvEl.js} +14 -4
- package/dist/spaces-C_x2bvEl.js.map +1 -0
- package/dist/{store-L01W0gGI.js → store-BpkWIaSH.js} +10 -30
- package/dist/store-BpkWIaSH.js.map +1 -0
- package/dist/{todo-edits-BERpCRPj.js → todo-edits-DKoxu7Ss.js} +3 -3
- package/dist/{todo-edits-BERpCRPj.js.map → todo-edits-DKoxu7Ss.js.map} +1 -1
- package/dist/tools/fetch-url.d.ts +1 -1
- package/dist/tools/web-search.d.ts +1 -1
- package/dist/{tools-pZVFIJ_K.js → tools-FHEIKGkh.js} +2 -2
- package/dist/{tools-pZVFIJ_K.js.map → tools-FHEIKGkh.js.map} +1 -1
- package/dist/tools.d.ts +1 -1
- package/dist/tools.js +2 -2
- package/dist/{transcript-anchors-jHrg-r-H.js → transcript-anchors-BcFLh3ZA.js} +10 -10
- package/dist/{transcript-anchors-jHrg-r-H.js.map → transcript-anchors-BcFLh3ZA.js.map} +1 -1
- package/dist/{transcript-cache-DXdgVuoy.js → transcript-cache-CdHKtx9y.js} +4 -4
- package/dist/{transcript-cache-DXdgVuoy.js.map → transcript-cache-CdHKtx9y.js.map} +1 -1
- package/dist/{transcript-reconcile-CPdrNbbR.js → transcript-reconcile-D_SWw6dX.js} +11 -3
- package/dist/transcript-reconcile-D_SWw6dX.js.map +1 -0
- package/dist/tui.d.ts +7 -7
- package/dist/tui.js +24 -23
- package/dist/tui.js.map +1 -1
- package/dist/{turn-operations-DuGtKuc_.d.ts → turn-operations-Dbk3xPKu.d.ts} +11 -3
- package/dist/{turn-operations-DuGtKuc_.d.ts.map → turn-operations-Dbk3xPKu.d.ts.map} +1 -1
- package/dist/{types-C0PJmBaO.d.ts → types-CMXR7A0b.d.ts} +2 -2
- package/dist/{types-C0PJmBaO.d.ts.map → types-CMXR7A0b.d.ts.map} +1 -1
- package/dist/types-CzmghX7C.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/{url-D8KZ7Edw.js → url-D4vG7lzO.js} +2 -2
- package/dist/{url-D8KZ7Edw.js.map → url-D4vG7lzO.js.map} +1 -1
- package/dist/{version-bd3DQJkc.js → version-DOvIuU8M.js} +2 -2
- package/dist/{version-bd3DQJkc.js.map → version-DOvIuU8M.js.map} +1 -1
- package/dist/{workspace-exec-stream-CyfYgqAh.js → workspace-exec-stream-Bzxczzu2.js} +5 -5
- package/dist/{workspace-exec-stream-CyfYgqAh.js.map → workspace-exec-stream-Bzxczzu2.js.map} +1 -1
- package/dist/{write-file-QYrcDdl3.js → write-file-ChtRPdEL.js} +3 -3
- package/dist/{write-file-QYrcDdl3.js.map → write-file-ChtRPdEL.js.map} +1 -1
- package/dist/{ws-CURQ2igk.js → ws-CrD-4Mx6.js} +6 -6
- package/dist/{ws-CURQ2igk.js.map → ws-CrD-4Mx6.js.map} +1 -1
- package/dist/{ws-client-BVljYbdb.js → ws-client-Dond8vT3.js} +4 -4
- package/dist/{ws-client-BVljYbdb.js.map → ws-client-Dond8vT3.js.map} +1 -1
- package/docs/CODEMODE.md +6 -0
- package/docs/IPC.md +2 -0
- package/docs/ONBOARDING.md +1 -1
- package/package.json +1 -1
- package/dist/client-core-EEEX_u6D.d.ts.map +0 -1
- package/dist/dispatcher-Bv9-c6I2.js.map +0 -1
- package/dist/index-DyQyDLX1.d.ts.map +0 -1
- package/dist/oauth-7_48zR7n.js.map +0 -1
- package/dist/prelude-HzY_JEGq.js.map +0 -1
- package/dist/protocol-BIv1Yuvl.js.map +0 -1
- package/dist/secret-shapes-BjW4l6U0.js.map +0 -1
- package/dist/session-7TUHs42_.js.map +0 -1
- package/dist/spaces-CyjMh5Zf.js.map +0 -1
- package/dist/store-L01W0gGI.js.map +0 -1
- package/dist/transcript-reconcile-CPdrNbbR.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-signals-BFudPyCT.js","names":[],"sources":["../src/tui/runtime/transport.ts","../src/tui/host/host-signals.ts"],"sourcesContent":["/**\n * How a window reaches its chat host: the shared daemon over its unix\n * socket (spawned on demand), a host running in the window's own process,\n * or a remote server over a WebSocket.\n * Everything above the transport (`connectHostSession`, the presence\n * watcher) speaks `IpcClient` and cannot tell which one it got.\n */\nimport type { IpcClient } from '../../ipc/client'\nimport type { HostFailureKind } from '../../ipc/hosts/connection-loop'\nimport type { InProcessHost } from '../../ipc/memory'\nimport { JsonRpcConnectionClosedError } from '../../acp/json-rpc'\nimport { connectIpcClient, connectOrSpawnDaemon } from '../../ipc/client'\nimport { defaultSocketPath, ensureDaemonRunning, selfDaemonSpawnCommand } from '../../ipc/daemon/lifecycle'\n\nexport interface HostConnectOptions {\n appVersion?: string\n /** The connection dropped (daemon exit, socket error, host shutdown). Not called for `close()`. */\n onClose?: () => void\n /**\n * A watcher that must never retire a mismatched daemon (the presence\n * client): it connects to whatever is running and degrades instead.\n * Session controllers are active: a stale daemon is drained and respawned.\n * Meaningless in-process, where client and host are one build.\n */\n passive?: boolean\n /** Give up before connecting once aborted (the attempt was superseded). */\n signal?: AbortSignal\n}\n\nexport interface HostTransport {\n connect: (options?: HostConnectOptions) => Promise<IpcClient>\n /**\n * How a failed `connect` is handled (`../../ipc/hosts/connection-loop`):\n * a server's refusal for good, another protocol version, or \"retry\".\n * Absent: always retry (This computer's daemon).\n */\n classify?: (err: unknown) => Promise<HostFailureKind>\n}\n\n/** The shared daemon over its socket; spawns one when none is listening. */\nexport function socketTransport(options: { socketPath?: string, spawnCommand?: string[] } = {}): HostTransport {\n // Resolved once: a window keeps talking to the daemon it started with,\n // even if the environment that named it changes before a reconnect.\n const socketPath = { socketPath: options.socketPath ?? defaultSocketPath() }\n return {\n async connect(connectOptions = {}) {\n const spawnCommand = options.spawnCommand ?? selfDaemonSpawnCommand()\n const common = {\n ...(connectOptions.appVersion ? { appVersion: connectOptions.appVersion } : {}),\n ...(connectOptions.onClose ? { onClose: connectOptions.onClose } : {}),\n }\n if (connectOptions.passive) {\n const path = await ensureDaemonRunning({ ...socketPath, spawnCommand })\n connectOptions.signal?.throwIfAborted()\n return connectIpcClient({ ...common, socketPath: path, drainOnMismatch: false })\n }\n connectOptions.signal?.throwIfAborted()\n return connectOrSpawnDaemon({ ...common, ...socketPath, spawnCommand })\n },\n }\n}\n\n/**\n * A remote host over a WebSocket (`zidane-server`). Nothing to spawn and\n * nothing to drain: `passive` changes nothing, a version mismatch is the\n * server's to resolve. The WebSocket client loads on the first connect, so\n * a window that never goes remote never loads it.\n */\nexport function wsTransport(options: { url: string, token?: string, expectHostId?: string }): HostTransport {\n return {\n async connect(connectOptions = {}) {\n connectOptions.signal?.throwIfAborted()\n const { connectWsClient } = await import('../../ipc/transports/ws-client')\n connectOptions.signal?.throwIfAborted()\n return connectWsClient({\n url: options.url,\n ...(options.token ? { token: options.token } : {}),\n ...(options.expectHostId ? { expectHostId: options.expectHostId } : {}),\n ...(connectOptions.appVersion ? { appVersion: connectOptions.appVersion } : {}),\n ...(connectOptions.onClose ? { onClose: connectOptions.onClose } : {}),\n ...(connectOptions.signal ? { signal: connectOptions.signal } : {}),\n })\n },\n async classify(err) {\n const { classifyWsFailure } = await import('../../ipc/hosts/ws')\n return classifyWsFailure(err)\n },\n }\n}\n\n/** A host in this process (see `startInProcessHost`). */\nexport function inProcessTransport(host: InProcessHost): HostTransport {\n return {\n async connect(options = {}) {\n options.signal?.throwIfAborted()\n return host.connect({\n ...(options.appVersion ? { appVersion: options.appVersion } : {}),\n ...(options.onClose ? { onClose: options.onClose } : {}),\n })\n },\n }\n}\n\nexport interface LazyInProcessTransport extends HostTransport {\n /** The host, once a connect started it. */\n started: () => InProcessHost | null\n /**\n * Shut the host down if it started (runs abort, clients' `onClose` fires)\n * and refuse later connects. Idempotent.\n */\n close: () => Promise<void>\n}\n\n/**\n * A host in this process, started by the first connect (a window that never\n * opens a session never builds one). A failed start is retried by the next.\n */\nexport function lazyInProcessTransport(start: () => Promise<InProcessHost>): LazyInProcessTransport {\n let starting: Promise<InProcessHost> | null = null\n let host: InProcessHost | null = null\n let closed = false\n const ensure = (): Promise<InProcessHost> => {\n starting ??= start().then(\n (started) => {\n host = started\n return started\n },\n (err: unknown) => {\n starting = null\n throw err\n },\n )\n return starting\n }\n return {\n async connect(options = {}) {\n if (closed)\n throw new JsonRpcConnectionClosedError()\n const started = await ensure()\n // Closed while starting: the close below shuts it down.\n if (closed)\n throw new JsonRpcConnectionClosedError()\n return inProcessTransport(started).connect(options)\n },\n started: () => host,\n async close() {\n closed = true\n const pending = starting\n if (!pending)\n return\n const started = await pending.catch(() => null)\n await started?.close()\n },\n }\n}\n","/**\n * What the window takes from a directory host's app-lifetime connection\n * (the shared connection loop's callbacks): its presence rows\n * (`presence.list` on connect, then `presence:changed`; none while it is\n * down) and its session changes (`sessions:changed`, which a host sends\n * every connection, watching a session or not). No WebSocket import.\n */\nimport type { HostSignal, IpcClient, SessionPresence } from '../../ipc/index'\n\nexport interface HostSignalSinks {\n onPresence?: (key: string, rows: readonly SessionPresence[]) => void\n /** Connected (also after a reconnect): the list should refresh. */\n onConnected?: (key: string) => void\n onSessionsChanged?: (key: string) => void\n}\n\nexport function hostSignalHandlers(sinks: HostSignalSinks): {\n onSignal: (key: string, signal: HostSignal) => void\n onConnected: (key: string, client: IpcClient) => void\n onDisconnected: (key: string) => void\n} {\n const { onPresence, onConnected, onSessionsChanged } = sinks\n return {\n onSignal: (key, signal) => {\n if (signal.kind === 'presence:changed')\n onPresence?.(key, signal.sessions)\n else if (signal.kind === 'sessions:changed')\n onSessionsChanged?.(key)\n },\n onConnected: (key, client) => {\n onConnected?.(key)\n if (onPresence)\n void client.request('presence.list', {}).then(rows => onPresence(key, rows), () => undefined)\n },\n onDisconnected: key => onPresence?.(key, []),\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"host-signals-CUKPZZxC.js","names":[],"sources":["../src/tui/runtime/transport.ts","../src/tui/host/host-signals.ts"],"sourcesContent":["/**\n * How a window reaches its chat host: the shared daemon over its unix\n * socket (spawned on demand), a host running in the window's own process,\n * or a remote server over a WebSocket.\n * Everything above the transport (`connectHostSession`, the presence\n * watcher) speaks `IpcClient` and cannot tell which one it got.\n */\nimport type { IpcClient } from '../../ipc/client'\nimport type { HostFailureKind } from '../../ipc/hosts/connection-loop'\nimport type { InProcessHost } from '../../ipc/memory'\nimport { JsonRpcConnectionClosedError } from '../../acp/json-rpc'\nimport { connectIpcClient, connectOrSpawnDaemon } from '../../ipc/client'\nimport { defaultSocketPath, ensureDaemonRunning, selfDaemonSpawnCommand } from '../../ipc/daemon/lifecycle'\n\nexport interface HostConnectOptions {\n appVersion?: string\n /** The connection dropped (daemon exit, socket error, host shutdown). Not called for `close()`. */\n onClose?: () => void\n /**\n * A watcher that must never retire a mismatched daemon (the presence\n * client): it connects to whatever is running and degrades instead.\n * Session controllers are active: a stale daemon is drained and respawned.\n * Meaningless in-process, where client and host are one build.\n */\n passive?: boolean\n /** Give up before connecting once aborted (the attempt was superseded). */\n signal?: AbortSignal\n}\n\nexport interface HostTransport {\n connect: (options?: HostConnectOptions) => Promise<IpcClient>\n /**\n * How a failed `connect` is handled (`../../ipc/hosts/connection-loop`):\n * a server's refusal for good, another protocol version, or \"retry\".\n * Absent: always retry (This computer's daemon).\n */\n classify?: (err: unknown) => Promise<HostFailureKind>\n}\n\n/** The shared daemon over its socket; spawns one when none is listening. */\nexport function socketTransport(options: { socketPath?: string, spawnCommand?: string[] } = {}): HostTransport {\n // Resolved once: a window keeps talking to the daemon it started with,\n // even if the environment that named it changes before a reconnect.\n const socketPath = { socketPath: options.socketPath ?? defaultSocketPath() }\n return {\n async connect(connectOptions = {}) {\n const spawnCommand = options.spawnCommand ?? selfDaemonSpawnCommand()\n const common = {\n ...(connectOptions.appVersion ? { appVersion: connectOptions.appVersion } : {}),\n ...(connectOptions.onClose ? { onClose: connectOptions.onClose } : {}),\n }\n if (connectOptions.passive) {\n const path = await ensureDaemonRunning({ ...socketPath, spawnCommand })\n connectOptions.signal?.throwIfAborted()\n return connectIpcClient({ ...common, socketPath: path, drainOnMismatch: false })\n }\n connectOptions.signal?.throwIfAborted()\n return connectOrSpawnDaemon({ ...common, ...socketPath, spawnCommand })\n },\n }\n}\n\n/**\n * A remote host over a WebSocket (`zidane-server`). Nothing to spawn and\n * nothing to drain: `passive` changes nothing, a version mismatch is the\n * server's to resolve. The WebSocket client loads on the first connect, so\n * a window that never goes remote never loads it.\n */\nexport function wsTransport(options: { url: string, token?: string, expectHostId?: string }): HostTransport {\n return {\n async connect(connectOptions = {}) {\n connectOptions.signal?.throwIfAborted()\n const { connectWsClient } = await import('../../ipc/transports/ws-client')\n connectOptions.signal?.throwIfAborted()\n return connectWsClient({\n url: options.url,\n ...(options.token ? { token: options.token } : {}),\n ...(options.expectHostId ? { expectHostId: options.expectHostId } : {}),\n ...(connectOptions.appVersion ? { appVersion: connectOptions.appVersion } : {}),\n ...(connectOptions.onClose ? { onClose: connectOptions.onClose } : {}),\n ...(connectOptions.signal ? { signal: connectOptions.signal } : {}),\n })\n },\n async classify(err) {\n const { classifyWsFailure } = await import('../../ipc/hosts/ws')\n return classifyWsFailure(err)\n },\n }\n}\n\n/** A host in this process (see `startInProcessHost`). */\nexport function inProcessTransport(host: InProcessHost): HostTransport {\n return {\n async connect(options = {}) {\n options.signal?.throwIfAborted()\n return host.connect({\n ...(options.appVersion ? { appVersion: options.appVersion } : {}),\n ...(options.onClose ? { onClose: options.onClose } : {}),\n })\n },\n }\n}\n\nexport interface LazyInProcessTransport extends HostTransport {\n /** The host, once a connect started it. */\n started: () => InProcessHost | null\n /**\n * Shut the host down if it started (runs abort, clients' `onClose` fires)\n * and refuse later connects. Idempotent.\n */\n close: () => Promise<void>\n}\n\n/**\n * A host in this process, started by the first connect (a window that never\n * opens a session never builds one). A failed start is retried by the next.\n */\nexport function lazyInProcessTransport(start: () => Promise<InProcessHost>): LazyInProcessTransport {\n let starting: Promise<InProcessHost> | null = null\n let host: InProcessHost | null = null\n let closed = false\n const ensure = (): Promise<InProcessHost> => {\n starting ??= start().then(\n (started) => {\n host = started\n return started\n },\n (err: unknown) => {\n starting = null\n throw err\n },\n )\n return starting\n }\n return {\n async connect(options = {}) {\n if (closed)\n throw new JsonRpcConnectionClosedError()\n const started = await ensure()\n // Closed while starting: the close below shuts it down.\n if (closed)\n throw new JsonRpcConnectionClosedError()\n return inProcessTransport(started).connect(options)\n },\n started: () => host,\n async close() {\n closed = true\n const pending = starting\n if (!pending)\n return\n const started = await pending.catch(() => null)\n await started?.close()\n },\n }\n}\n","/**\n * What the window takes from a directory host's app-lifetime connection\n * (the shared connection loop's callbacks): its presence rows\n * (`presence.list` on connect, then `presence:changed`; none while it is\n * down) and its session changes (`sessions:changed`, which a host sends\n * every connection, watching a session or not). No WebSocket import.\n */\nimport type { HostSignal, IpcClient, SessionPresence } from '../../ipc/index'\n\nexport interface HostSignalSinks {\n onPresence?: (key: string, rows: readonly SessionPresence[]) => void\n /** Connected (also after a reconnect): the list should refresh. */\n onConnected?: (key: string) => void\n onSessionsChanged?: (key: string) => void\n}\n\nexport function hostSignalHandlers(sinks: HostSignalSinks): {\n onSignal: (key: string, signal: HostSignal) => void\n onConnected: (key: string, client: IpcClient) => void\n onDisconnected: (key: string) => void\n} {\n const { onPresence, onConnected, onSessionsChanged } = sinks\n return {\n onSignal: (key, signal) => {\n if (signal.kind === 'presence:changed')\n onPresence?.(key, signal.sessions)\n else if (signal.kind === 'sessions:changed')\n onSessionsChanged?.(key)\n },\n onConnected: (key, client) => {\n onConnected?.(key)\n if (onPresence)\n void client.request('presence.list', {}).then(rows => onPresence(key, rows), () => undefined)\n },\n onDisconnected: key => onPresence?.(key, []),\n }\n}\n"],"mappings":"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"}
|