dsh-interconnect 0.10.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dsh.plugin.json +1 -1
- package/lib/index.js +9 -3
- package/lib/interconnect/index.js +9 -3
- package/lib/interconnect/index.js.map +2 -2
- package/lib/types/interconnect/index.d.ts.map +1 -1
- package/lib/types/interconnect/types.d.ts +4 -3
- package/lib/types/interconnect/types.d.ts.map +1 -1
- package/package.json +1 -5
package/README.md
CHANGED
|
@@ -128,8 +128,11 @@ interconnect_reply(sessionId=B-sess, text="reply")
|
|
|
128
128
|
|
|
129
129
|
`interconnect_send` 不会往 subagent 拥有的 session 里投递,`interconnect_list` 也不会把它们
|
|
130
130
|
列出来。那类 session 的投递权属于它的父 agent,从这里 splice 进 inbox 会和父 agent 抢。判定
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
逻辑镜像 Host 的 `hasApiSessionSubagentOwner`(`@deepseek-ai/dsh-api-session-controller`):
|
|
132
|
+
Host 在 0.6 之后把这个谓词从 `@deepseek-ai/dsh-api-remotes` 移走,且没有公开导出——桌面端和
|
|
133
|
+
`npx @deepseek-ai/dsh web` 运行时里没有任何可 import 的 Host 绑定,所以这里逐字复制一份
|
|
134
|
+
(`isSessionOwnedBySubagent`,见 `src/interconnect/index.ts`)。这是安全规则,Host 改动该规则
|
|
135
|
+
时必须同步此副本;tests 覆盖 origin=subagent 与 parent-owned 两条封栏分支。
|
|
133
136
|
|
|
134
137
|
已实测:起一个真实 subagent 后,`interconnect_list` 不包含它;直接 `send` 到它的 id 返回
|
|
135
138
|
`session-owned-by-subagent`,消息**没有**进入 inbox。
|
package/dsh.plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-interconnect",
|
|
3
3
|
"description": "Cross-instance message/event handoff for DeepSeek Harness (DSH): WebSocket link, model-facing tools, and companion skill.",
|
|
4
|
-
"version": "0.10.
|
|
4
|
+
"version": "0.10.1",
|
|
5
5
|
"entry": {
|
|
6
6
|
"name": "dsh-interconnect/interconnect",
|
|
7
7
|
"inject": ["webServer", "agents", "credentials"]
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
import { Service } from "@deepseek-ai/cordis";
|
|
3
3
|
import { credentialRef } from "@deepseek-ai/dsh-credentials";
|
|
4
4
|
import { boundContextSummary, createUserMessage } from "@deepseek-ai/dsh-llm";
|
|
5
|
-
import { hasApiRemoteSubagentOwner } from "@deepseek-ai/dsh-api-remotes";
|
|
6
5
|
|
|
7
6
|
// ../.dsh/source/staging-20260807T143236Z/vendor/cosmokit/src/misc.ts
|
|
8
7
|
function isNullable(value) {
|
|
@@ -824,6 +823,13 @@ import WebSocket, { WebSocketServer } from "ws";
|
|
|
824
823
|
var INTERCONNECT_TOKEN_REF = "DSH_INTERCONNECT_TOKEN";
|
|
825
824
|
|
|
826
825
|
// src/interconnect/index.ts
|
|
826
|
+
function isSessionOwnedBySubagent(ctx, session, agent) {
|
|
827
|
+
if (session.header.origin === "subagent") return true;
|
|
828
|
+
const parentId = session.header.parentSession;
|
|
829
|
+
if (parentId === void 0 || agent === void 0) return false;
|
|
830
|
+
const parent = ctx.agents.get(parentId);
|
|
831
|
+
return parent !== void 0 && ctx.agents.isOwnedBy(agent.id, parent);
|
|
832
|
+
}
|
|
827
833
|
var PLUGIN_SOURCE = "dsh-interconnect";
|
|
828
834
|
var LINK_CHANNEL = "/interconnect/link";
|
|
829
835
|
var notificationSchema = Schema.union([
|
|
@@ -1206,7 +1212,7 @@ var InterconnectService = class extends Service {
|
|
|
1206
1212
|
* matches how the Host's own session listing treats its projection column.
|
|
1207
1213
|
*/
|
|
1208
1214
|
listSessions() {
|
|
1209
|
-
const reachable = this.ctx.agents.list().filter((agent) => !
|
|
1215
|
+
const reachable = this.ctx.agents.list().filter((agent) => !isSessionOwnedBySubagent(this.ctx, agent.session, agent));
|
|
1210
1216
|
const sessions = reachable.map((agent) => {
|
|
1211
1217
|
let title;
|
|
1212
1218
|
try {
|
|
@@ -1264,7 +1270,7 @@ var InterconnectService = class extends Service {
|
|
|
1264
1270
|
}
|
|
1265
1271
|
agent = woken.agent;
|
|
1266
1272
|
}
|
|
1267
|
-
if (
|
|
1273
|
+
if (isSessionOwnedBySubagent(this.ctx, agent.session, agent)) {
|
|
1268
1274
|
return { delivered: false, instance: this.instanceId, reason: "session-owned-by-subagent" };
|
|
1269
1275
|
}
|
|
1270
1276
|
const sender = (() => {
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
import { Service } from "@deepseek-ai/cordis";
|
|
3
3
|
import { credentialRef } from "@deepseek-ai/dsh-credentials";
|
|
4
4
|
import { boundContextSummary, createUserMessage } from "@deepseek-ai/dsh-llm";
|
|
5
|
-
import { hasApiRemoteSubagentOwner } from "@deepseek-ai/dsh-api-remotes";
|
|
6
5
|
|
|
7
6
|
// ../.dsh/source/staging-20260807T143236Z/vendor/cosmokit/src/misc.ts
|
|
8
7
|
function isNullable(value) {
|
|
@@ -824,6 +823,13 @@ import WebSocket, { WebSocketServer } from "ws";
|
|
|
824
823
|
var INTERCONNECT_TOKEN_REF = "DSH_INTERCONNECT_TOKEN";
|
|
825
824
|
|
|
826
825
|
// src/interconnect/index.ts
|
|
826
|
+
function isSessionOwnedBySubagent(ctx, session, agent) {
|
|
827
|
+
if (session.header.origin === "subagent") return true;
|
|
828
|
+
const parentId = session.header.parentSession;
|
|
829
|
+
if (parentId === void 0 || agent === void 0) return false;
|
|
830
|
+
const parent = ctx.agents.get(parentId);
|
|
831
|
+
return parent !== void 0 && ctx.agents.isOwnedBy(agent.id, parent);
|
|
832
|
+
}
|
|
827
833
|
var PLUGIN_SOURCE = "dsh-interconnect";
|
|
828
834
|
var LINK_CHANNEL = "/interconnect/link";
|
|
829
835
|
var notificationSchema = Schema.union([
|
|
@@ -1206,7 +1212,7 @@ var InterconnectService = class extends Service {
|
|
|
1206
1212
|
* matches how the Host's own session listing treats its projection column.
|
|
1207
1213
|
*/
|
|
1208
1214
|
listSessions() {
|
|
1209
|
-
const reachable = this.ctx.agents.list().filter((agent) => !
|
|
1215
|
+
const reachable = this.ctx.agents.list().filter((agent) => !isSessionOwnedBySubagent(this.ctx, agent.session, agent));
|
|
1210
1216
|
const sessions = reachable.map((agent) => {
|
|
1211
1217
|
let title;
|
|
1212
1218
|
try {
|
|
@@ -1264,7 +1270,7 @@ var InterconnectService = class extends Service {
|
|
|
1264
1270
|
}
|
|
1265
1271
|
agent = woken.agent;
|
|
1266
1272
|
}
|
|
1267
|
-
if (
|
|
1273
|
+
if (isSessionOwnedBySubagent(this.ctx, agent.session, agent)) {
|
|
1268
1274
|
return { delivered: false, instance: this.instanceId, reason: "session-owned-by-subagent" };
|
|
1269
1275
|
}
|
|
1270
1276
|
const sender = (() => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/interconnect/index.ts", "../../../.dsh/source/staging-20260807T143236Z/vendor/cosmokit/src/misc.ts", "../../../.dsh/source/staging-20260807T143236Z/vendor/cosmokit/src/types.ts", "../../../.dsh/source/staging-20260807T143236Z/vendor/cosmokit/src/time.ts", "../../../.dsh/source/staging-20260807T143236Z/vendor/schemastery/lib/index.mjs", "../../src/interconnect/types.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Cross-instance message handoff service: inbound half owns one HTTP route on\n * the host webserver and delivers authenticated messages into live sessions;\n * outbound half POSTs the same wire shape to a peer instance.\n *\n * Transport is deliberately NOT the Connection RPC channel: that registry's\n * handler sees only `(endpoint, payload, signal)` and the trust fence is the\n * DNS-rebinding `trustedHosts` check, neither of which carries the shared-key\n * `Authorization` header this service authenticates on. Owning a plain HTTP\n * route keeps bearer-token auth at the boundary where the header is readable\n * and fails closed when the token is unconfigured.\n * @module @deepseek-ai/dsh-interconnect\n */\n\nimport { Context, Service } from '@deepseek-ai/cordis'\nimport type { IncomingMessage } from 'node:http'\nimport type { Duplex } from 'node:stream'\nimport type { WebUpgradeRoute } from '@deepseek-ai/dsh-host-webserver'\nimport { credentialRef } from '@deepseek-ai/dsh-credentials'\nimport { boundContextSummary, createUserMessage } from '@deepseek-ai/dsh-llm'\nimport type { Agent } from '@deepseek-ai/dsh-agent'\n// The Host's own subagent-ownership predicate, reused rather than reimplemented:\n// this is a safety rule, and a local copy of it would drift from the Host's.\nimport { hasApiRemoteSubagentOwner } from '@deepseek-ai/dsh-api-remotes'\nimport type { Session } from '@deepseek-ai/dsh-session'\nimport type { SubagentRunEndInfo } from '@deepseek-ai/dsh-subagent'\nimport z from '@deepseek-ai/schemastery'\nimport WebSocket, { WebSocketServer } from 'ws'\nimport type { RawData } from 'ws'\nimport {\n INTERCONNECT_TOKEN_REF,\n type Config,\n type DeliveryMode,\n type EventNotification,\n type EventPayload,\n type LinkFrame,\n type LinkMessage,\n type ListResult,\n type PingResult,\n type QueryMessage,\n type ReplyPayload,\n type ReplyRequest,\n type SendPayload,\n type SendResult,\n type SendRequest,\n type SendFailure,\n type SenderIdentity,\n type SessionSummary,\n type WebSocketLinkHandle,\n} from './types.ts'\n\nexport type * from './types.ts'\nexport { INTERCONNECT_TOKEN_REF } from './types.ts'\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n interconnect: InterconnectService\n }\n interface Events {\n /**\n * A remote peer instance pushed one authenticated lifecycle notification\n * into this instance. Payload is the exact {@link EventNotification} that\n * crossed the wire; listeners may react but must not block the HTTP ack.\n */\n 'interconnect/event'(notification: EventNotification, peer: string): void\n }\n}\n\nconst PLUGIN_SOURCE = 'dsh-interconnect'\n\n/** WebSocket upgrade pathname owning the persistent peer link. */\nconst LINK_CHANNEL = '/interconnect/link'\n\n/** Wire union for the discriminated EventNotification fact (shared by HTTP and WS). */\nconst notificationSchema = z.union([\n z.object({ kind: z.const('agent/created'), sessionId: z.string() }),\n z.object({ kind: z.const('agent/disposed'), sessionId: z.string() }),\n z.object({ kind: z.const('agent/status'), sessionId: z.string(), status: z.union([z.const('idle'), z.const('running')]) }),\n z.object({ kind: z.const('session/created'), sessionId: z.string(), parentSessionId: z.string() }),\n z.object({ kind: z.const('session/disposed'), sessionId: z.string() }),\n z.object({ kind: z.const('subagent/end'), provider: z.string(), childSessionId: z.string(), stopReason: z.string() }),\n])\n\n/** Wire shape of an address-free {@link SenderIdentity}. */\nconst senderSchema = z.object({ instanceId: z.string(), sessionId: z.string() })\n\n/** Wire union for the send/reply message carried by a `msg` link frame. */\nconst messageSchema = z.union([\n z.object({\n kind: z.const('send'),\n sessionId: z.string(),\n text: z.string(),\n sender: senderSchema,\n delivery: z.union([z.const('followup'), z.const('steer'), z.const('inject')]),\n resume: z.boolean(),\n }),\n z.object({\n kind: z.const('reply'),\n sessionId: z.string(),\n text: z.string(),\n sender: senderSchema,\n delivery: z.union([z.const('followup'), z.const('steer'), z.const('inject')]),\n resume: z.boolean(),\n }),\n])\n\n/** Wire union for the discovery query carried by a `query` link frame. */\nconst querySchema = z.union([\n z.object({ kind: z.const('ping') }),\n z.object({ kind: z.const('list') }),\n z.object({ kind: z.const('event'), notification: notificationSchema }),\n])\n\n/** Wire union for one WebSocket link text frame. */\nconst linkFrameSchema = z.union([\n z.object({ type: z.const('hello'), sender: z.string() }),\n z.object({ type: z.const('event'), notification: notificationSchema }),\n z.object({ type: z.const('msg'), reqId: z.string(), message: messageSchema }),\n z.object({ type: z.const('msg-result'), reqId: z.string(), result: z.object({\n delivered: z.boolean(),\n instance: z.string(),\n delivery: z.union([z.const('followup'), z.const('steer'), z.const('inject')]),\n reason: z.string(),\n }) }),\n z.object({ type: z.const('query'), reqId: z.string(), query: querySchema }),\n z.object({ type: z.const('query-result'), reqId: z.string(), result: z.any() }),\n])\n\n/**\n * Live cross-instance handoff service, registered as `ctx.interconnect`.\n * Requires the host webserver, the live agent registry, and the credential\n * store; activation is availability-driven like every other host service.\n */\nexport class InterconnectService extends Service {\n static inject = ['webServer', 'agents', 'credentials']\n static Config: z<Config> = z.object({\n instanceId: z.string().default('dsh'),\n requestTimeoutMs: z.natural().max(60000).default(10000),\n peers: z.object({}).default({}),\n delivery: z.union([z.const('followup'), z.const('steer'), z.const('inject')]).default('followup'),\n allowResume: z.boolean().default(true),\n })\n\n private readonly instanceId: string\n private readonly requestTimeoutMs: number\n private readonly delivery: DeliveryMode\n private readonly allowResume: boolean\n private readonly subscriptions: (() => void)[] = []\n private readonly server = new WebSocketServer({ noServer: true })\n private readonly sockets = new Set<WebSocket>()\n /** Outbound peer links keyed by the peer's `instanceId`. */\n private readonly linkStates = new Map<string, LinkState>()\n private heartbeatTimer: NodeJS.Timeout | undefined\n /** Peer identity each live socket announced via its `hello` frame, if any. */\n private readonly peerOf = new WeakMap<WebSocket, string>()\n /** Sender each local session last received a send from, keyed by local session id. */\n private readonly senders = new Map<string, SenderIdentity>()\n /** In-flight frames sent over a peer link, keyed by `reqId`, awaiting a correlated result. */\n private readonly pendingMessages = new Map<string, PendingMessage>()\n private reqIdCounter = 0\n\n constructor(ctx: Context, config: Config) {\n super(ctx, 'interconnect')\n this.instanceId = config.instanceId\n this.requestTimeoutMs = config.requestTimeoutMs\n this.delivery = config.delivery ?? 'followup'\n this.allowResume = config.allowResume ?? true\n // Link every configured peer at activation: all delivery is over these\n // persistent links, and addressing is by instanceId through them.\n for (const [peerInstanceId, origin] of Object.entries(config.peers ?? {})) {\n this.link(peerInstanceId, origin)\n }\n\n const upgrade: WebUpgradeRoute = {\n path: LINK_CHANNEL,\n handler: (req, socket, head) => { void this.handleUpgrade(req, socket, head) },\n }\n ctx.effect(() => ctx.webServer.registerUpgrade(upgrade), 'interconnect: /interconnect/link websocket')\n\n // Liveness sweep: terminate sockets that stopped answering protocol pings.\n // Deleting the CURRENT element of a `Set` while iterating is safe: Set\n // iterators traverse live in insertion order, and a delete of an already\n // visited element is a no-op for the traversal. `socket.terminate()` from\n // `ws` fires its `close` handler asynchronously, so the `close` handler's\n // own `this.sockets.delete(socket)` cannot run mid-iteration either\n // (measured against the real `ws`). Neither delete removes a not-yet-visited\n // element, so nothing is skipped.\n // This timer is created before its cleanup effect below, so it could leak if\n // any statement between here and that effect threw. The only statements in\n // that window are `ctx.on(...)` registrations, and Cordis's `ctx.on` does not\n // throw for any of the event names used here (verified against a real\n // Context), so the window is not reachable. The teardown effect clears the\n // timer when the fiber unwinds.\n this.heartbeatTimer = setInterval(() => {\n for (const socket of this.sockets) {\n if ((socket as WebSocket & { isAlive?: boolean }).isAlive === false) {\n socket.terminate()\n this.sockets.delete(socket)\n continue\n }\n ;(socket as WebSocket & { isAlive?: boolean }).isAlive = false\n socket.ping()\n }\n }, 30000)\n\n this.subscriptions.push(ctx.on('agent/status', ({ agent, status }) => {\n this.fanout({ kind: 'agent/status', sessionId: String(agent.session.id), status })\n }))\n this.subscriptions.push(ctx.on('agent/created', ({ agent }) => {\n this.fanout({ kind: 'agent/created', sessionId: String(agent.session.id) })\n }))\n this.subscriptions.push(ctx.on('agent/disposed', ({ agent }) => {\n this.fanout({ kind: 'agent/disposed', sessionId: String(agent.session.id) })\n }))\n this.subscriptions.push(ctx.on('session/created', (session: Session) => {\n const parentSessionId = session.header.parentSession === undefined\n ? undefined\n : String(session.header.parentSession)\n this.fanout({\n kind: 'session/created',\n sessionId: String(session.id),\n ...(parentSessionId === undefined ? {} : { parentSessionId }),\n })\n }))\n this.subscriptions.push(ctx.on('session/disposed', (session: Session) => {\n this.fanout({ kind: 'session/disposed', sessionId: String(session.id) })\n }))\n this.subscriptions.push(ctx.on('subagent/end', (info: SubagentRunEndInfo) => {\n // Only in-process children are this instance's own work; remote provider\n // runs settle through a different, non-local path.\n if (!info.local) return\n this.fanout({\n kind: 'subagent/end',\n provider: info.provider,\n childSessionId: String(info.id),\n stopReason: info.stopReason,\n })\n }))\n\n // Clean up the event listeners with the service fiber.\n ctx.effect(() => () => {\n for (const dispose of this.subscriptions.splice(0)) dispose()\n }, 'interconnect: event subscriptions')\n\n // Terminate every live socket, outbound dial loop, and the no-server\n // acceptor when the service fiber unwinds.\n ctx.effect(() => () => {\n if (this.heartbeatTimer !== undefined) clearInterval(this.heartbeatTimer)\n for (const state of this.linkStates.values()) state.close()\n this.linkStates.clear()\n for (const socket of this.sockets) socket.terminate()\n this.sockets.clear()\n this.server.close()\n }, 'interconnect: websocket teardown')\n }\n\n /**\n * This instance's identity to attach to outbound messages. Always present:\n * it needs no address, only this instance's id and the calling session.\n * @param sessionId - the local session that is sending, used as the reply target.\n */\n selfSender(sessionId: string): SenderIdentity {\n return { instanceId: this.instanceId, sessionId }\n }\n\n async send(request: SendRequest): Promise<SendResult> {\n const payload: SendPayload = {\n sessionId: request.sessionId,\n text: request.text,\n ...(request.sender === undefined ? {} : { sender: request.sender }),\n ...(request.delivery === undefined ? {} : { delivery: request.delivery }),\n ...(request.resume === undefined ? {} : { resume: request.resume }),\n }\n const result = await this.msgRequest(request.instanceId, 'send', payload)\n return result ?? { delivered: false, instance: this.instanceId, reason: 'unreachable' }\n }\n\n /**\n * Deliver one text message back to the peer that a local session last\n * received a send from. `sessionId` names the LOCAL replying session; the\n * outbound target is the `sender` that session recorded, addressed through\n * this instance's own link to the sender's instance.\n */\n async reply(request: ReplyRequest): Promise<SendResult> {\n const sender = this.senders.get(request.sessionId)\n if (sender === undefined) {\n return { delivered: false, instance: this.instanceId, reason: 'no-sender-known' }\n }\n const payload: SendPayload = {\n sessionId: sender.sessionId,\n text: request.text,\n ...(request.delivery === undefined ? {} : { delivery: request.delivery }),\n ...(request.resume === undefined ? {} : { resume: request.resume }),\n // Attribute the reply to this instance so the peer, in turn, can reply\n // back \u2014 chaining the conversation.\n sender: this.selfSender(request.sessionId),\n }\n const result = await this.msgRequest(sender.instanceId, 'send', payload)\n return result ?? { delivered: false, instance: this.instanceId, reason: 'unreachable' }\n }\n\n /**\n * Probe a peer instance for liveness and identity over its persistent link.\n * Returns the peer identity when reachable, or undefined when the link is\n * not up or no answer arrives.\n */\n async ping(instanceId: string): Promise<PingResult | undefined> {\n return this.queryRequest(instanceId, { kind: 'ping' }) as Promise<PingResult | undefined>\n }\n\n /**\n * List a peer instance's live sessions over its persistent link. Undefined on\n * transport failure, matching `ping`.\n */\n async list(instanceId: string): Promise<ListResult | undefined> {\n return this.queryRequest(instanceId, { kind: 'list' }) as Promise<ListResult | undefined>\n }\n\n /** The origin this instance dials to reach a configured peer, or undefined. */\n private originOf(instanceId: string): string | undefined {\n const state = this.linkStates.get(instanceId)\n return state?.peer\n }\n\n /**\n * Send a `msg` frame over the live link to a peer and resolve with its\n * correlated `msg-result`. Undefined when the peer has no live link here\n * (not configured, or the link is down) \u2014 sends can only address configured+\n * connected peers by design.\n */\n private async msgRequest(\n instanceId: string,\n kind: LinkMessage['kind'],\n payload: SendPayload,\n ): Promise<SendResult | undefined> {\n const state = this.linkStates.get(instanceId)\n if (state === undefined || !state.writable()) return undefined\n const reqId = `m${++this.reqIdCounter}-${crypto.randomUUID()}`\n const message: LinkMessage = {\n kind,\n sessionId: payload.sessionId,\n text: payload.text,\n ...(payload.sender === undefined ? {} : { sender: payload.sender }),\n ...(payload.delivery === undefined ? {} : { delivery: payload.delivery }),\n ...(payload.resume === undefined ? {} : { resume: payload.resume }),\n }\n return this.waitForResult(reqId, (failure) => {\n const wrote = state.sendFrame({ type: 'msg', reqId, message })\n if (!wrote) failure(new Error(`interconnect: peer link to ${instanceId} closed while sending`))\n }) as Promise<SendResult | undefined>\n }\n\n /** Send a `query` frame over the live link to a peer and resolve its result. */\n private async queryRequest(instanceId: string, query: QueryMessage): Promise<unknown> {\n const state = this.linkStates.get(instanceId)\n if (state === undefined || !state.writable()) return undefined\n const reqId = `q${++this.reqIdCounter}-${crypto.randomUUID()}`\n return this.waitForResult(reqId, (failure) => {\n const wrote = state.sendFrame({ type: 'query', reqId, query })\n if (!wrote) failure(new Error(`interconnect: peer link to ${instanceId} closed while querying`))\n })\n }\n\n /** Settle a `reqId` frame against its `*-result`, timing out at `requestTimeoutMs`. */\n private waitForResult(reqId: string, send: (failure: (error: unknown) => void) => void): Promise<unknown> {\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingMessages.delete(reqId)\n reject(new Error(`interconnect: no result for ${reqId} within ${this.requestTimeoutMs}ms`))\n }, this.requestTimeoutMs)\n this.pendingMessages.set(reqId, { timer })\n const pending = this.pendingMessages.get(reqId)\n if (pending === undefined) return\n ;(pending as MutablePendingMessage).resolve = (result: unknown) => {\n clearTimeout(timer)\n this.pendingMessages.delete(reqId)\n resolve(result)\n }\n ;(pending as MutablePendingMessage).reject = (error: unknown) => {\n clearTimeout(timer)\n this.pendingMessages.delete(reqId)\n reject(error instanceof Error ? error : new Error(String(error)))\n }\n send((error: unknown) => {\n clearTimeout(timer)\n this.pendingMessages.delete(reqId)\n reject(error instanceof Error ? error : new Error(String(error)))\n })\n })\n }\n\n /**\n * Add a peer route at runtime. Returns a disposer that removes it. Re-adding\n * an existing instanceId re-routes it to the new origin.\n * @param instanceId - the peer's `instanceId`.\n * @param origin - origin this instance dials to reach that peer.\n * @returns disposer removing the peer route.\n */\n subscribe(instanceId: string, origin: string): () => void {\n this.link(instanceId, origin)\n return () => {\n this.forgetLink(instanceId)\n }\n }\n\n /** Remove a peer route, closing its outbound link. */\n unsubscribe(instanceId: string): void {\n const state = this.linkStates.get(instanceId)\n if (state !== undefined) state.close()\n this.linkStates.delete(instanceId)\n }\n\n /**\n * Open (and, on drop, re-open) a persistent WebSocket link to a peer. Local\n * events stream over the link in real time, and events the peer pushes are\n * surfaced as `interconnect/event`. Repeating for the same instanceId\n * re-routes the link to the new origin.\n * @param instanceId - the peer's `instanceId`.\n * @param origin - receiver origin this instance dials, e.g. `http://127.0.0.1:13080`.\n * @returns a handle closing the link and cancelling reconnection.\n */\n link(instanceId: string, origin: string): WebSocketLinkHandle {\n const existing = this.linkStates.get(instanceId)\n if (existing !== undefined) {\n existing.reroute(trimBase(origin))\n return existing\n }\n const state = new LinkState(this, instanceId, trimBase(origin))\n this.linkStates.set(instanceId, state)\n state.dial()\n return state\n }\n\n /** Remove a closed outbound link's state so a later `link` re-dials fresh. */\n forgetLink(instanceId: string): void {\n this.linkStates.delete(instanceId)\n }\n\n /** Push one serialized lifecycle fact out to every linked peer over WS. */\n private fanout(notification: EventNotification): void {\n this.broadcast(notification)\n }\n\n /** Push one fact over every live WebSocket link, dropping closed sockets. */\n private broadcast(notification: EventNotification): void {\n if (this.sockets.size === 0) return\n const frame: LinkFrame = { type: 'event', notification }\n const encoded = JSON.stringify(frame)\n for (const socket of this.sockets) {\n if (socket.readyState !== WebSocket.OPEN) {\n this.sockets.delete(socket)\n continue\n }\n socket.send(encoded)\n }\n }\n\n /**\n * Dispatch one inbound `msg` frame: deliver a `send`/`reply` and answer the\n * correlated `msg-result` on the same socket. Errors are surfaced as the\n * result so a throwing handler cannot escape the socket's message callback.\n */\n private async handleMsgFrame(socket: WebSocket, reqId: string, message: LinkMessage): Promise<void> {\n let result: SendResult\n if (message.kind === 'reply') {\n result = await this.replyForSession({\n sessionId: message.sessionId,\n text: message.text,\n ...(message.delivery === undefined ? {} : { delivery: message.delivery }),\n ...(message.resume === undefined ? {} : { resume: message.resume }),\n })\n } else {\n result = await this.deliver({\n sessionId: message.sessionId,\n text: message.text,\n ...(message.sender === undefined ? {} : { sender: message.sender }),\n ...(message.delivery === undefined ? {} : { delivery: message.delivery }),\n ...(message.resume === undefined ? {} : { resume: message.resume }),\n })\n }\n this.sendFrame(socket, { type: 'msg-result', reqId, result })\n }\n\n /** Dispatch one inbound `query` frame (ping/list/event) and answer on the socket. */\n private async handleQueryFrame(socket: WebSocket, reqId: string, query: QueryMessage): Promise<void> {\n let result: unknown\n if (query.kind === 'ping') {\n result = { pong: true, instance: this.instanceId }\n } else if (query.kind === 'list') {\n result = this.listSessions()\n } else {\n const payload: EventPayload = {\n sender: this.peerOf.get(socket) ?? 'unknown-peer',\n notification: query.notification,\n }\n this.receiveEvent(payload)\n result = { accepted: true }\n }\n this.sendFrame(socket, { type: 'query-result', reqId, result })\n }\n\n /** Surface one remote notification to local listeners and the log. */\n private receiveEvent(eventPayload: EventPayload): void {\n this.ctx.logger.info(`interconnect: remote event ${eventPayload.notification.kind} from ${eventPayload.sender}`)\n this.ctx.emit('interconnect/event', eventPayload.notification, eventPayload.sender)\n }\n\n /**\n * Summarize every live local session so a sender can discover valid targets\n * instead of having to know a session id already. Only live agents are listed\n * because `send` can reach exactly those.\n *\n * Title and status are best-effort: the title projection is an optional\n * service, and a receiver without it still returns the ids. A projection that\n * throws degrades that one row rather than failing the whole listing, which\n * matches how the Host's own session listing treats its projection column.\n */\n private listSessions(): ListResult {\n // `agents.list()` includes subagent children; a row this instance would\n // refuse to deliver to must not be advertised as a target, or the listing\n // contradicts `send`.\n const reachable = this.ctx.agents.list()\n .filter(agent => !hasApiRemoteSubagentOwner(this.ctx, agent.session, agent))\n const sessions = reachable.map((agent): SessionSummary => {\n let title: string | undefined\n try {\n const snapshot = this.ctx.get('sessionProjections')?.snapshot(agent.session)\n const value = snapshot?.values.title\n if (typeof value === 'string' && value !== '') title = value\n } catch {\n // A failing projection must not hide a reachable session.\n title = undefined\n }\n return {\n sessionId: agent.id,\n ...(title === undefined ? {} : { title }),\n ...(typeof agent.status === 'string' ? { status: agent.status } : {}),\n }\n })\n return { sessions, instance: this.instanceId }\n }\n\n /**\n * Resolve a session that is not currently live, when the sender asked to wake\n * it. Returns the agent, or the reason it stays undelivered.\n *\n * The resume is delegated to the Host's configured `agent` lookup rather than\n * calling `ctx.agents.resume()` here, and that is the whole point: a handle\n * from `resume()` is owned by the CALLING context, so resuming on this\n * plugin's fiber would tear the session down again the moment the plugin\n * unloads (measured: the same call through the root context leaves it alive).\n * The Host's resolver owns it instead, and it also composes the preset the\n * session recorded \u2014 so a woken agent comes back with the toolset its history\n * was produced under, not an empty one.\n */\n private async wake(payload: SendPayload): Promise<{ agent: Agent } | { reason: SendFailure }> {\n if (payload.resume !== true) return { reason: 'session-not-live' }\n if (!this.allowResume) return { reason: 'resume-refused' }\n // Optional by design: a deployment without the Host's lookup (headless, or\n // a profile with no api-proxy) degrades to the plain not-live answer rather\n // than failing the call.\n const lookup = this.ctx.get('typert')?.lookups.get('agent')\n if (lookup === undefined) return { reason: 'session-not-live' }\n try {\n const resolved = await lookup.resolve(payload.sessionId as never)\n // `undefined` is not a failed wake: the base `agent` provider is a plain\n // registry read, so a deployment without the Host's resuming resolver\n // answers undefined for every id that is not already live. Reporting\n // `resume-failed` there would send the caller chasing a wake that was\n // never possible, when the honest answer is that nothing is live here.\n if (resolved === undefined || resolved === null) return { reason: 'session-not-live' }\n return { agent: resolved as Agent }\n } catch (error) {\n // A refusing resolver is an expected outcome, not a fault of this\n // instance: the id may not exist, or a subagent owner may hold it.\n this.ctx.logger.info(`interconnect: resume refused for ${payload.sessionId}: ${error instanceof Error ? error.message : String(error)}`)\n return { reason: 'resume-failed' }\n }\n }\n\n /**\n * Deliver one message to a live local session, waking a persisted one only\n * when the sender asked and this receiver allows it.\n */\n private async deliver(payload: SendPayload): Promise<SendResult> {\n let agent = this.ctx.agents.get(payload.sessionId as Agent['id'])\n if (agent === undefined) {\n const woken = await this.wake(payload)\n if ('reason' in woken) {\n return { delivered: false, instance: this.instanceId, reason: woken.reason }\n }\n agent = woken.agent\n }\n // Fence the live-hit path too, exactly as the Host does before handing out a\n // live agent: a session reserved to subagent routing is delivered to by its\n // parent, and splicing into its inbox from here would race that parent. The\n // wake path needs no separate check because the Host's resolver applies the\n // same fence internally.\n if (hasApiRemoteSubagentOwner(this.ctx, agent.session, agent)) {\n return { delivered: false, instance: this.instanceId, reason: 'session-owned-by-subagent' }\n }\n // Remember who sent this message so the receiving session can reply later.\n // `source` never reaches the model, so recording the sender here only sets\n // up reply attribution; the model-facing `content` stays exactly the text\n // that crossed the wire. An absent sender resolves to `{}` under schematery,\n // so test for a real identity rather than `undefined`.\n const sender = ((): SenderIdentity | undefined => {\n const candidate = payload.sender\n return candidate === undefined || typeof candidate.instanceId !== 'string'\n ? undefined\n : candidate\n })()\n if (sender !== undefined) {\n this.senders.set(payload.sessionId, sender)\n }\n // Attribute the message to this plugin, not to the human operator: the\n // receiving agent must be able to tell a cross-instance handoff from text\n // its own user typed. The summary names the sender when one was carried, so\n // a GUI/archive can show where the handoff came from without touching the\n // model-facing content.\n const message = createUserMessage({\n source: {\n kind: 'plugin',\n plugin: PLUGIN_SOURCE,\n form: 'notice',\n summary: boundContextSummary(\n sender === undefined\n ? `interconnect handoff delivered on instance ${this.instanceId}`\n : `interconnect handoff from ${sender.instanceId} (session ${sender.sessionId}) delivered on instance ${this.instanceId}`,\n ),\n },\n content: [{ type: 'text', text: payload.text }],\n })\n // The sender may override the mode per message, because urgency belongs to\n // one message rather than to the link; an absent override leaves the\n // receiver's configured default in force. The switch is exhaustive over\n // DeliveryMode so adding a mode fails the type check here instead of\n // silently falling through to `followup`.\n const mode: DeliveryMode = payload.delivery ?? this.delivery\n switch (mode) {\n case 'steer':\n agent.steer(message)\n break\n case 'inject':\n agent.inject(message)\n break\n case 'followup':\n agent.followup(message)\n break\n }\n return { delivered: true, instance: this.instanceId, delivery: mode }\n }\n\n /**\n * Inbound `reply` dispatch: forward a request to {link reply}, resolving the\n * outbound sender for the named local session. Kept separate from {link\n * deliver} so the two wire endpoints stay distinct in the request pipeline.\n */\n private async replyForSession(payload: ReplyPayload): Promise<SendResult> {\n return this.reply({\n sessionId: payload.sessionId,\n text: payload.text,\n ...(payload.delivery === undefined ? {} : { delivery: payload.delivery }),\n ...(payload.resume === undefined ? {} : { resume: payload.resume }),\n })\n }\n\n private async resolveToken(): Promise<string | undefined> {\n const credential = await this.ctx.credentials.resolve(credentialRef(INTERCONNECT_TOKEN_REF))\n return credential === undefined || credential.value.length === 0 ? undefined : credential.value\n }\n\n /** Resolve the shared token for an outbound dial (same source as inbound). */\n resolveTokenForDial(): Promise<string | undefined> {\n return this.resolveToken()\n }\n\n /** Inbound WebSocket upgrade: authenticate the bearer header, then accept. */\n private async handleUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer): Promise<void> {\n let token: string | undefined\n try {\n token = await this.resolveToken()\n } catch (error) {\n // Fail closed and end the socket: the caller invokes this as\n // `void handleUpgrade(...)`, so letting the rejection escape would both\n // leave this client hanging on an open socket and surface as an unhandled\n // rejection.\n this.ctx.logger.warn(`interconnect: upgrade token read failed: ${error instanceof Error ? error.message : String(error)}`)\n socket.end('HTTP/1.1 403 Forbidden\\r\\nConnection: close\\r\\nContent-Length: 9\\r\\n\\r\\nforbidden')\n return\n }\n if (token === undefined) {\n socket.end('HTTP/1.1 403 Forbidden\\r\\nConnection: close\\r\\nContent-Length: 9\\r\\n\\r\\nforbidden')\n return\n }\n const expected = `Bearer ${token}`\n const header = req.headers.authorization\n if (header === undefined || !timingSafeEqual(header, expected)) {\n socket.end('HTTP/1.1 401 Unauthorized\\r\\nConnection: close\\r\\nContent-Length: 12\\r\\n\\r\\nunauthorized')\n return\n }\n this.server.handleUpgrade(req, socket, head, (websocket) => {\n this.attachSocket(websocket)\n })\n }\n\n /**\n * Install frame + liveness handling on one socket and add it to the live\n * pool. Used by both the server half (accepted upgrade) and the client half\n * (outbound dial), so a single socket carries events both directions.\n */\n attachSocket(websocket: WebSocket): void {\n this.sockets.add(websocket)\n ;(websocket as WebSocket & { isAlive: boolean }).isAlive = true\n websocket.on('pong', () => {\n ;(websocket as WebSocket & { isAlive: boolean }).isAlive = true\n })\n websocket.on('message', (data: RawData) => {\n this.handleFrame(websocket, data)\n })\n websocket.on('close', () => {\n this.sockets.delete(websocket)\n this.peerOf.delete(websocket)\n })\n websocket.on('error', () => {\n this.sockets.delete(websocket)\n })\n // Announce this instance's identity so the dialer can attribute pushes.\n websocket.send(JSON.stringify({ type: 'hello', sender: this.instanceId } satisfies LinkFrame))\n }\n\n /** Parse and route one inbound link frame, attributing events to the socket's announced peer. */\n private handleFrame(socket: WebSocket, data: RawData): void {\n if (Array.isArray(data)) return // binary frames are a protocol violation; ignore\n const text = Buffer.isBuffer(data) ? data.toString('utf8') : Buffer.from(data).toString('utf8')\n let frame: LinkFrame\n try {\n frame = z.resolve(JSON.parse(text), linkFrameSchema, {})[0] as LinkFrame\n } catch {\n this.ctx.logger.warn('interconnect: dropping malformed link frame')\n return\n }\n if (frame.type === 'hello') {\n this.peerOf.set(socket, frame.sender)\n return\n }\n if (frame.type === 'event') {\n const sender = this.peerOf.get(socket) ?? 'unknown-peer'\n try {\n this.receiveEvent({ sender, notification: frame.notification })\n } catch (error) {\n // `receiveEvent` emits `interconnect/event`, and Cordis propagates a\n // listener throw back to the emitter. This runs inside the socket's\n // synchronous `message` handler, so an escaping throw becomes an\n // uncaughtException \u2014 letting any remote peer kill this process by sending\n // an event a local listener happens to mishandle.\n this.ctx.logger.warn(`interconnect: listener for a ${frame.notification.kind} event from ${sender} threw: ${error instanceof Error ? error.message : String(error)}`)\n }\n return\n }\n if (frame.type === 'msg-result') {\n const pending = this.pendingMessages.get(frame.reqId)\n if (pending !== undefined) {\n ;(pending as MutablePendingMessage).resolve?.(frame.result)\n }\n return\n }\n if (frame.type === 'query-result') {\n const pending = this.pendingMessages.get(frame.reqId)\n if (pending !== undefined) {\n ;(pending as MutablePendingMessage).resolve?.(frame.result)\n }\n return\n }\n if (frame.type === 'msg') {\n void Promise.resolve().then(async () => {\n await this.handleMsgFrame(socket, frame.reqId, frame.message)\n }).catch((error: unknown) => {\n this.ctx.logger.warn(`interconnect: msg ${frame.reqId} handler threw: ${error instanceof Error ? error.message : String(error)}`)\n void this.sendFrame(socket, {\n type: 'msg-result',\n reqId: frame.reqId,\n result: { delivered: false, instance: this.instanceId, reason: 'unreachable' },\n })\n })\n return\n }\n // `query`: an inbound discovery/event request. Answer asynchronously and\n // never let a throw escape the socket's synchronous message callback.\n void Promise.resolve().then(async () => {\n await this.handleQueryFrame(socket, frame.reqId, frame.query)\n }).catch((error: unknown) => {\n this.ctx.logger.warn(`interconnect: query ${frame.reqId} handler threw: ${error instanceof Error ? error.message : String(error)}`)\n })\n }\n\n /** Write one frame to a socket, returning false when the socket cannot take it. */\n private sendFrame(socket: WebSocket, frame: LinkFrame): boolean {\n if (socket.readyState !== WebSocket.OPEN) return false\n socket.send(JSON.stringify(frame))\n return true\n }\n}\n\n/**\n * One in-flight `msg` delivered over a peer link, awaiting its `msg-result`.\n * `resolve`/`reject` are installed by `emitViaLink` after the promise is\n * created; `handleFrame` settles the matching entry on a `msg-result`.\n */\ninterface PendingMessage {\n readonly timer: ReturnType<typeof setTimeout>\n}\ninterface MutablePendingMessage extends PendingMessage {\n resolve?: (result: unknown) => void\n reject?: (error: unknown) => void\n}\n\n/**\n * One outbound WebSocket peer link: dials, re-dials with backoff after an\n * unexpected drop, and pushes local events over the live socket. The owning\n * service streams events via {@link InterconnectService.broadcast} only to\n * sockets it accepted; this dialer keeps its own socket OUT of that set and\n * instead subscribes to local events through the service's fan-out via a\n * dedicated route below.\n */\nclass LinkState implements WebSocketLinkHandle {\n private socket: WebSocket | undefined\n private closed = false\n private retry = 0\n private reconnectTimer: ReturnType<typeof setTimeout> | undefined\n\n // `peer` is mutable so `reroute` can point the link at a new origin.\n peer: string\n readonly instanceId: string\n\n constructor(\n private readonly owner: InterconnectService,\n instanceId: string,\n origin: string,\n ) {\n this.instanceId = instanceId\n this.peer = origin\n }\n\n /** Point this link at a different origin; re-dials immediately. */\n reroute(origin: string): void {\n if (origin === this.peer) return\n this.peer = origin\n const socket = this.socket\n if (socket !== undefined) {\n socket.removeAllListeners()\n socket.terminate()\n this.socket = undefined\n }\n this.dial()\n }\n\n /** Open the socket; reconnect is scheduled by the close handler. */\n dial(): void {\n if (this.closed) return\n const url = new URL('/interconnect/link', this.peer)\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n void this.owner.resolveTokenForDial().then((token) => {\n if (token === undefined || this.closed) return\n const socket = new WebSocket(url, {\n headers: { authorization: `Bearer ${token}` },\n })\n this.socket = socket\n socket.once('open', () => {\n this.retry = 0\n // Same handler as the server half: adds to the live pool and announces\n // this instance's identity over the now-open link.\n this.owner.attachSocket(socket)\n })\n socket.once('close', () => {\n if (this.closed) return\n this.scheduleReconnect()\n })\n socket.on('error', () => {\n // close follows; reconnect is scheduled there.\n })\n }).catch(() => {\n // A rejecting token read must not become an unhandled rejection, and must\n // not silently end the dial loop either: without this the link would stay\n // down until the process restarted, since no socket was ever created and\n // so no `close` will arrive to schedule the retry.\n if (this.closed) return\n this.scheduleReconnect()\n })\n }\n\n /** Whether this link currently holds an open socket that can carry frames. */\n writable(): boolean {\n return this.socket !== undefined && this.socket.readyState === WebSocket.OPEN\n }\n\n /** Write one frame over this link's outbound socket; false when not open. */\n sendFrame(frame: LinkFrame): boolean {\n const socket = this.socket\n if (socket === undefined || socket.readyState !== WebSocket.OPEN) return false\n socket.send(JSON.stringify(frame))\n return true\n }\n\n close(): void {\n this.closed = true\n this.owner.forgetLink(this.peer)\n if (this.reconnectTimer !== undefined) clearTimeout(this.reconnectTimer)\n const socket = this.socket\n if (socket !== undefined) {\n socket.removeAllListeners()\n socket.terminate()\n }\n }\n\n private scheduleReconnect(): void {\n const delay = Math.min(30000, 1000 * 2 ** this.retry)\n this.retry += 1\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = undefined\n this.dial()\n }, delay)\n }\n}\n\n/** Constant-time string comparison over the ASCII-encoded lengths. */\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false\n let diff = 0\n for (let i = 0; i < a.length; i += 1) {\n diff |= a.charCodeAt(i) ^ b.charCodeAt(i)\n }\n return diff === 0\n}\n\nfunction trimBase(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, '')\n}\n\nexport default InterconnectService\n", "/** String/symbol keyed dictionary type. */\nexport type Dict<T = any, K extends string | symbol = string> = { [key in K]: T }\n/** Safely read `T[K]`, returning `never` when `K` is not a key of `T`. */\nexport type Get<T extends {}, K> = K extends keyof T ? T[K] : never\n/** Conditional extraction helper with a configurable return type. */\nexport type Extract<S, T, U = S> = S extends T ? U : never\n/** Accept a value or an array, unless the value is already an array type. */\nexport type MaybeArray<T> = [T] extends [unknown[]] ? T : T | T[]\n/** Wrap a value in `Promise`, preserving the resolved type of existing promises. */\nexport type Promisify<T> = Promise<T extends Promise<infer S> ? S : T>\n/** Accept a value or promise unless the value type is already promise-like. */\nexport type Awaitable<T> = [T] extends [Promise<unknown>] ? T : T | Promise<T>\n/** Convert a union type to an intersection type. */\nexport type Intersect<U> = (U extends any ? (arg: U) => void : never) extends ((arg: infer I) => void) ? I : never\n\n/** No-op callback returning `undefined` at runtime and `any` at type level. */\nexport function noop(): any {}\n\n/** Return true when a value is `null` or `undefined`. */\nexport function isNullable(value: any): value is null | undefined | void {\n return value === null || value === undefined\n}\n\n/** Return true when a value is neither `null` nor `undefined`. */\nexport function isNonNullable<T>(value: T): value is NonNullable<T> {\n return !isNullable(value)\n}\n\n/** Return true for non-array object values. */\nexport function isPlainObject(data: any) {\n return data && typeof data === 'object' && !Array.isArray(data)\n}\n\n/** Filter object entries with a key type guard. */\nexport function filterKeys<T, K extends string, U extends K>(object: Dict<T, K>, filter: (key: K, value: T) => key is U): Dict<T, U>\n/** Filter object entries with a boolean predicate. */\nexport function filterKeys<T, K extends string>(object: Dict<T, K>, filter: (key: K, value: T) => boolean): Dict<T, K>\n/** Filter object entries and return a new object. */\nexport function filterKeys(object: {}, filter: (key: string, value: any) => boolean) {\n return Object.fromEntries(Object.entries(object).filter(([key, value]) => filter(key, value)))\n}\n\n/** Map object values while preserving the original key set. */\nexport function mapValues<U, T, K extends string>(object: Dict<T, K>, transform: (value: T, key: K) => U) {\n return Object.fromEntries(Object.entries(object).map(([key, value]) => [key, (transform as any)(value, key)])) as Dict<U, K>\n}\n\n/** Alias for `mapValues`. */\nexport { mapValues as valueMap }\n\n/** Pick selected keys from an object, optionally including `undefined` values. */\nexport function pick<T extends object, K extends keyof T>(source: T, keys?: Iterable<K>, forced?: boolean) {\n if (!keys) return { ...source }\n const result = {} as Pick<T, K>\n for (const key of keys) {\n if (forced || source[key] !== undefined) result[key] = source[key]\n }\n return result\n}\n\n/** Omit selected keys from a shallow object copy. */\nexport function omit<T, K extends keyof T>(source: T, keys?: Iterable<K>) {\n if (!keys) return { ...source }\n const result = { ...source } as Omit<T, K>\n for (const key of keys) {\n Reflect.deleteProperty(result, key)\n }\n return result\n}\n\n/** Define a non-enumerable writable property with a typed key. */\nexport function defineProperty<T, K extends keyof T>(object: T, key: K, value: T[K]): T\n/** Define a non-enumerable writable property with an arbitrary key. */\nexport function defineProperty<T, K extends keyof any>(object: T, key: K, value: any): T\n/** Define a non-enumerable writable property and return the object. */\nexport function defineProperty<T, K extends keyof any>(object: T, key: K, value: any) {\n return Object.defineProperty(object, key, { writable: true, value, enumerable: false })\n}\n", "import { isNullable } from './misc.ts'\n\ntype GlobalConstructorNames = keyof {\n [K in keyof typeof globalThis as typeof globalThis[K] extends abstract new (...args: any) => any ? K : never]: K\n}\n\n/** Create a predicate for a global constructor name. */\nexport function is<K extends GlobalConstructorNames>(type: K): (value: any) => value is InstanceType<typeof globalThis[K]>\n/** Test whether a value matches a global constructor name. */\nexport function is<K extends GlobalConstructorNames>(type: K, value: any): value is InstanceType<typeof globalThis[K]>\n/** Test values using `instanceof` with a `toStringTag` fallback. */\nexport function is<K extends GlobalConstructorNames>(type: K, value?: any): any {\n if (arguments.length === 1) return (value: any) => is(type, value)\n return type in globalThis && value instanceof (globalThis[type] as any)\n || Object.prototype.toString.call(value).slice(8, -1) === type\n}\n\nfunction isArrayBufferLike(value: any): value is ArrayBufferLike {\n return is('ArrayBuffer', value) || is('SharedArrayBuffer', value)\n}\n\nfunction isArrayBufferSource(value: any): value is Binary.Source {\n return isArrayBufferLike(value) || ArrayBuffer.isView(value)\n}\n\n/** Binary source detection and base64/hex conversion helpers. */\nexport namespace Binary {\n export type Source<T extends ArrayBufferLike = ArrayBufferLike> = T | ArrayBufferView<T>\n\n export const is = isArrayBufferLike\n export const isSource = isArrayBufferSource\n\n export function fromSource<T extends ArrayBufferLike>(source: Source<T>): T {\n if (ArrayBuffer.isView(source)) {\n // https://stackoverflow.com/questions/8609289/convert-a-binary-nodejs-buffer-to-javascript-arraybuffer#answer-31394257\n return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength) as T\n } else {\n return source\n }\n }\n\n export function toBase64(source: Source) {\n source = fromSource(source)\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(source).toString('base64')\n }\n let binary = ''\n const bytes = new Uint8Array(source)\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n }\n\n export function fromBase64(source: string) {\n if (typeof Buffer !== 'undefined') return fromSource(Buffer.from(source, 'base64'))\n return Uint8Array.from(atob(source), c => c.charCodeAt(0))\n }\n\n export function toHex(source: Source) {\n source = fromSource(source)\n if (typeof Buffer !== 'undefined') return Buffer.from(source).toString('hex')\n return Array.from(new Uint8Array(source), byte => byte.toString(16).padStart(2, '0')).join('')\n }\n\n export function fromHex(source: string) {\n if (typeof Buffer !== 'undefined') return fromSource(Buffer.from(source, 'hex'))\n const hex = source.length % 2 === 0 ? source : source.slice(0, source.length - 1)\n const buffer: number[] = []\n for (let i = 0; i < hex.length; i += 2) {\n buffer.push(parseInt(`${hex[i]}${hex[i + 1]}`, 16))\n }\n return Uint8Array.from(buffer).buffer\n }\n}\n\n/** Decode a base64 string into binary data. */\nexport const base64ToArrayBuffer = Binary.fromBase64\n/** Encode binary data as base64. */\nexport const arrayBufferToBase64 = Binary.toBase64\n/** Decode a hex string into binary data. */\nexport const hexToArrayBuffer = Binary.fromHex\n/** Encode binary data as hex. */\nexport const arrayBufferToHex = Binary.toHex\n\n/** Deep-clone common JavaScript values while preserving prototypes. */\nexport function clone<T>(source: T): T\n/** Deep-clone common JavaScript values while preserving prototypes and cycles. */\nexport function clone(source: any, refs = new Map<any, any>()) {\n if (!source || typeof source !== 'object') return source\n if (is('Date', source)) return new Date(source.valueOf())\n if (is('RegExp', source)) return new RegExp(source.source, source.flags)\n if (isArrayBufferLike(source)) return source.slice(0)\n if (ArrayBuffer.isView(source)) return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength)\n const cached = refs.get(source)\n if (cached) return cached\n if (Array.isArray(source)) {\n const result: any[] = []\n refs.set(source, result)\n source.forEach((value, index) => {\n result[index] = Reflect.apply(clone, null, [value, refs])\n })\n return result\n }\n const result = Object.create(Object.getPrototypeOf(source))\n refs.set(source, result)\n for (const key of Reflect.ownKeys(source)) {\n const descriptor = { ...Reflect.getOwnPropertyDescriptor(source, key) }\n if ('value' in descriptor) {\n descriptor.value = Reflect.apply(clone, null, [descriptor.value, refs])\n }\n Reflect.defineProperty(result, key, descriptor)\n }\n return result\n}\n\n/** Deeply compare arrays, dates, regexps, buffers, and plain object fields. */\nexport function deepEqual(a: any, b: any, strict?: boolean): boolean {\n if (a === b) return true\n if (!strict && isNullable(a) && isNullable(b)) return true\n if (typeof a !== typeof b) return false\n if (typeof a !== 'object') return false\n if (!a || !b) return false\n\n function check<T>(test: (x: any) => x is T, then: (a: T, b: T) => boolean) {\n return test(a) ? test(b) ? then(a, b) : false : test(b) ? false : undefined\n }\n\n return check(Array.isArray, (a, b) => a.length === b.length && a.every((item, index) => deepEqual(item, b[index])))\n ?? check(is('Date'), (a, b) => a.valueOf() === b.valueOf())\n ?? check(is('RegExp'), (a, b) => a.source === b.source && a.flags === b.flags)\n ?? check(isArrayBufferLike, (a, b) => {\n if (a.byteLength !== b.byteLength) return false\n const viewA = new Uint8Array(a)\n const viewB = new Uint8Array(b)\n for (let i = 0; i < viewA.length; i++) {\n if (viewA[i] !== viewB[i]) return false\n }\n return true\n })\n ?? Object.keys({ ...a, ...b }).every(key => deepEqual(a[key], b[key], strict))\n}\n", "/** Time constants plus parsing and formatting helpers. */\nexport namespace Time {\n export const millisecond = 1\n export const second = 1000\n export const minute = second * 60\n export const hour = minute * 60\n export const day = hour * 24\n export const week = day * 7\n\n let timezoneOffset = new Date().getTimezoneOffset()\n\n export function setTimezoneOffset(offset: number) {\n timezoneOffset = offset\n }\n\n export function getTimezoneOffset() {\n return timezoneOffset\n }\n\n export function getDateNumber(date: number | Date = new Date(), offset?: number) {\n if (typeof date === 'number') date = new Date(date)\n if (offset === undefined) offset = timezoneOffset\n return Math.floor((date.valueOf() / minute - offset) / 1440)\n }\n\n export function fromDateNumber(value: number, offset?: number) {\n const date = new Date(value * day)\n if (offset === undefined) offset = timezoneOffset\n return new Date(+date + offset * minute)\n }\n\n const numeric = /\\d+(?:\\.\\d+)?/.source\n const timeRegExp = new RegExp(`^${[\n 'w(?:eek(?:s)?)?',\n 'd(?:ay(?:s)?)?',\n 'h(?:our(?:s)?)?',\n 'm(?:in(?:ute)?(?:s)?)?',\n 's(?:ec(?:ond)?(?:s)?)?',\n ].map(unit => `(${numeric}${unit})?`).join('')}$`)\n\n export function parseTime(source: string) {\n const capture = timeRegExp.exec(source)\n if (!capture) return 0\n return (parseFloat(capture[1]) * week || 0)\n + (parseFloat(capture[2]) * day || 0)\n + (parseFloat(capture[3]) * hour || 0)\n + (parseFloat(capture[4]) * minute || 0)\n + (parseFloat(capture[5]) * second || 0)\n }\n\n export function parseDate(date: string) {\n const parsed = parseTime(date)\n if (parsed) {\n date = Date.now() + parsed as any\n } else if (/^\\d{1,2}(:\\d{1,2}){1,2}$/.test(date)) {\n date = `${new Date().toLocaleDateString()}-${date}`\n } else if (/^\\d{1,2}-\\d{1,2}-\\d{1,2}(:\\d{1,2}){1,2}$/.test(date)) {\n date = `${new Date().getFullYear()}-${date}`\n }\n return date ? new Date(date) : new Date()\n }\n\n export function format(ms: number) {\n const abs = Math.abs(ms)\n if (abs >= day - hour / 2) {\n return Math.round(ms / day) + 'd'\n } else if (abs >= hour - minute / 2) {\n return Math.round(ms / hour) + 'h'\n } else if (abs >= minute - second / 2) {\n return Math.round(ms / minute) + 'm'\n } else if (abs >= second) {\n return Math.round(ms / second) + 's'\n }\n return ms + 'ms'\n }\n\n export function toDigits(source: number, length = 2) {\n return source.toString().padStart(length, '0')\n }\n\n export function template(template: string, time = new Date()) {\n return template\n .replace('yyyy', time.getFullYear().toString())\n .replace('yy', time.getFullYear().toString().slice(2))\n .replace('MM', toDigits(time.getMonth() + 1))\n .replace('dd', toDigits(time.getDate()))\n .replace('hh', toDigits(time.getHours()))\n .replace('mm', toDigits(time.getMinutes()))\n .replace('ss', toDigits(time.getSeconds()))\n .replace('SSS', toDigits(time.getMilliseconds(), 3))\n }\n}\n", "import { Binary, clone, deepEqual, filterKeys, isNullable, isPlainObject, pick, valueMap } from \"@deepseek-ai/cosmokit\";\n//#region lib/types/index.js\nconst kSchema = Symbol.for(\"schemastery\");\nconst kValidationError = Symbol.for(\"ValidationError\");\nglobalThis.__schemastery_index__ ??= 0;\nglobalThis.__schemastery_refs__ = void 0;\nvar ValidationError = class extends TypeError {\n\toptions;\n\tname = \"ValidationError\";\n\tconstructor(message, options) {\n\t\tlet prefix = \"$\";\n\t\tfor (const segment of options.path || []) if (typeof segment === \"string\") prefix += \".\" + segment;\n\t\telse if (typeof segment === \"number\") prefix += \"[\" + segment + \"]\";\n\t\telse if (typeof segment === \"symbol\") prefix += `[Symbol(${segment.toString()})]`;\n\t\tif (prefix.startsWith(\".\")) prefix = prefix.slice(1);\n\t\tsuper((prefix === \"$\" ? \"\" : `${prefix} `) + message);\n\t\tthis.options = options;\n\t}\n\tstatic is(error) {\n\t\treturn !!error?.[kValidationError];\n\t}\n};\nObject.defineProperty(ValidationError.prototype, kValidationError, { value: true });\nconst Schema = function(options) {\n\tconst schema = function(data, options = {}) {\n\t\treturn Schema.resolve(data, schema, options)[0];\n\t};\n\tif (options.refs) {\n\t\tconst refs = valueMap(options.refs, (options) => new Schema(options));\n\t\tconst getRef = (uid) => refs[uid];\n\t\tfor (const key in refs) {\n\t\t\tconst options = refs[key];\n\t\t\toptions.sKey = getRef(options.sKey);\n\t\t\toptions.inner = getRef(options.inner);\n\t\t\toptions.list = options.list && options.list.map(getRef);\n\t\t\toptions.dict = options.dict && valueMap(options.dict, getRef);\n\t\t}\n\t\treturn refs[options.uid];\n\t}\n\tObject.assign(schema, options);\n\tif (typeof schema.callback === \"string\") try {\n\t\tschema.callback = new Function(\"return \" + schema.callback)();\n\t} catch {}\n\tObject.defineProperty(schema, \"uid\", { value: globalThis.__schemastery_index__++ });\n\tObject.setPrototypeOf(schema, Schema.prototype);\n\tschema.meta ||= {};\n\tschema.toString = schema.toString.bind(schema);\n\treturn schema;\n};\nSchema.prototype = Object.create(Function.prototype);\nSchema.prototype[kSchema] = true;\nObject.defineProperty(Schema.prototype, \"~standard\", { get() {\n\treturn {\n\t\tversion: 1,\n\t\tvendor: \"schemastery\",\n\t\tvalidate: (value) => {\n\t\t\ttry {\n\t\t\t\treturn { value: Schema.resolve(value, this, {})[0] };\n\t\t\t} catch (error) {\n\t\t\t\tif (ValidationError.is(error)) return { issues: [{\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t\tpath: error.options.path\n\t\t\t\t}] };\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t};\n} });\nSchema.ValidationError = ValidationError;\nSchema.prototype.toJSON = function toJSON() {\n\tif (globalThis.__schemastery_refs__) {\n\t\tglobalThis.__schemastery_refs__[this.uid] ??= JSON.parse(JSON.stringify({ ...this }));\n\t\treturn this.uid;\n\t}\n\tglobalThis.__schemastery_refs__ = { [this.uid]: { ...this } };\n\tglobalThis.__schemastery_refs__[this.uid] = JSON.parse(JSON.stringify({ ...this }));\n\tconst result = {\n\t\tuid: this.uid,\n\t\trefs: globalThis.__schemastery_refs__\n\t};\n\tglobalThis.__schemastery_refs__ = void 0;\n\treturn result;\n};\nSchema.prototype.set = function set(key, value) {\n\tthis.dict[key] = value;\n\treturn this;\n};\nSchema.prototype.push = function push(value) {\n\tthis.list.push(value);\n\treturn this;\n};\nfunction mergeDesc(original, messages) {\n\tconst result = typeof original === \"string\" ? { \"\": original } : { ...original };\n\tfor (const locale in messages) {\n\t\tconst value = messages[locale];\n\t\tif (value?.$description || value?.$desc) result[locale] = value.$description || value.$desc;\n\t\telse if (typeof value === \"string\") result[locale] = value;\n\t}\n\treturn result;\n}\nfunction getInner(value) {\n\treturn value?.$value ?? value?.$inner;\n}\nfunction extractKeys(data) {\n\treturn filterKeys(data ?? {}, (key) => !key.startsWith(\"$\"));\n}\nSchema.prototype.i18n = function i18n(messages) {\n\tconst schema = Schema(this);\n\tconst desc = mergeDesc(schema.meta.description, messages);\n\tif (Object.keys(desc).length) schema.meta.description = desc;\n\tif (schema.dict) schema.dict = valueMap(schema.dict, (inner, key) => {\n\t\treturn inner.i18n(valueMap(messages, (data) => getInner(data)?.[key] ?? data?.[key]));\n\t});\n\tif (schema.list) schema.list = schema.list.map((inner, index) => {\n\t\treturn inner.i18n(valueMap(messages, (data = {}) => {\n\t\t\tif (Array.isArray(getInner(data))) return getInner(data)[index];\n\t\t\tif (Array.isArray(data)) return data[index];\n\t\t\treturn extractKeys(data);\n\t\t}));\n\t});\n\tif (schema.inner) schema.inner = schema.inner.i18n(valueMap(messages, (data) => {\n\t\tif (getInner(data)) return getInner(data);\n\t\treturn extractKeys(data);\n\t}));\n\tif (schema.sKey) schema.sKey = schema.sKey.i18n(valueMap(messages, (data) => data?.$key));\n\treturn schema;\n};\nSchema.prototype.extra = function extra(key, value) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\t[key]: value\n\t};\n\treturn schema;\n};\nfor (const key of [\n\t\"required\",\n\t\"disabled\",\n\t\"collapse\",\n\t\"hidden\",\n\t\"loose\"\n]) Object.assign(Schema.prototype, { [key](value = true) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\t[key]: value\n\t};\n\treturn schema;\n} });\nSchema.prototype.deprecated = function deprecated() {\n\tconst schema = Schema(this);\n\tschema.meta.badges ||= [];\n\tschema.meta.badges.push({\n\t\ttext: \"deprecated\",\n\t\ttype: \"danger\"\n\t});\n\treturn schema;\n};\nSchema.prototype.experimental = function experimental() {\n\tconst schema = Schema(this);\n\tschema.meta.badges ||= [];\n\tschema.meta.badges.push({\n\t\ttext: \"experimental\",\n\t\ttype: \"warning\"\n\t});\n\treturn schema;\n};\nSchema.prototype.pattern = function pattern(regexp) {\n\tconst schema = Schema(this);\n\tconst pattern = pick(regexp, [\"source\", \"flags\"]);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\tpattern\n\t};\n\treturn schema;\n};\nSchema.prototype.simplify = function simplify(value) {\n\tif (deepEqual(value, this.meta.default, this.type === \"dict\")) return null;\n\tif (isNullable(value)) return value;\n\tif (this.type === \"object\" || this.type === \"dict\") {\n\t\tconst result = {};\n\t\tfor (const key in value) {\n\t\t\tconst item = (this.type === \"object\" ? this.dict[key] : this.inner)?.simplify(value[key]);\n\t\t\tif (this.type === \"dict\" || !isNullable(item)) result[key] = item;\n\t\t}\n\t\tif (deepEqual(result, this.meta.default, this.type === \"dict\")) return null;\n\t\treturn result;\n\t} else if (this.type === \"array\" || this.type === \"tuple\") {\n\t\tconst result = [];\n\t\tvalue.forEach((value, index) => {\n\t\t\tconst schema = this.type === \"array\" ? this.inner : this.list[index];\n\t\t\tconst item = schema ? schema.simplify(value) : value;\n\t\t\tresult.push(item);\n\t\t});\n\t\treturn result;\n\t} else if (this.type === \"intersect\") {\n\t\tconst result = {};\n\t\tfor (const item of this.list) Object.assign(result, item.simplify(value));\n\t\treturn result;\n\t} else if (this.type === \"union\") for (const schema of this.list) try {\n\t\tSchema.resolve(value, schema, {});\n\t\treturn schema.simplify(value);\n\t} catch {}\n\treturn value;\n};\nSchema.prototype.toString = function toString(inline) {\n\treturn formatters[this.type]?.(this, inline) ?? `Schema<${this.type}>`;\n};\nSchema.prototype.role = function role(role, extra) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\trole,\n\t\textra\n\t};\n\treturn schema;\n};\nfor (const key of [\n\t\"default\",\n\t\"link\",\n\t\"comment\",\n\t\"description\",\n\t\"max\",\n\t\"min\",\n\t\"step\"\n]) Object.assign(Schema.prototype, { [key](value) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\t[key]: value\n\t};\n\treturn schema;\n} });\nconst resolvers = {};\nSchema.extend = function extend(type, resolve) {\n\tresolvers[type] = resolve;\n};\nSchema.resolve = function resolve(data, schema, options = {}, strict = false) {\n\tif (!schema) return [data];\n\tif (options.ignore?.(data, schema)) return [data];\n\tif (isNullable(data) && schema.type !== \"lazy\") {\n\t\tif (schema.meta.required) throw new ValidationError(`missing required value`, options);\n\t\tlet current = schema;\n\t\tlet fallback = schema.meta.default;\n\t\twhile (current?.type === \"intersect\" && isNullable(fallback)) {\n\t\t\tcurrent = current.list[0];\n\t\t\tfallback = current?.meta.default;\n\t\t}\n\t\tif (isNullable(fallback)) return [data];\n\t\tdata = clone(fallback);\n\t}\n\tconst callback = resolvers[schema.type];\n\tif (!callback) throw new ValidationError(`unsupported type \"${schema.type}\"`, options);\n\ttry {\n\t\treturn callback(data, schema, options, strict);\n\t} catch (error) {\n\t\tif (!schema.meta.loose) throw error;\n\t\treturn [schema.meta.default];\n\t}\n};\nSchema.from = function from(source) {\n\tif (isNullable(source)) return Schema.any();\n\telse if ([\n\t\t\"string\",\n\t\t\"number\",\n\t\t\"boolean\"\n\t].includes(typeof source)) return Schema.const(source).required();\n\telse if (source[kSchema]) return source;\n\telse if (typeof source === \"function\") switch (source) {\n\t\tcase String: return Schema.string().required();\n\t\tcase Number: return Schema.number().required();\n\t\tcase Boolean: return Schema.boolean().required();\n\t\tcase Function: return Schema.function().required();\n\t\tdefault: return Schema.is(source).required();\n\t}\n\telse throw new TypeError(`cannot infer schema from ${source}`);\n};\nSchema.lazy = function lazy(builder) {\n\tconst toJSON = () => {\n\t\tif (!schema.inner[kSchema]) {\n\t\t\tschema.inner = schema.builder();\n\t\t\tschema.inner.meta = {\n\t\t\t\t...schema.meta,\n\t\t\t\t...schema.inner.meta\n\t\t\t};\n\t\t}\n\t\treturn schema.inner.toJSON();\n\t};\n\tconst schema = new Schema({\n\t\ttype: \"lazy\",\n\t\tbuilder,\n\t\tinner: { toJSON }\n\t});\n\treturn schema;\n};\nSchema.natural = function natural() {\n\treturn Schema.number().step(1).min(0);\n};\nSchema.percent = function percent() {\n\treturn Schema.number().step(.01).min(0).max(1).role(\"slider\");\n};\nSchema.date = function date() {\n\treturn Schema.union([Schema.is(Date), Schema.transform(Schema.string().role(\"datetime\"), (value, options) => {\n\t\tconst date = new Date(value);\n\t\tif (isNaN(+date)) throw new ValidationError(`invalid date \"${value}\"`, options);\n\t\treturn date;\n\t}, true)]);\n};\nSchema.regExp = function regExp(flag = \"\") {\n\treturn Schema.union([Schema.is(RegExp), Schema.transform(Schema.string().role(\"regexp\", { flag }), (value, options) => {\n\t\ttry {\n\t\t\treturn new RegExp(value, flag);\n\t\t} catch (e) {\n\t\t\tthrow new ValidationError(e.message, options);\n\t\t}\n\t}, true)]);\n};\nSchema.arrayBuffer = function arrayBuffer(encoding) {\n\treturn Schema.union([\n\t\tSchema.is(ArrayBuffer),\n\t\tSchema.is(SharedArrayBuffer),\n\t\tSchema.transform(Schema.any(), (value, options) => {\n\t\t\tif (Binary.isSource(value)) return Binary.fromSource(value);\n\t\t\tthrow new ValidationError(`expected ArrayBufferSource but got ${value}`, options);\n\t\t}, true),\n\t\t...encoding ? [Schema.transform(Schema.string(), (value, options) => {\n\t\t\ttry {\n\t\t\t\treturn encoding === \"base64\" ? Binary.fromBase64(value) : Binary.fromHex(value);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new ValidationError(e.message, options);\n\t\t\t}\n\t\t}, true)] : []\n\t]);\n};\nSchema.extend(\"lazy\", (data, schema, options, strict) => {\n\tif (!schema.inner[kSchema]) {\n\t\tschema.inner = schema.builder();\n\t\tschema.inner.meta = {\n\t\t\t...schema.meta,\n\t\t\t...schema.inner.meta\n\t\t};\n\t}\n\treturn Schema.resolve(data, schema.inner, options, strict);\n});\nSchema.extend(\"any\", (data) => {\n\treturn [data];\n});\nSchema.extend(\"never\", (data, _, options) => {\n\tthrow new ValidationError(`expected nullable but got ${data}`, options);\n});\nSchema.extend(\"const\", (data, { value }, options) => {\n\tif (deepEqual(data, value)) return [value];\n\tthrow new ValidationError(`expected ${value} but got ${data}`, options);\n});\nfunction checkWithinRange(data, meta, description, options, skipMin = false) {\n\tconst { max = Infinity, min = -Infinity } = meta;\n\tif (data > max) throw new ValidationError(`expected ${description} <= ${max} but got ${data}`, options);\n\tif (data < min && !skipMin) throw new ValidationError(`expected ${description} >= ${min} but got ${data}`, options);\n}\nSchema.extend(\"string\", (data, { meta }, options) => {\n\tif (typeof data !== \"string\") throw new ValidationError(`expected string but got ${data}`, options);\n\tif (meta.pattern) {\n\t\tconst regexp = new RegExp(meta.pattern.source, meta.pattern.flags);\n\t\tif (!regexp.test(data)) throw new ValidationError(`expect string to match regexp ${regexp}`, options);\n\t}\n\tcheckWithinRange(data.length, meta, \"string length\", options);\n\treturn [data];\n});\nfunction decimalShift(data, digits) {\n\tconst str = data.toString();\n\tif (str.includes(\"e\")) return data * Math.pow(10, digits);\n\tconst index = str.indexOf(\".\");\n\tif (index === -1) return data * Math.pow(10, digits);\n\tconst frac = str.slice(index + 1);\n\tconst integer = str.slice(0, index);\n\tif (frac.length <= digits) return +(integer + frac.padEnd(digits, \"0\"));\n\treturn +(integer + frac.slice(0, digits) + \".\" + frac.slice(digits));\n}\nfunction isMultipleOf(data, min, step) {\n\tstep = Math.abs(step);\n\tif (!/^\\d+\\.\\d+$/.test(step.toString())) return (data - min) % step === 0;\n\tconst index = step.toString().indexOf(\".\");\n\tconst digits = step.toString().slice(index + 1).length;\n\treturn Math.abs(decimalShift(data, digits) - decimalShift(min, digits)) % decimalShift(step, digits) === 0;\n}\nSchema.extend(\"number\", (data, { meta }, options) => {\n\tif (typeof data !== \"number\") throw new ValidationError(`expected number but got ${data}`, options);\n\tcheckWithinRange(data, meta, \"number\", options);\n\tconst { step } = meta;\n\tif (step && !isMultipleOf(data, meta.min ?? 0, step)) throw new ValidationError(`expected number multiple of ${step} but got ${data}`, options);\n\treturn [data];\n});\nSchema.extend(\"boolean\", (data, _, options) => {\n\tif (typeof data === \"boolean\") return [data];\n\tthrow new ValidationError(`expected boolean but got ${data}`, options);\n});\nSchema.extend(\"bitset\", (data, { bits, meta }, options) => {\n\tlet value = 0, keys = [];\n\tif (typeof data === \"number\") {\n\t\tvalue = data;\n\t\tfor (const key in bits) if (data & bits[key]) keys.push(key);\n\t} else if (Array.isArray(data)) {\n\t\tkeys = data;\n\t\tfor (const key of keys) {\n\t\t\tif (typeof key !== \"string\") throw new ValidationError(`expected string but got ${key}`, options);\n\t\t\tif (key in bits) value |= bits[key];\n\t\t}\n\t} else throw new ValidationError(`expected number or array but got ${data}`, options);\n\tif (value === meta.default) return [value];\n\treturn [value, keys];\n});\nSchema.extend(\"function\", (data, _, options) => {\n\tif (typeof data === \"function\") return [data];\n\tthrow new ValidationError(`expected function but got ${data}`, options);\n});\nSchema.extend(\"is\", (data, { constructor }, options) => {\n\tif (typeof constructor === \"function\") {\n\t\tif (data instanceof constructor) return [data];\n\t\tthrow new ValidationError(`expected ${constructor.name} but got ${data}`, options);\n\t} else {\n\t\tif (isNullable(data)) throw new ValidationError(`expected ${constructor} but got ${data}`, options);\n\t\tlet prototype = Object.getPrototypeOf(data);\n\t\twhile (prototype) {\n\t\t\tif (prototype.constructor?.name === constructor) return [data];\n\t\t\tprototype = Object.getPrototypeOf(prototype);\n\t\t}\n\t\tthrow new ValidationError(`expected ${constructor} but got ${data}`, options);\n\t}\n});\nfunction property(data, key, schema, options) {\n\ttry {\n\t\tconst [value, adapted] = Schema.resolve(data[key], schema, {\n\t\t\t...options,\n\t\t\tpath: [...options.path || [], key]\n\t\t});\n\t\tif (adapted !== void 0) data[key] = adapted;\n\t\treturn value;\n\t} catch (e) {\n\t\tif (!options?.autofix) throw e;\n\t\tdelete data[key];\n\t\treturn schema.meta.default;\n\t}\n}\nSchema.extend(\"array\", (data, { inner, meta }, options) => {\n\tif (!Array.isArray(data)) throw new ValidationError(`expected array but got ${data}`, options);\n\tcheckWithinRange(data.length, meta, \"array length\", options, !isNullable(inner.meta.default));\n\treturn [data.map((_, index) => property(data, index, inner, options))];\n});\nSchema.extend(\"dict\", (data, { inner, sKey }, options, strict) => {\n\tif (!isPlainObject(data)) throw new ValidationError(`expected object but got ${data}`, options);\n\tconst result = {};\n\tfor (const key in data) {\n\t\tlet rKey;\n\t\ttry {\n\t\t\trKey = Schema.resolve(key, sKey, options)[0];\n\t\t} catch (error) {\n\t\t\tif (strict) continue;\n\t\t\tthrow error;\n\t\t}\n\t\tresult[rKey] = property(data, key, inner, options);\n\t\tdata[rKey] = data[key];\n\t\tif (key !== rKey) delete data[key];\n\t}\n\treturn [result];\n});\nSchema.extend(\"tuple\", (data, { list }, options, strict) => {\n\tif (!Array.isArray(data)) throw new ValidationError(`expected array but got ${data}`, options);\n\tconst result = list.map((inner, index) => property(data, index, inner, options));\n\tif (strict) return [result];\n\tresult.push(...data.slice(list.length));\n\treturn [result];\n});\nfunction merge(result, data) {\n\tfor (const key in data) {\n\t\tif (key in result) continue;\n\t\tresult[key] = data[key];\n\t}\n}\nSchema.extend(\"object\", (data, { dict }, options, strict) => {\n\tif (!isPlainObject(data)) throw new ValidationError(`expected object but got ${data}`, options);\n\tconst result = {};\n\tfor (const key in dict) {\n\t\tconst value = property(data, key, dict[key], options);\n\t\tif (!isNullable(value) || key in data) result[key] = value;\n\t}\n\tif (!strict) merge(result, data);\n\treturn [result];\n});\nSchema.extend(\"union\", (data, { list, toString }, options, strict) => {\n\tconst messages = [];\n\tfor (const inner of list) try {\n\t\treturn Schema.resolve(data, inner, options, strict);\n\t} catch (error) {\n\t\tmessages.push(error);\n\t}\n\tthrow new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);\n});\nSchema.extend(\"intersect\", (data, { list, toString }, options, strict) => {\n\tif (!list.length) return [data];\n\tlet result;\n\tfor (const inner of list) {\n\t\tconst value = Schema.resolve(data, inner, options, true)[0];\n\t\tif (isNullable(value)) continue;\n\t\tif (isNullable(result)) result = value;\n\t\telse if (typeof result !== typeof value) throw new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);\n\t\telse if (typeof value === \"object\") merge(result ??= {}, value);\n\t\telse if (result !== value) throw new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);\n\t}\n\tif (!strict && isPlainObject(data)) merge(result, data);\n\treturn [result];\n});\nSchema.extend(\"transform\", (data, { inner, callback, preserve }, options) => {\n\tconst [result, adapted = data] = Schema.resolve(data, inner, options, true);\n\tif (preserve) return [callback(result)];\n\telse return [callback(result), callback(adapted)];\n});\nconst formatters = {};\nfunction defineMethod(name, keys, format) {\n\tformatters[name] = format;\n\tObject.assign(Schema, { [name](...args) {\n\t\tconst schema = new Schema({ type: name });\n\t\tkeys.forEach((key, index) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase \"sKey\":\n\t\t\t\t\tschema.sKey = args[index] ?? Schema.string();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"inner\":\n\t\t\t\t\tschema.inner = Schema.from(args[index]);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"list\":\n\t\t\t\t\tschema.list = args[index].map(Schema.from);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"dict\":\n\t\t\t\t\tschema.dict = valueMap(args[index], Schema.from);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"bits\":\n\t\t\t\t\tschema.bits = {};\n\t\t\t\t\tfor (const key in args[index]) {\n\t\t\t\t\t\tif (typeof args[index][key] !== \"number\") continue;\n\t\t\t\t\t\tschema.bits[key] = args[index][key];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"callback\": {\n\t\t\t\t\tconst callback = schema.callback = args[index];\n\t\t\t\t\tcallback[\"toJSON\"] ||= () => callback.toString();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"constructor\": {\n\t\t\t\t\tconst constructor = schema.constructor = args[index];\n\t\t\t\t\tif (typeof constructor === \"function\") constructor[\"toJSON\"] ||= () => constructor[\"name\"];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: schema[key] = args[index];\n\t\t\t}\n\t\t});\n\t\tif (name === \"object\" || name === \"dict\") schema.meta.default = {};\n\t\telse if (name === \"array\" || name === \"tuple\") schema.meta.default = [];\n\t\telse if (name === \"bitset\") schema.meta.default = 0;\n\t\treturn schema;\n\t} });\n}\ndefineMethod(\"is\", [\"constructor\"], ({ constructor }) => {\n\tif (typeof constructor === \"function\") return constructor.name;\n\telse return constructor;\n});\ndefineMethod(\"any\", [], () => \"any\");\ndefineMethod(\"never\", [], () => \"never\");\ndefineMethod(\"const\", [\"value\"], ({ value }) => typeof value === \"string\" ? JSON.stringify(value) : value);\ndefineMethod(\"string\", [], () => \"string\");\ndefineMethod(\"number\", [], () => \"number\");\ndefineMethod(\"boolean\", [], () => \"boolean\");\ndefineMethod(\"bitset\", [\"bits\"], () => \"bitset\");\ndefineMethod(\"function\", [], () => \"function\");\ndefineMethod(\"array\", [\"inner\"], ({ inner }) => `${inner.toString(true)}[]`);\ndefineMethod(\"dict\", [\"inner\", \"sKey\"], ({ inner, sKey }) => `{ [key: ${sKey.toString()}]: ${inner.toString()} }`);\ndefineMethod(\"tuple\", [\"list\"], ({ list }) => `[${list.map((inner) => inner.toString()).join(\", \")}]`);\ndefineMethod(\"object\", [\"dict\"], ({ dict }) => {\n\tif (Object.keys(dict).length === 0) return \"{}\";\n\treturn `{ ${Object.entries(dict).map(([key, inner]) => {\n\t\treturn `${key}${inner.meta.required ? \"\" : \"?\"}: ${inner.toString()}`;\n\t}).join(\", \")} }`;\n});\ndefineMethod(\"union\", [\"list\"], ({ list }, inline) => {\n\tconst result = list.map(({ toString: format }) => format()).join(\" | \");\n\treturn inline ? `(${result})` : result;\n});\ndefineMethod(\"intersect\", [\"list\"], ({ list }) => {\n\treturn `${list.map((inner) => inner.toString(true)).join(\" & \")}`;\n});\ndefineMethod(\"transform\", [\n\t\"inner\",\n\t\"callback\",\n\t\"preserve\"\n], ({ inner }, isInner) => inner.toString(isInner));\n//#endregion\nexport { Schema as default };\n", "/**\n * Wire contracts for `@deepseek-ai/dsh-interconnect`.\n * The transport reuses the Connection RPC envelope (`ClientRequest` /\n * `ServerResponse` from `@deepseek-ai/dsh-host-apiproxy/api`); this module\n * defines only the business payloads that ride inside that envelope.\n * @module @deepseek-ai/dsh-interconnect\n */\n\n/**\n * Logical HTTP route prefix this service owns. Requests reach endpoints as\n * `<baseURL>/interconnect/<endpoint>`.\n */\nexport const INTERCONNECT_CHANNEL = '/interconnect'\n\n/**\n * Credential reference holding the shared auth token. Both halves of a link\n * must resolve the same value: inbound requests are rejected unless their\n * `Authorization: Bearer <token>` matches this secret, and outbound requests\n * send it. An unconfigured token fails closed on the inbound side.\n */\nexport const INTERCONNECT_TOKEN_REF = 'DSH_INTERCONNECT_TOKEN'\n\n/**\n * How one inbound message reaches the target agent's inbox. Each value names an\n * existing `Agent` method, which is exactly the pair `(inbox target, wakeup)`:\n * - `followup` \u2014 `next-turn` + wake: the message becomes its own turn, queued\n * behind whatever the agent is currently doing.\n * - `steer` \u2014 `next-step` + wake: the message cuts into the nearest step\n * boundary of a running turn instead of waiting for that turn to finish; an\n * idle agent starts a turn.\n * - `inject` \u2014 `next-step`, no wake: seeds model-facing context without waking\n * an idle agent, so it can sit unread until something else wakes it.\n */\nexport type DeliveryMode = 'followup' | 'steer' | 'inject'\n\n/**\n * Self-reported identity of the peer that sent a message, carried for reply\n * attribution and echoed `sessionId` of the sending instance. Address-free on\n * purpose: every delivery goes over an already-established WebSocket link, so\n * the receiver addresses a `reply` by recalling the sender's `instanceId` and\n * using its OWN outbound link to that instance \u2014 no origin crosses the wire.\n * Both fields are sender-supplied and self-reported; the receiver stores them\n * only to address a `reply`, never as an auth or routing authority (the shared\n * secret still authenticates the connection itself).\n */\nexport interface SenderIdentity {\n /** The sender's self-reported instance id (diagnostic, as in `ping`). */\n readonly instanceId: string\n /** Session id on the sender's instance to which a `reply` is addressed. */\n readonly sessionId: string\n}\n\n/**\n * Business payload for the `send` endpoint: deliver one text message to one\n * live session of the receiving instance.\n */\nexport interface SendPayload {\n /** Target session id on the receiving instance. */\n readonly sessionId: string\n /** Message text delivered to the peer session's inbox. */\n readonly text: string\n /**\n * The sender's identity, so the receiver can attribute the message and\n * address a reply back. Optional for backward compatibility: a peer running\n * an older version omits it, and the receiver simply has nothing to reply to.\n */\n readonly sender?: SenderIdentity\n /**\n * Per-message override of the receiver's configured delivery mode. Urgency is\n * a property of one message, not of the link, so a sender may ask to cut into\n * a running turn. Absent leaves the receiver's configured default in force.\n */\n readonly delivery?: DeliveryMode\n /**\n * Ask the receiver to wake a persisted session that has no running agent.\n *\n * Opt-in, and deliberately not the default: delivery to a woken session runs\n * a real agent turn \u2014 a billed model call whose assembly carries that\n * session's full toolset \u2014 inside a conversation its owner is not watching\n * and cannot interrupt. That is categorically more than nudging an already\n * open session, so the sender must ask for it explicitly. The receiver can\n * still refuse via `Config.allowResume`, because the cost lands on its\n * machine.\n */\n readonly resume?: boolean\n}\n\n/**\n * Why a `send` did not deliver. `delivered: false` alone cannot be acted on,\n * because the causes need different responses:\n * - `session-not-live` \u2014 the receiver answered; that session has no running\n * agent. Retrying the same id is futile until it is opened, so the caller\n * should list live sessions and pick another target.\n * - `unreachable` \u2014 no usable answer from the receiver (transport failure, or\n * auth rejected). The target may well be fine, so retrying can succeed.\n * - `resume-refused` \u2014 the sender asked to wake a persisted session and this\n * receiver does not allow it. Retrying with `resume` set changes nothing.\n * - `resume-failed` \u2014 waking was allowed and attempted but did not yield a live\n * agent (no persisted session under that id, or another owner holds it).\n * - `session-owned-by-subagent` \u2014 the session is reserved to subagent routing,\n * so its parent agent owns delivery. Injecting here would race that parent;\n * the sender must reach the child through its parent instead.\n * - `no-sender-known` \u2014 a `reply` was addressed to a local session that never\n * recorded a sender, either because that session did not receive a message\n * through this service or the incoming message carried no `sender` identity\n * (an older peer omitted it).\n */\nexport type SendFailure = 'session-not-live' | 'unreachable' | 'resume-refused' | 'resume-failed' | 'session-owned-by-subagent' | 'no-sender-known'\n\n/** Business result of a `send` endpoint call. */\nexport interface SendResult {\n /** True when the target session is live on the receiving instance and the message was delivered. */\n readonly delivered: boolean\n /** Echoed receiver instance id (diagnostic; never trusted for routing). */\n readonly instance: string\n /**\n * The mode actually used, so a sender can tell whether its requested override\n * took effect. Absent when nothing was delivered.\n */\n readonly delivery?: DeliveryMode\n /**\n * Why delivery failed. Present exactly when `delivered` is false, so a caller\n * can distinguish \"wrong target\" from \"receiver unreachable\" instead of\n * guessing from a bare boolean.\n */\n readonly reason?: SendFailure\n}\n\n/** Business result of a `ping` endpoint call. */\nexport interface PingResult {\n /** Always true for an authenticated, live receiver. */\n readonly pong: true\n /** The receiving instance's self-reported id. */\n readonly instance: string\n}\n\n/**\n * One live session on the receiving instance. Only live agents appear: `send`\n * can reach exactly these, so the listing is the set of valid `sessionId`\n * values rather than a directory of everything ever persisted.\n */\nexport interface SessionSummary {\n /** The session id to pass back as `SendPayload.sessionId`. */\n readonly sessionId: string\n /**\n * The session's title when a title projection is available. Absent rather\n * than empty when the projection is missing or the session has no title yet,\n * so a caller can tell \"untitled\" from \"titles unavailable on this receiver\".\n */\n readonly title?: string\n /** The agent's current status, so a sender can prefer an idle target. */\n readonly status?: string\n}\n\n/** Business result of a `list` endpoint call. */\nexport interface ListResult {\n /** Live sessions in registration order. */\n readonly sessions: readonly SessionSummary[]\n /** Echoed receiver instance id (diagnostic; never trusted for routing). */\n readonly instance: string\n}\n\n/** Outbound listing request: which peer instance to list. */\nexport interface ListRequest {\n /** Peers' `instanceId` as configured under {@link Config.peers}. */\n readonly instanceId: string\n}\n\n/** Outbound delivery request: which peer instance plus a `send` business payload. */\nexport interface SendRequest {\n /**\n * The peer instance to deliver to, as configured under {@link Config.peers}.\n * The origin used to reach it comes from that instance's own link.\n */\n readonly instanceId: string\n readonly sessionId: string\n readonly text: string\n /**\n * This sender's identity, forwarded so the receiver can attribute the\n * message and address a reply back.\n */\n readonly sender?: SenderIdentity\n /** Per-message delivery override forwarded to the receiver. */\n readonly delivery?: DeliveryMode\n /** Ask the receiver to wake a persisted session; see {@link SendPayload.resume}. */\n readonly resume?: boolean\n}\n\n/**\n * Business payload for the `reply` endpoint: deliver one text message back to\n * the peer that a given local session most recently received a message from.\n * `sessionId` names the LOCAL session; the outbound target is the sender this\n * session recorded, so the caller does not need to know the peer's origin or\n * session id again.\n */\nexport interface ReplyPayload {\n /** Local session id that received the message being replied to. */\n readonly sessionId: string\n /** Message text delivered back to the recorded sender's session. */\n readonly text: string\n /** Per-message delivery override forwarded to the recalled sender. */\n readonly delivery?: DeliveryMode\n /** Ask the recalled sender's receiver to wake a persisted session. */\n readonly resume?: boolean\n}\n\n/** Outbound reply request: which local session is replying, plus the text. */\nexport interface ReplyRequest {\n /** Local session id that received the message being replied to. */\n readonly sessionId: string\n readonly text: string\n /** Per-message delivery override forwarded to the recalled sender. */\n readonly delivery?: DeliveryMode\n /** Ask the recalled sender's receiver to wake a persisted session. */\n readonly resume?: boolean\n}\n\n/**\n * One serializable lifecycle fact pushed from an emitting instance to its\n * peers. `kind` discriminates the union; the remaining fields are the compact\n * facts extractable from the source event without serializing live objects.\n */\nexport type EventNotification =\n | { readonly kind: 'agent/created'; readonly sessionId: string }\n | { readonly kind: 'agent/disposed'; readonly sessionId: string }\n | { readonly kind: 'agent/status'; readonly sessionId: string; readonly status: 'idle' | 'running' }\n | { readonly kind: 'session/created'; readonly sessionId: string; readonly parentSessionId?: string }\n | { readonly kind: 'session/disposed'; readonly sessionId: string }\n | { readonly kind: 'subagent/end'; readonly provider: string; readonly childSessionId: string; readonly stopReason: string }\n\n/**\n * Wire payload for the `event` endpoint: the pushed fact plus the emitting\n * instance's self-reported id, so a many-upstream receiver can attribute it.\n */\nexport interface EventPayload {\n /** Emitting instance's self-reported id. */\n readonly sender: string\n /** The serialized lifecycle fact. */\n readonly notification: EventNotification\n}\n\n/**\n * One text frame exchanged over a persistent WebSocket peer link. `hello`\n * opens a link with the dialing side's identity; `event` pushes one\n * notification in either direction; `msg`/`msg-result` carry a\n * request/response message delivery over the same long-lived link (correlated\n * by `reqId`). Native ws ping/pong carries the heartbeat, so no application\n * keepalive frame exists.\n */\nexport type LinkFrame =\n | { readonly type: 'hello'; readonly sender: string }\n | { readonly type: 'event'; readonly notification: EventNotification }\n | { readonly type: 'msg'; readonly reqId: string; readonly message: LinkMessage }\n | { readonly type: 'msg-result'; readonly reqId: string; readonly result: SendResult }\n | { readonly type: 'query'; readonly reqId: string; readonly query: QueryMessage }\n | { readonly type: 'query-result'; readonly reqId: string; readonly result: unknown }\n\n/**\n * A request/response query carried by `query`/`query-result` frames, used for\n * the discovery endpoints (`ping`, `list`) over the persistent link. `ping`\n * answers the peer's identity; `list` answers the peer's live session rows.\n */\nexport type QueryMessage =\n | { readonly kind: 'ping' }\n | { readonly kind: 'list' }\n | { readonly kind: 'event'; readonly notification: EventNotification }\n\n/**\n * The message-shaped business payload carried by a `msg` link frame. `kind`\n * picks the delivery semantics: `send` targets the named remote session,\n * `reply` targets the sender a local session recorded. One tagged union keeps\n * the frame count down while the receiver dispatches on `kind`.\n */\nexport type LinkMessage =\n | {\n readonly kind: 'send'\n readonly sessionId: string\n readonly text: string\n /** Delivered and attributed upstream exactly as in `SendPayload`. */\n readonly sender?: SenderIdentity\n readonly delivery?: DeliveryMode\n readonly resume?: boolean\n }\n | {\n readonly kind: 'reply'\n /** LOCAL session id that received the message being replied to. */\n readonly sessionId: string\n readonly text: string\n /** Attribution for the replying instance, so the peer can reply back. */\n readonly sender?: SenderIdentity\n readonly delivery?: DeliveryMode\n readonly resume?: boolean\n }\n\n/**\n * Handle to one established outbound WebSocket peer link. `close` tears the\n * socket down and cancels reconnection; `peer` records the dialed receiver.\n */\nexport interface WebSocketLinkHandle {\n /** The dialed peer origin. */\n readonly peer: string\n /** Terminate the socket and stop reconnect attempts. */\n close(): void\n}\n\n/** Service config bound by the Composition loader. */\nexport interface Config {\n /** Self-reported id of this instance, echoed in ping/send results for diagnostics. */\n readonly instanceId: string\n /** Request timeout for outbound deliveries, in milliseconds. */\n readonly requestTimeoutMs: number\n /**\n * Peer instance routes, keyed by the peer's `instanceId`, valued by the\n * origin this instance dials to reach that peer (e.g. a tunnel endpoint\n * `http://127.0.0.1:13080`). At activation each peer is linked over a\n * persistent WebSocket (heartbeat + reconnect), and every outbound\n * `send`/`reply`/`ping`/`list` is addressed by `instanceId` through that\n * instance's own link. An origin is the ONLY routing authority \u2014 `instanceId`\n * is never used to derive an address.\n *\n * Fan-out of local lifecycle events also goes to every peer in this map.\n * A runtime `subscribe(instanceId, origin)` can extend the map without\n * restart; retuning the origin of an existing peer re-routes it.\n */\n readonly peers?: Record<string, string>\n /**\n * Default mode for inbound `send` messages that carry no per-message\n * override. See {@link DeliveryMode} for what each mode does.\n */\n readonly delivery?: DeliveryMode\n /**\n * Whether this instance honours a sender's `resume` request. Defaults to\n * true: the sender must opt in per message anyway, and this switch exists so\n * the side that pays \u2014 waking a session runs a billed model turn with that\n * session's tools on THIS machine \u2014 can refuse outright.\n */\n readonly allowResume?: boolean\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Cross-instance message handoff service: inbound half owns one HTTP route on\n * the host webserver and delivers authenticated messages into live sessions;\n * outbound half POSTs the same wire shape to a peer instance.\n *\n * Transport is deliberately NOT the Connection RPC channel: that registry's\n * handler sees only `(endpoint, payload, signal)` and the trust fence is the\n * DNS-rebinding `trustedHosts` check, neither of which carries the shared-key\n * `Authorization` header this service authenticates on. Owning a plain HTTP\n * route keeps bearer-token auth at the boundary where the header is readable\n * and fails closed when the token is unconfigured.\n * @module @deepseek-ai/dsh-interconnect\n */\n\nimport { Context, Service } from '@deepseek-ai/cordis'\nimport type { IncomingMessage } from 'node:http'\nimport type { Duplex } from 'node:stream'\nimport type { WebUpgradeRoute } from '@deepseek-ai/dsh-host-webserver'\nimport { credentialRef } from '@deepseek-ai/dsh-credentials'\nimport { boundContextSummary, createUserMessage } from '@deepseek-ai/dsh-llm'\nimport type { Agent } from '@deepseek-ai/dsh-agent'\n// Mirror of the Host's subagent-ownership predicate. The Host moved it out of\n// `@deepseek-ai/dsh-api-remotes` into `@deepseek-ai/dsh-api-session-controller`\n// without a public export, so there is no importable Host binding to reuse. The\n// logic is copied verbatim from the Host (`hasApiSessionSubagentOwner`); keep it\n// in sync if the Host changes the rule, since this is a safety fence.\nfunction isSessionOwnedBySubagent(\n ctx: Context,\n session: Pick<Session, 'header'>,\n agent: Agent | undefined,\n): boolean {\n if (session.header.origin === 'subagent') return true\n const parentId = session.header.parentSession\n if (parentId === undefined || agent === undefined) return false\n const parent = ctx.agents.get(parentId)\n return parent !== undefined && ctx.agents.isOwnedBy(agent.id, parent)\n}\nimport type { Session } from '@deepseek-ai/dsh-session'\nimport type { SubagentRunEndInfo } from '@deepseek-ai/dsh-subagent'\nimport z from '@deepseek-ai/schemastery'\nimport WebSocket, { WebSocketServer } from 'ws'\nimport type { RawData } from 'ws'\nimport {\n INTERCONNECT_TOKEN_REF,\n type Config,\n type DeliveryMode,\n type EventNotification,\n type EventPayload,\n type LinkFrame,\n type LinkMessage,\n type ListResult,\n type PingResult,\n type QueryMessage,\n type ReplyPayload,\n type ReplyRequest,\n type SendPayload,\n type SendResult,\n type SendRequest,\n type SendFailure,\n type SenderIdentity,\n type SessionSummary,\n type WebSocketLinkHandle,\n} from './types.ts'\n\nexport type * from './types.ts'\nexport { INTERCONNECT_TOKEN_REF } from './types.ts'\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n interconnect: InterconnectService\n }\n interface Events {\n /**\n * A remote peer instance pushed one authenticated lifecycle notification\n * into this instance. Payload is the exact {@link EventNotification} that\n * crossed the wire; listeners may react but must not block the HTTP ack.\n */\n 'interconnect/event'(notification: EventNotification, peer: string): void\n }\n}\n\nconst PLUGIN_SOURCE = 'dsh-interconnect'\n\n/** WebSocket upgrade pathname owning the persistent peer link. */\nconst LINK_CHANNEL = '/interconnect/link'\n\n/** Wire union for the discriminated EventNotification fact (shared by HTTP and WS). */\nconst notificationSchema = z.union([\n z.object({ kind: z.const('agent/created'), sessionId: z.string() }),\n z.object({ kind: z.const('agent/disposed'), sessionId: z.string() }),\n z.object({ kind: z.const('agent/status'), sessionId: z.string(), status: z.union([z.const('idle'), z.const('running')]) }),\n z.object({ kind: z.const('session/created'), sessionId: z.string(), parentSessionId: z.string() }),\n z.object({ kind: z.const('session/disposed'), sessionId: z.string() }),\n z.object({ kind: z.const('subagent/end'), provider: z.string(), childSessionId: z.string(), stopReason: z.string() }),\n])\n\n/** Wire shape of an address-free {@link SenderIdentity}. */\nconst senderSchema = z.object({ instanceId: z.string(), sessionId: z.string() })\n\n/** Wire union for the send/reply message carried by a `msg` link frame. */\nconst messageSchema = z.union([\n z.object({\n kind: z.const('send'),\n sessionId: z.string(),\n text: z.string(),\n sender: senderSchema,\n delivery: z.union([z.const('followup'), z.const('steer'), z.const('inject')]),\n resume: z.boolean(),\n }),\n z.object({\n kind: z.const('reply'),\n sessionId: z.string(),\n text: z.string(),\n sender: senderSchema,\n delivery: z.union([z.const('followup'), z.const('steer'), z.const('inject')]),\n resume: z.boolean(),\n }),\n])\n\n/** Wire union for the discovery query carried by a `query` link frame. */\nconst querySchema = z.union([\n z.object({ kind: z.const('ping') }),\n z.object({ kind: z.const('list') }),\n z.object({ kind: z.const('event'), notification: notificationSchema }),\n])\n\n/** Wire union for one WebSocket link text frame. */\nconst linkFrameSchema = z.union([\n z.object({ type: z.const('hello'), sender: z.string() }),\n z.object({ type: z.const('event'), notification: notificationSchema }),\n z.object({ type: z.const('msg'), reqId: z.string(), message: messageSchema }),\n z.object({ type: z.const('msg-result'), reqId: z.string(), result: z.object({\n delivered: z.boolean(),\n instance: z.string(),\n delivery: z.union([z.const('followup'), z.const('steer'), z.const('inject')]),\n reason: z.string(),\n }) }),\n z.object({ type: z.const('query'), reqId: z.string(), query: querySchema }),\n z.object({ type: z.const('query-result'), reqId: z.string(), result: z.any() }),\n])\n\n/**\n * Live cross-instance handoff service, registered as `ctx.interconnect`.\n * Requires the host webserver, the live agent registry, and the credential\n * store; activation is availability-driven like every other host service.\n */\nexport class InterconnectService extends Service {\n static inject = ['webServer', 'agents', 'credentials']\n static Config: z<Config> = z.object({\n instanceId: z.string().default('dsh'),\n requestTimeoutMs: z.natural().max(60000).default(10000),\n peers: z.object({}).default({}),\n delivery: z.union([z.const('followup'), z.const('steer'), z.const('inject')]).default('followup'),\n allowResume: z.boolean().default(true),\n })\n\n private readonly instanceId: string\n private readonly requestTimeoutMs: number\n private readonly delivery: DeliveryMode\n private readonly allowResume: boolean\n private readonly subscriptions: (() => void)[] = []\n private readonly server = new WebSocketServer({ noServer: true })\n private readonly sockets = new Set<WebSocket>()\n /** Outbound peer links keyed by the peer's `instanceId`. */\n private readonly linkStates = new Map<string, LinkState>()\n private heartbeatTimer: NodeJS.Timeout | undefined\n /** Peer identity each live socket announced via its `hello` frame, if any. */\n private readonly peerOf = new WeakMap<WebSocket, string>()\n /** Sender each local session last received a send from, keyed by local session id. */\n private readonly senders = new Map<string, SenderIdentity>()\n /** In-flight frames sent over a peer link, keyed by `reqId`, awaiting a correlated result. */\n private readonly pendingMessages = new Map<string, PendingMessage>()\n private reqIdCounter = 0\n\n constructor(ctx: Context, config: Config) {\n super(ctx, 'interconnect')\n this.instanceId = config.instanceId\n this.requestTimeoutMs = config.requestTimeoutMs\n this.delivery = config.delivery ?? 'followup'\n this.allowResume = config.allowResume ?? true\n // Link every configured peer at activation: all delivery is over these\n // persistent links, and addressing is by instanceId through them.\n for (const [peerInstanceId, origin] of Object.entries(config.peers ?? {})) {\n this.link(peerInstanceId, origin)\n }\n\n const upgrade: WebUpgradeRoute = {\n path: LINK_CHANNEL,\n handler: (req, socket, head) => { void this.handleUpgrade(req, socket, head) },\n }\n ctx.effect(() => ctx.webServer.registerUpgrade(upgrade), 'interconnect: /interconnect/link websocket')\n\n // Liveness sweep: terminate sockets that stopped answering protocol pings.\n // Deleting the CURRENT element of a `Set` while iterating is safe: Set\n // iterators traverse live in insertion order, and a delete of an already\n // visited element is a no-op for the traversal. `socket.terminate()` from\n // `ws` fires its `close` handler asynchronously, so the `close` handler's\n // own `this.sockets.delete(socket)` cannot run mid-iteration either\n // (measured against the real `ws`). Neither delete removes a not-yet-visited\n // element, so nothing is skipped.\n // This timer is created before its cleanup effect below, so it could leak if\n // any statement between here and that effect threw. The only statements in\n // that window are `ctx.on(...)` registrations, and Cordis's `ctx.on` does not\n // throw for any of the event names used here (verified against a real\n // Context), so the window is not reachable. The teardown effect clears the\n // timer when the fiber unwinds.\n this.heartbeatTimer = setInterval(() => {\n for (const socket of this.sockets) {\n if ((socket as WebSocket & { isAlive?: boolean }).isAlive === false) {\n socket.terminate()\n this.sockets.delete(socket)\n continue\n }\n ;(socket as WebSocket & { isAlive?: boolean }).isAlive = false\n socket.ping()\n }\n }, 30000)\n\n this.subscriptions.push(ctx.on('agent/status', ({ agent, status }) => {\n this.fanout({ kind: 'agent/status', sessionId: String(agent.session.id), status })\n }))\n this.subscriptions.push(ctx.on('agent/created', ({ agent }) => {\n this.fanout({ kind: 'agent/created', sessionId: String(agent.session.id) })\n }))\n this.subscriptions.push(ctx.on('agent/disposed', ({ agent }) => {\n this.fanout({ kind: 'agent/disposed', sessionId: String(agent.session.id) })\n }))\n this.subscriptions.push(ctx.on('session/created', (session: Session) => {\n const parentSessionId = session.header.parentSession === undefined\n ? undefined\n : String(session.header.parentSession)\n this.fanout({\n kind: 'session/created',\n sessionId: String(session.id),\n ...(parentSessionId === undefined ? {} : { parentSessionId }),\n })\n }))\n this.subscriptions.push(ctx.on('session/disposed', (session: Session) => {\n this.fanout({ kind: 'session/disposed', sessionId: String(session.id) })\n }))\n this.subscriptions.push(ctx.on('subagent/end', (info: SubagentRunEndInfo) => {\n // Only in-process children are this instance's own work; remote provider\n // runs settle through a different, non-local path.\n if (!info.local) return\n this.fanout({\n kind: 'subagent/end',\n provider: info.provider,\n childSessionId: String(info.id),\n stopReason: info.stopReason,\n })\n }))\n\n // Clean up the event listeners with the service fiber.\n ctx.effect(() => () => {\n for (const dispose of this.subscriptions.splice(0)) dispose()\n }, 'interconnect: event subscriptions')\n\n // Terminate every live socket, outbound dial loop, and the no-server\n // acceptor when the service fiber unwinds.\n ctx.effect(() => () => {\n if (this.heartbeatTimer !== undefined) clearInterval(this.heartbeatTimer)\n for (const state of this.linkStates.values()) state.close()\n this.linkStates.clear()\n for (const socket of this.sockets) socket.terminate()\n this.sockets.clear()\n this.server.close()\n }, 'interconnect: websocket teardown')\n }\n\n /**\n * This instance's identity to attach to outbound messages. Always present:\n * it needs no address, only this instance's id and the calling session.\n * @param sessionId - the local session that is sending, used as the reply target.\n */\n selfSender(sessionId: string): SenderIdentity {\n return { instanceId: this.instanceId, sessionId }\n }\n\n async send(request: SendRequest): Promise<SendResult> {\n const payload: SendPayload = {\n sessionId: request.sessionId,\n text: request.text,\n ...(request.sender === undefined ? {} : { sender: request.sender }),\n ...(request.delivery === undefined ? {} : { delivery: request.delivery }),\n ...(request.resume === undefined ? {} : { resume: request.resume }),\n }\n const result = await this.msgRequest(request.instanceId, 'send', payload)\n return result ?? { delivered: false, instance: this.instanceId, reason: 'unreachable' }\n }\n\n /**\n * Deliver one text message back to the peer that a local session last\n * received a send from. `sessionId` names the LOCAL replying session; the\n * outbound target is the `sender` that session recorded, addressed through\n * this instance's own link to the sender's instance.\n */\n async reply(request: ReplyRequest): Promise<SendResult> {\n const sender = this.senders.get(request.sessionId)\n if (sender === undefined) {\n return { delivered: false, instance: this.instanceId, reason: 'no-sender-known' }\n }\n const payload: SendPayload = {\n sessionId: sender.sessionId,\n text: request.text,\n ...(request.delivery === undefined ? {} : { delivery: request.delivery }),\n ...(request.resume === undefined ? {} : { resume: request.resume }),\n // Attribute the reply to this instance so the peer, in turn, can reply\n // back \u2014 chaining the conversation.\n sender: this.selfSender(request.sessionId),\n }\n const result = await this.msgRequest(sender.instanceId, 'send', payload)\n return result ?? { delivered: false, instance: this.instanceId, reason: 'unreachable' }\n }\n\n /**\n * Probe a peer instance for liveness and identity over its persistent link.\n * Returns the peer identity when reachable, or undefined when the link is\n * not up or no answer arrives.\n */\n async ping(instanceId: string): Promise<PingResult | undefined> {\n return this.queryRequest(instanceId, { kind: 'ping' }) as Promise<PingResult | undefined>\n }\n\n /**\n * List a peer instance's live sessions over its persistent link. Undefined on\n * transport failure, matching `ping`.\n */\n async list(instanceId: string): Promise<ListResult | undefined> {\n return this.queryRequest(instanceId, { kind: 'list' }) as Promise<ListResult | undefined>\n }\n\n /** The origin this instance dials to reach a configured peer, or undefined. */\n private originOf(instanceId: string): string | undefined {\n const state = this.linkStates.get(instanceId)\n return state?.peer\n }\n\n /**\n * Send a `msg` frame over the live link to a peer and resolve with its\n * correlated `msg-result`. Undefined when the peer has no live link here\n * (not configured, or the link is down) \u2014 sends can only address configured+\n * connected peers by design.\n */\n private async msgRequest(\n instanceId: string,\n kind: LinkMessage['kind'],\n payload: SendPayload,\n ): Promise<SendResult | undefined> {\n const state = this.linkStates.get(instanceId)\n if (state === undefined || !state.writable()) return undefined\n const reqId = `m${++this.reqIdCounter}-${crypto.randomUUID()}`\n const message: LinkMessage = {\n kind,\n sessionId: payload.sessionId,\n text: payload.text,\n ...(payload.sender === undefined ? {} : { sender: payload.sender }),\n ...(payload.delivery === undefined ? {} : { delivery: payload.delivery }),\n ...(payload.resume === undefined ? {} : { resume: payload.resume }),\n }\n return this.waitForResult(reqId, (failure) => {\n const wrote = state.sendFrame({ type: 'msg', reqId, message })\n if (!wrote) failure(new Error(`interconnect: peer link to ${instanceId} closed while sending`))\n }) as Promise<SendResult | undefined>\n }\n\n /** Send a `query` frame over the live link to a peer and resolve its result. */\n private async queryRequest(instanceId: string, query: QueryMessage): Promise<unknown> {\n const state = this.linkStates.get(instanceId)\n if (state === undefined || !state.writable()) return undefined\n const reqId = `q${++this.reqIdCounter}-${crypto.randomUUID()}`\n return this.waitForResult(reqId, (failure) => {\n const wrote = state.sendFrame({ type: 'query', reqId, query })\n if (!wrote) failure(new Error(`interconnect: peer link to ${instanceId} closed while querying`))\n })\n }\n\n /** Settle a `reqId` frame against its `*-result`, timing out at `requestTimeoutMs`. */\n private waitForResult(reqId: string, send: (failure: (error: unknown) => void) => void): Promise<unknown> {\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingMessages.delete(reqId)\n reject(new Error(`interconnect: no result for ${reqId} within ${this.requestTimeoutMs}ms`))\n }, this.requestTimeoutMs)\n this.pendingMessages.set(reqId, { timer })\n const pending = this.pendingMessages.get(reqId)\n if (pending === undefined) return\n ;(pending as MutablePendingMessage).resolve = (result: unknown) => {\n clearTimeout(timer)\n this.pendingMessages.delete(reqId)\n resolve(result)\n }\n ;(pending as MutablePendingMessage).reject = (error: unknown) => {\n clearTimeout(timer)\n this.pendingMessages.delete(reqId)\n reject(error instanceof Error ? error : new Error(String(error)))\n }\n send((error: unknown) => {\n clearTimeout(timer)\n this.pendingMessages.delete(reqId)\n reject(error instanceof Error ? error : new Error(String(error)))\n })\n })\n }\n\n /**\n * Add a peer route at runtime. Returns a disposer that removes it. Re-adding\n * an existing instanceId re-routes it to the new origin.\n * @param instanceId - the peer's `instanceId`.\n * @param origin - origin this instance dials to reach that peer.\n * @returns disposer removing the peer route.\n */\n subscribe(instanceId: string, origin: string): () => void {\n this.link(instanceId, origin)\n return () => {\n this.forgetLink(instanceId)\n }\n }\n\n /** Remove a peer route, closing its outbound link. */\n unsubscribe(instanceId: string): void {\n const state = this.linkStates.get(instanceId)\n if (state !== undefined) state.close()\n this.linkStates.delete(instanceId)\n }\n\n /**\n * Open (and, on drop, re-open) a persistent WebSocket link to a peer. Local\n * events stream over the link in real time, and events the peer pushes are\n * surfaced as `interconnect/event`. Repeating for the same instanceId\n * re-routes the link to the new origin.\n * @param instanceId - the peer's `instanceId`.\n * @param origin - receiver origin this instance dials, e.g. `http://127.0.0.1:13080`.\n * @returns a handle closing the link and cancelling reconnection.\n */\n link(instanceId: string, origin: string): WebSocketLinkHandle {\n const existing = this.linkStates.get(instanceId)\n if (existing !== undefined) {\n existing.reroute(trimBase(origin))\n return existing\n }\n const state = new LinkState(this, instanceId, trimBase(origin))\n this.linkStates.set(instanceId, state)\n state.dial()\n return state\n }\n\n /** Remove a closed outbound link's state so a later `link` re-dials fresh. */\n forgetLink(instanceId: string): void {\n this.linkStates.delete(instanceId)\n }\n\n /** Push one serialized lifecycle fact out to every linked peer over WS. */\n private fanout(notification: EventNotification): void {\n this.broadcast(notification)\n }\n\n /** Push one fact over every live WebSocket link, dropping closed sockets. */\n private broadcast(notification: EventNotification): void {\n if (this.sockets.size === 0) return\n const frame: LinkFrame = { type: 'event', notification }\n const encoded = JSON.stringify(frame)\n for (const socket of this.sockets) {\n if (socket.readyState !== WebSocket.OPEN) {\n this.sockets.delete(socket)\n continue\n }\n socket.send(encoded)\n }\n }\n\n /**\n * Dispatch one inbound `msg` frame: deliver a `send`/`reply` and answer the\n * correlated `msg-result` on the same socket. Errors are surfaced as the\n * result so a throwing handler cannot escape the socket's message callback.\n */\n private async handleMsgFrame(socket: WebSocket, reqId: string, message: LinkMessage): Promise<void> {\n let result: SendResult\n if (message.kind === 'reply') {\n result = await this.replyForSession({\n sessionId: message.sessionId,\n text: message.text,\n ...(message.delivery === undefined ? {} : { delivery: message.delivery }),\n ...(message.resume === undefined ? {} : { resume: message.resume }),\n })\n } else {\n result = await this.deliver({\n sessionId: message.sessionId,\n text: message.text,\n ...(message.sender === undefined ? {} : { sender: message.sender }),\n ...(message.delivery === undefined ? {} : { delivery: message.delivery }),\n ...(message.resume === undefined ? {} : { resume: message.resume }),\n })\n }\n this.sendFrame(socket, { type: 'msg-result', reqId, result })\n }\n\n /** Dispatch one inbound `query` frame (ping/list/event) and answer on the socket. */\n private async handleQueryFrame(socket: WebSocket, reqId: string, query: QueryMessage): Promise<void> {\n let result: unknown\n if (query.kind === 'ping') {\n result = { pong: true, instance: this.instanceId }\n } else if (query.kind === 'list') {\n result = this.listSessions()\n } else {\n const payload: EventPayload = {\n sender: this.peerOf.get(socket) ?? 'unknown-peer',\n notification: query.notification,\n }\n this.receiveEvent(payload)\n result = { accepted: true }\n }\n this.sendFrame(socket, { type: 'query-result', reqId, result })\n }\n\n /** Surface one remote notification to local listeners and the log. */\n private receiveEvent(eventPayload: EventPayload): void {\n this.ctx.logger.info(`interconnect: remote event ${eventPayload.notification.kind} from ${eventPayload.sender}`)\n this.ctx.emit('interconnect/event', eventPayload.notification, eventPayload.sender)\n }\n\n /**\n * Summarize every live local session so a sender can discover valid targets\n * instead of having to know a session id already. Only live agents are listed\n * because `send` can reach exactly those.\n *\n * Title and status are best-effort: the title projection is an optional\n * service, and a receiver without it still returns the ids. A projection that\n * throws degrades that one row rather than failing the whole listing, which\n * matches how the Host's own session listing treats its projection column.\n */\n private listSessions(): ListResult {\n // `agents.list()` includes subagent children; a row this instance would\n // refuse to deliver to must not be advertised as a target, or the listing\n // contradicts `send`.\n const reachable = this.ctx.agents.list()\n .filter(agent => !isSessionOwnedBySubagent(this.ctx, agent.session, agent))\n const sessions = reachable.map((agent): SessionSummary => {\n let title: string | undefined\n try {\n const snapshot = this.ctx.get('sessionProjections')?.snapshot(agent.session)\n const value = snapshot?.values.title\n if (typeof value === 'string' && value !== '') title = value\n } catch {\n // A failing projection must not hide a reachable session.\n title = undefined\n }\n return {\n sessionId: agent.id,\n ...(title === undefined ? {} : { title }),\n ...(typeof agent.status === 'string' ? { status: agent.status } : {}),\n }\n })\n return { sessions, instance: this.instanceId }\n }\n\n /**\n * Resolve a session that is not currently live, when the sender asked to wake\n * it. Returns the agent, or the reason it stays undelivered.\n *\n * The resume is delegated to the Host's configured `agent` lookup rather than\n * calling `ctx.agents.resume()` here, and that is the whole point: a handle\n * from `resume()` is owned by the CALLING context, so resuming on this\n * plugin's fiber would tear the session down again the moment the plugin\n * unloads (measured: the same call through the root context leaves it alive).\n * The Host's resolver owns it instead, and it also composes the preset the\n * session recorded \u2014 so a woken agent comes back with the toolset its history\n * was produced under, not an empty one.\n */\n private async wake(payload: SendPayload): Promise<{ agent: Agent } | { reason: SendFailure }> {\n if (payload.resume !== true) return { reason: 'session-not-live' }\n if (!this.allowResume) return { reason: 'resume-refused' }\n // Optional by design: a deployment without the Host's lookup (headless, or\n // a profile with no api-proxy) degrades to the plain not-live answer rather\n // than failing the call.\n const lookup = this.ctx.get('typert')?.lookups.get('agent')\n if (lookup === undefined) return { reason: 'session-not-live' }\n try {\n const resolved = await lookup.resolve(payload.sessionId as never)\n // `undefined` is not a failed wake: the base `agent` provider is a plain\n // registry read, so a deployment without the Host's resuming resolver\n // answers undefined for every id that is not already live. Reporting\n // `resume-failed` there would send the caller chasing a wake that was\n // never possible, when the honest answer is that nothing is live here.\n if (resolved === undefined || resolved === null) return { reason: 'session-not-live' }\n return { agent: resolved as Agent }\n } catch (error) {\n // A refusing resolver is an expected outcome, not a fault of this\n // instance: the id may not exist, or a subagent owner may hold it.\n this.ctx.logger.info(`interconnect: resume refused for ${payload.sessionId}: ${error instanceof Error ? error.message : String(error)}`)\n return { reason: 'resume-failed' }\n }\n }\n\n /**\n * Deliver one message to a live local session, waking a persisted one only\n * when the sender asked and this receiver allows it.\n */\n private async deliver(payload: SendPayload): Promise<SendResult> {\n let agent = this.ctx.agents.get(payload.sessionId as Agent['id'])\n if (agent === undefined) {\n const woken = await this.wake(payload)\n if ('reason' in woken) {\n return { delivered: false, instance: this.instanceId, reason: woken.reason }\n }\n agent = woken.agent\n }\n // Fence the live-hit path too, exactly as the Host does before handing out a\n // live agent: a session reserved to subagent routing is delivered to by its\n // parent, and splicing into its inbox from here would race that parent. The\n // wake path needs no separate check because the Host's resolver applies the\n // same fence internally.\n if (isSessionOwnedBySubagent(this.ctx, agent.session, agent)) {\n return { delivered: false, instance: this.instanceId, reason: 'session-owned-by-subagent' }\n }\n // Remember who sent this message so the receiving session can reply later.\n // `source` never reaches the model, so recording the sender here only sets\n // up reply attribution; the model-facing `content` stays exactly the text\n // that crossed the wire. An absent sender resolves to `{}` under schematery,\n // so test for a real identity rather than `undefined`.\n const sender = ((): SenderIdentity | undefined => {\n const candidate = payload.sender\n return candidate === undefined || typeof candidate.instanceId !== 'string'\n ? undefined\n : candidate\n })()\n if (sender !== undefined) {\n this.senders.set(payload.sessionId, sender)\n }\n // Attribute the message to this plugin, not to the human operator: the\n // receiving agent must be able to tell a cross-instance handoff from text\n // its own user typed. The summary names the sender when one was carried, so\n // a GUI/archive can show where the handoff came from without touching the\n // model-facing content.\n const message = createUserMessage({\n source: {\n kind: 'plugin',\n plugin: PLUGIN_SOURCE,\n form: 'notice',\n summary: boundContextSummary(\n sender === undefined\n ? `interconnect handoff delivered on instance ${this.instanceId}`\n : `interconnect handoff from ${sender.instanceId} (session ${sender.sessionId}) delivered on instance ${this.instanceId}`,\n ),\n },\n content: [{ type: 'text', text: payload.text }],\n })\n // The sender may override the mode per message, because urgency belongs to\n // one message rather than to the link; an absent override leaves the\n // receiver's configured default in force. The switch is exhaustive over\n // DeliveryMode so adding a mode fails the type check here instead of\n // silently falling through to `followup`.\n const mode: DeliveryMode = payload.delivery ?? this.delivery\n switch (mode) {\n case 'steer':\n agent.steer(message)\n break\n case 'inject':\n agent.inject(message)\n break\n case 'followup':\n agent.followup(message)\n break\n }\n return { delivered: true, instance: this.instanceId, delivery: mode }\n }\n\n /**\n * Inbound `reply` dispatch: forward a request to {link reply}, resolving the\n * outbound sender for the named local session. Kept separate from {link\n * deliver} so the two wire endpoints stay distinct in the request pipeline.\n */\n private async replyForSession(payload: ReplyPayload): Promise<SendResult> {\n return this.reply({\n sessionId: payload.sessionId,\n text: payload.text,\n ...(payload.delivery === undefined ? {} : { delivery: payload.delivery }),\n ...(payload.resume === undefined ? {} : { resume: payload.resume }),\n })\n }\n\n private async resolveToken(): Promise<string | undefined> {\n const credential = await this.ctx.credentials.resolve(credentialRef(INTERCONNECT_TOKEN_REF))\n return credential === undefined || credential.value.length === 0 ? undefined : credential.value\n }\n\n /** Resolve the shared token for an outbound dial (same source as inbound). */\n resolveTokenForDial(): Promise<string | undefined> {\n return this.resolveToken()\n }\n\n /** Inbound WebSocket upgrade: authenticate the bearer header, then accept. */\n private async handleUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer): Promise<void> {\n let token: string | undefined\n try {\n token = await this.resolveToken()\n } catch (error) {\n // Fail closed and end the socket: the caller invokes this as\n // `void handleUpgrade(...)`, so letting the rejection escape would both\n // leave this client hanging on an open socket and surface as an unhandled\n // rejection.\n this.ctx.logger.warn(`interconnect: upgrade token read failed: ${error instanceof Error ? error.message : String(error)}`)\n socket.end('HTTP/1.1 403 Forbidden\\r\\nConnection: close\\r\\nContent-Length: 9\\r\\n\\r\\nforbidden')\n return\n }\n if (token === undefined) {\n socket.end('HTTP/1.1 403 Forbidden\\r\\nConnection: close\\r\\nContent-Length: 9\\r\\n\\r\\nforbidden')\n return\n }\n const expected = `Bearer ${token}`\n const header = req.headers.authorization\n if (header === undefined || !timingSafeEqual(header, expected)) {\n socket.end('HTTP/1.1 401 Unauthorized\\r\\nConnection: close\\r\\nContent-Length: 12\\r\\n\\r\\nunauthorized')\n return\n }\n this.server.handleUpgrade(req, socket, head, (websocket) => {\n this.attachSocket(websocket)\n })\n }\n\n /**\n * Install frame + liveness handling on one socket and add it to the live\n * pool. Used by both the server half (accepted upgrade) and the client half\n * (outbound dial), so a single socket carries events both directions.\n */\n attachSocket(websocket: WebSocket): void {\n this.sockets.add(websocket)\n ;(websocket as WebSocket & { isAlive: boolean }).isAlive = true\n websocket.on('pong', () => {\n ;(websocket as WebSocket & { isAlive: boolean }).isAlive = true\n })\n websocket.on('message', (data: RawData) => {\n this.handleFrame(websocket, data)\n })\n websocket.on('close', () => {\n this.sockets.delete(websocket)\n this.peerOf.delete(websocket)\n })\n websocket.on('error', () => {\n this.sockets.delete(websocket)\n })\n // Announce this instance's identity so the dialer can attribute pushes.\n websocket.send(JSON.stringify({ type: 'hello', sender: this.instanceId } satisfies LinkFrame))\n }\n\n /** Parse and route one inbound link frame, attributing events to the socket's announced peer. */\n private handleFrame(socket: WebSocket, data: RawData): void {\n if (Array.isArray(data)) return // binary frames are a protocol violation; ignore\n const text = Buffer.isBuffer(data) ? data.toString('utf8') : Buffer.from(data).toString('utf8')\n let frame: LinkFrame\n try {\n frame = z.resolve(JSON.parse(text), linkFrameSchema, {})[0] as LinkFrame\n } catch {\n this.ctx.logger.warn('interconnect: dropping malformed link frame')\n return\n }\n if (frame.type === 'hello') {\n this.peerOf.set(socket, frame.sender)\n return\n }\n if (frame.type === 'event') {\n const sender = this.peerOf.get(socket) ?? 'unknown-peer'\n try {\n this.receiveEvent({ sender, notification: frame.notification })\n } catch (error) {\n // `receiveEvent` emits `interconnect/event`, and Cordis propagates a\n // listener throw back to the emitter. This runs inside the socket's\n // synchronous `message` handler, so an escaping throw becomes an\n // uncaughtException \u2014 letting any remote peer kill this process by sending\n // an event a local listener happens to mishandle.\n this.ctx.logger.warn(`interconnect: listener for a ${frame.notification.kind} event from ${sender} threw: ${error instanceof Error ? error.message : String(error)}`)\n }\n return\n }\n if (frame.type === 'msg-result') {\n const pending = this.pendingMessages.get(frame.reqId)\n if (pending !== undefined) {\n ;(pending as MutablePendingMessage).resolve?.(frame.result)\n }\n return\n }\n if (frame.type === 'query-result') {\n const pending = this.pendingMessages.get(frame.reqId)\n if (pending !== undefined) {\n ;(pending as MutablePendingMessage).resolve?.(frame.result)\n }\n return\n }\n if (frame.type === 'msg') {\n void Promise.resolve().then(async () => {\n await this.handleMsgFrame(socket, frame.reqId, frame.message)\n }).catch((error: unknown) => {\n this.ctx.logger.warn(`interconnect: msg ${frame.reqId} handler threw: ${error instanceof Error ? error.message : String(error)}`)\n void this.sendFrame(socket, {\n type: 'msg-result',\n reqId: frame.reqId,\n result: { delivered: false, instance: this.instanceId, reason: 'unreachable' },\n })\n })\n return\n }\n // `query`: an inbound discovery/event request. Answer asynchronously and\n // never let a throw escape the socket's synchronous message callback.\n void Promise.resolve().then(async () => {\n await this.handleQueryFrame(socket, frame.reqId, frame.query)\n }).catch((error: unknown) => {\n this.ctx.logger.warn(`interconnect: query ${frame.reqId} handler threw: ${error instanceof Error ? error.message : String(error)}`)\n })\n }\n\n /** Write one frame to a socket, returning false when the socket cannot take it. */\n private sendFrame(socket: WebSocket, frame: LinkFrame): boolean {\n if (socket.readyState !== WebSocket.OPEN) return false\n socket.send(JSON.stringify(frame))\n return true\n }\n}\n\n/**\n * One in-flight `msg` delivered over a peer link, awaiting its `msg-result`.\n * `resolve`/`reject` are installed by `emitViaLink` after the promise is\n * created; `handleFrame` settles the matching entry on a `msg-result`.\n */\ninterface PendingMessage {\n readonly timer: ReturnType<typeof setTimeout>\n}\ninterface MutablePendingMessage extends PendingMessage {\n resolve?: (result: unknown) => void\n reject?: (error: unknown) => void\n}\n\n/**\n * One outbound WebSocket peer link: dials, re-dials with backoff after an\n * unexpected drop, and pushes local events over the live socket. The owning\n * service streams events via {@link InterconnectService.broadcast} only to\n * sockets it accepted; this dialer keeps its own socket OUT of that set and\n * instead subscribes to local events through the service's fan-out via a\n * dedicated route below.\n */\nclass LinkState implements WebSocketLinkHandle {\n private socket: WebSocket | undefined\n private closed = false\n private retry = 0\n private reconnectTimer: ReturnType<typeof setTimeout> | undefined\n\n // `peer` is mutable so `reroute` can point the link at a new origin.\n peer: string\n readonly instanceId: string\n\n constructor(\n private readonly owner: InterconnectService,\n instanceId: string,\n origin: string,\n ) {\n this.instanceId = instanceId\n this.peer = origin\n }\n\n /** Point this link at a different origin; re-dials immediately. */\n reroute(origin: string): void {\n if (origin === this.peer) return\n this.peer = origin\n const socket = this.socket\n if (socket !== undefined) {\n socket.removeAllListeners()\n socket.terminate()\n this.socket = undefined\n }\n this.dial()\n }\n\n /** Open the socket; reconnect is scheduled by the close handler. */\n dial(): void {\n if (this.closed) return\n const url = new URL('/interconnect/link', this.peer)\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n void this.owner.resolveTokenForDial().then((token) => {\n if (token === undefined || this.closed) return\n const socket = new WebSocket(url, {\n headers: { authorization: `Bearer ${token}` },\n })\n this.socket = socket\n socket.once('open', () => {\n this.retry = 0\n // Same handler as the server half: adds to the live pool and announces\n // this instance's identity over the now-open link.\n this.owner.attachSocket(socket)\n })\n socket.once('close', () => {\n if (this.closed) return\n this.scheduleReconnect()\n })\n socket.on('error', () => {\n // close follows; reconnect is scheduled there.\n })\n }).catch(() => {\n // A rejecting token read must not become an unhandled rejection, and must\n // not silently end the dial loop either: without this the link would stay\n // down until the process restarted, since no socket was ever created and\n // so no `close` will arrive to schedule the retry.\n if (this.closed) return\n this.scheduleReconnect()\n })\n }\n\n /** Whether this link currently holds an open socket that can carry frames. */\n writable(): boolean {\n return this.socket !== undefined && this.socket.readyState === WebSocket.OPEN\n }\n\n /** Write one frame over this link's outbound socket; false when not open. */\n sendFrame(frame: LinkFrame): boolean {\n const socket = this.socket\n if (socket === undefined || socket.readyState !== WebSocket.OPEN) return false\n socket.send(JSON.stringify(frame))\n return true\n }\n\n close(): void {\n this.closed = true\n this.owner.forgetLink(this.peer)\n if (this.reconnectTimer !== undefined) clearTimeout(this.reconnectTimer)\n const socket = this.socket\n if (socket !== undefined) {\n socket.removeAllListeners()\n socket.terminate()\n }\n }\n\n private scheduleReconnect(): void {\n const delay = Math.min(30000, 1000 * 2 ** this.retry)\n this.retry += 1\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = undefined\n this.dial()\n }, delay)\n }\n}\n\n/** Constant-time string comparison over the ASCII-encoded lengths. */\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false\n let diff = 0\n for (let i = 0; i < a.length; i += 1) {\n diff |= a.charCodeAt(i) ^ b.charCodeAt(i)\n }\n return diff === 0\n}\n\nfunction trimBase(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, '')\n}\n\nexport default InterconnectService\n", "/** String/symbol keyed dictionary type. */\nexport type Dict<T = any, K extends string | symbol = string> = { [key in K]: T }\n/** Safely read `T[K]`, returning `never` when `K` is not a key of `T`. */\nexport type Get<T extends {}, K> = K extends keyof T ? T[K] : never\n/** Conditional extraction helper with a configurable return type. */\nexport type Extract<S, T, U = S> = S extends T ? U : never\n/** Accept a value or an array, unless the value is already an array type. */\nexport type MaybeArray<T> = [T] extends [unknown[]] ? T : T | T[]\n/** Wrap a value in `Promise`, preserving the resolved type of existing promises. */\nexport type Promisify<T> = Promise<T extends Promise<infer S> ? S : T>\n/** Accept a value or promise unless the value type is already promise-like. */\nexport type Awaitable<T> = [T] extends [Promise<unknown>] ? T : T | Promise<T>\n/** Convert a union type to an intersection type. */\nexport type Intersect<U> = (U extends any ? (arg: U) => void : never) extends ((arg: infer I) => void) ? I : never\n\n/** No-op callback returning `undefined` at runtime and `any` at type level. */\nexport function noop(): any {}\n\n/** Return true when a value is `null` or `undefined`. */\nexport function isNullable(value: any): value is null | undefined | void {\n return value === null || value === undefined\n}\n\n/** Return true when a value is neither `null` nor `undefined`. */\nexport function isNonNullable<T>(value: T): value is NonNullable<T> {\n return !isNullable(value)\n}\n\n/** Return true for non-array object values. */\nexport function isPlainObject(data: any) {\n return data && typeof data === 'object' && !Array.isArray(data)\n}\n\n/** Filter object entries with a key type guard. */\nexport function filterKeys<T, K extends string, U extends K>(object: Dict<T, K>, filter: (key: K, value: T) => key is U): Dict<T, U>\n/** Filter object entries with a boolean predicate. */\nexport function filterKeys<T, K extends string>(object: Dict<T, K>, filter: (key: K, value: T) => boolean): Dict<T, K>\n/** Filter object entries and return a new object. */\nexport function filterKeys(object: {}, filter: (key: string, value: any) => boolean) {\n return Object.fromEntries(Object.entries(object).filter(([key, value]) => filter(key, value)))\n}\n\n/** Map object values while preserving the original key set. */\nexport function mapValues<U, T, K extends string>(object: Dict<T, K>, transform: (value: T, key: K) => U) {\n return Object.fromEntries(Object.entries(object).map(([key, value]) => [key, (transform as any)(value, key)])) as Dict<U, K>\n}\n\n/** Alias for `mapValues`. */\nexport { mapValues as valueMap }\n\n/** Pick selected keys from an object, optionally including `undefined` values. */\nexport function pick<T extends object, K extends keyof T>(source: T, keys?: Iterable<K>, forced?: boolean) {\n if (!keys) return { ...source }\n const result = {} as Pick<T, K>\n for (const key of keys) {\n if (forced || source[key] !== undefined) result[key] = source[key]\n }\n return result\n}\n\n/** Omit selected keys from a shallow object copy. */\nexport function omit<T, K extends keyof T>(source: T, keys?: Iterable<K>) {\n if (!keys) return { ...source }\n const result = { ...source } as Omit<T, K>\n for (const key of keys) {\n Reflect.deleteProperty(result, key)\n }\n return result\n}\n\n/** Define a non-enumerable writable property with a typed key. */\nexport function defineProperty<T, K extends keyof T>(object: T, key: K, value: T[K]): T\n/** Define a non-enumerable writable property with an arbitrary key. */\nexport function defineProperty<T, K extends keyof any>(object: T, key: K, value: any): T\n/** Define a non-enumerable writable property and return the object. */\nexport function defineProperty<T, K extends keyof any>(object: T, key: K, value: any) {\n return Object.defineProperty(object, key, { writable: true, value, enumerable: false })\n}\n", "import { isNullable } from './misc.ts'\n\ntype GlobalConstructorNames = keyof {\n [K in keyof typeof globalThis as typeof globalThis[K] extends abstract new (...args: any) => any ? K : never]: K\n}\n\n/** Create a predicate for a global constructor name. */\nexport function is<K extends GlobalConstructorNames>(type: K): (value: any) => value is InstanceType<typeof globalThis[K]>\n/** Test whether a value matches a global constructor name. */\nexport function is<K extends GlobalConstructorNames>(type: K, value: any): value is InstanceType<typeof globalThis[K]>\n/** Test values using `instanceof` with a `toStringTag` fallback. */\nexport function is<K extends GlobalConstructorNames>(type: K, value?: any): any {\n if (arguments.length === 1) return (value: any) => is(type, value)\n return type in globalThis && value instanceof (globalThis[type] as any)\n || Object.prototype.toString.call(value).slice(8, -1) === type\n}\n\nfunction isArrayBufferLike(value: any): value is ArrayBufferLike {\n return is('ArrayBuffer', value) || is('SharedArrayBuffer', value)\n}\n\nfunction isArrayBufferSource(value: any): value is Binary.Source {\n return isArrayBufferLike(value) || ArrayBuffer.isView(value)\n}\n\n/** Binary source detection and base64/hex conversion helpers. */\nexport namespace Binary {\n export type Source<T extends ArrayBufferLike = ArrayBufferLike> = T | ArrayBufferView<T>\n\n export const is = isArrayBufferLike\n export const isSource = isArrayBufferSource\n\n export function fromSource<T extends ArrayBufferLike>(source: Source<T>): T {\n if (ArrayBuffer.isView(source)) {\n // https://stackoverflow.com/questions/8609289/convert-a-binary-nodejs-buffer-to-javascript-arraybuffer#answer-31394257\n return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength) as T\n } else {\n return source\n }\n }\n\n export function toBase64(source: Source) {\n source = fromSource(source)\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(source).toString('base64')\n }\n let binary = ''\n const bytes = new Uint8Array(source)\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n }\n\n export function fromBase64(source: string) {\n if (typeof Buffer !== 'undefined') return fromSource(Buffer.from(source, 'base64'))\n return Uint8Array.from(atob(source), c => c.charCodeAt(0))\n }\n\n export function toHex(source: Source) {\n source = fromSource(source)\n if (typeof Buffer !== 'undefined') return Buffer.from(source).toString('hex')\n return Array.from(new Uint8Array(source), byte => byte.toString(16).padStart(2, '0')).join('')\n }\n\n export function fromHex(source: string) {\n if (typeof Buffer !== 'undefined') return fromSource(Buffer.from(source, 'hex'))\n const hex = source.length % 2 === 0 ? source : source.slice(0, source.length - 1)\n const buffer: number[] = []\n for (let i = 0; i < hex.length; i += 2) {\n buffer.push(parseInt(`${hex[i]}${hex[i + 1]}`, 16))\n }\n return Uint8Array.from(buffer).buffer\n }\n}\n\n/** Decode a base64 string into binary data. */\nexport const base64ToArrayBuffer = Binary.fromBase64\n/** Encode binary data as base64. */\nexport const arrayBufferToBase64 = Binary.toBase64\n/** Decode a hex string into binary data. */\nexport const hexToArrayBuffer = Binary.fromHex\n/** Encode binary data as hex. */\nexport const arrayBufferToHex = Binary.toHex\n\n/** Deep-clone common JavaScript values while preserving prototypes. */\nexport function clone<T>(source: T): T\n/** Deep-clone common JavaScript values while preserving prototypes and cycles. */\nexport function clone(source: any, refs = new Map<any, any>()) {\n if (!source || typeof source !== 'object') return source\n if (is('Date', source)) return new Date(source.valueOf())\n if (is('RegExp', source)) return new RegExp(source.source, source.flags)\n if (isArrayBufferLike(source)) return source.slice(0)\n if (ArrayBuffer.isView(source)) return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength)\n const cached = refs.get(source)\n if (cached) return cached\n if (Array.isArray(source)) {\n const result: any[] = []\n refs.set(source, result)\n source.forEach((value, index) => {\n result[index] = Reflect.apply(clone, null, [value, refs])\n })\n return result\n }\n const result = Object.create(Object.getPrototypeOf(source))\n refs.set(source, result)\n for (const key of Reflect.ownKeys(source)) {\n const descriptor = { ...Reflect.getOwnPropertyDescriptor(source, key) }\n if ('value' in descriptor) {\n descriptor.value = Reflect.apply(clone, null, [descriptor.value, refs])\n }\n Reflect.defineProperty(result, key, descriptor)\n }\n return result\n}\n\n/** Deeply compare arrays, dates, regexps, buffers, and plain object fields. */\nexport function deepEqual(a: any, b: any, strict?: boolean): boolean {\n if (a === b) return true\n if (!strict && isNullable(a) && isNullable(b)) return true\n if (typeof a !== typeof b) return false\n if (typeof a !== 'object') return false\n if (!a || !b) return false\n\n function check<T>(test: (x: any) => x is T, then: (a: T, b: T) => boolean) {\n return test(a) ? test(b) ? then(a, b) : false : test(b) ? false : undefined\n }\n\n return check(Array.isArray, (a, b) => a.length === b.length && a.every((item, index) => deepEqual(item, b[index])))\n ?? check(is('Date'), (a, b) => a.valueOf() === b.valueOf())\n ?? check(is('RegExp'), (a, b) => a.source === b.source && a.flags === b.flags)\n ?? check(isArrayBufferLike, (a, b) => {\n if (a.byteLength !== b.byteLength) return false\n const viewA = new Uint8Array(a)\n const viewB = new Uint8Array(b)\n for (let i = 0; i < viewA.length; i++) {\n if (viewA[i] !== viewB[i]) return false\n }\n return true\n })\n ?? Object.keys({ ...a, ...b }).every(key => deepEqual(a[key], b[key], strict))\n}\n", "/** Time constants plus parsing and formatting helpers. */\nexport namespace Time {\n export const millisecond = 1\n export const second = 1000\n export const minute = second * 60\n export const hour = minute * 60\n export const day = hour * 24\n export const week = day * 7\n\n let timezoneOffset = new Date().getTimezoneOffset()\n\n export function setTimezoneOffset(offset: number) {\n timezoneOffset = offset\n }\n\n export function getTimezoneOffset() {\n return timezoneOffset\n }\n\n export function getDateNumber(date: number | Date = new Date(), offset?: number) {\n if (typeof date === 'number') date = new Date(date)\n if (offset === undefined) offset = timezoneOffset\n return Math.floor((date.valueOf() / minute - offset) / 1440)\n }\n\n export function fromDateNumber(value: number, offset?: number) {\n const date = new Date(value * day)\n if (offset === undefined) offset = timezoneOffset\n return new Date(+date + offset * minute)\n }\n\n const numeric = /\\d+(?:\\.\\d+)?/.source\n const timeRegExp = new RegExp(`^${[\n 'w(?:eek(?:s)?)?',\n 'd(?:ay(?:s)?)?',\n 'h(?:our(?:s)?)?',\n 'm(?:in(?:ute)?(?:s)?)?',\n 's(?:ec(?:ond)?(?:s)?)?',\n ].map(unit => `(${numeric}${unit})?`).join('')}$`)\n\n export function parseTime(source: string) {\n const capture = timeRegExp.exec(source)\n if (!capture) return 0\n return (parseFloat(capture[1]) * week || 0)\n + (parseFloat(capture[2]) * day || 0)\n + (parseFloat(capture[3]) * hour || 0)\n + (parseFloat(capture[4]) * minute || 0)\n + (parseFloat(capture[5]) * second || 0)\n }\n\n export function parseDate(date: string) {\n const parsed = parseTime(date)\n if (parsed) {\n date = Date.now() + parsed as any\n } else if (/^\\d{1,2}(:\\d{1,2}){1,2}$/.test(date)) {\n date = `${new Date().toLocaleDateString()}-${date}`\n } else if (/^\\d{1,2}-\\d{1,2}-\\d{1,2}(:\\d{1,2}){1,2}$/.test(date)) {\n date = `${new Date().getFullYear()}-${date}`\n }\n return date ? new Date(date) : new Date()\n }\n\n export function format(ms: number) {\n const abs = Math.abs(ms)\n if (abs >= day - hour / 2) {\n return Math.round(ms / day) + 'd'\n } else if (abs >= hour - minute / 2) {\n return Math.round(ms / hour) + 'h'\n } else if (abs >= minute - second / 2) {\n return Math.round(ms / minute) + 'm'\n } else if (abs >= second) {\n return Math.round(ms / second) + 's'\n }\n return ms + 'ms'\n }\n\n export function toDigits(source: number, length = 2) {\n return source.toString().padStart(length, '0')\n }\n\n export function template(template: string, time = new Date()) {\n return template\n .replace('yyyy', time.getFullYear().toString())\n .replace('yy', time.getFullYear().toString().slice(2))\n .replace('MM', toDigits(time.getMonth() + 1))\n .replace('dd', toDigits(time.getDate()))\n .replace('hh', toDigits(time.getHours()))\n .replace('mm', toDigits(time.getMinutes()))\n .replace('ss', toDigits(time.getSeconds()))\n .replace('SSS', toDigits(time.getMilliseconds(), 3))\n }\n}\n", "import { Binary, clone, deepEqual, filterKeys, isNullable, isPlainObject, pick, valueMap } from \"@deepseek-ai/cosmokit\";\n//#region lib/types/index.js\nconst kSchema = Symbol.for(\"schemastery\");\nconst kValidationError = Symbol.for(\"ValidationError\");\nglobalThis.__schemastery_index__ ??= 0;\nglobalThis.__schemastery_refs__ = void 0;\nvar ValidationError = class extends TypeError {\n\toptions;\n\tname = \"ValidationError\";\n\tconstructor(message, options) {\n\t\tlet prefix = \"$\";\n\t\tfor (const segment of options.path || []) if (typeof segment === \"string\") prefix += \".\" + segment;\n\t\telse if (typeof segment === \"number\") prefix += \"[\" + segment + \"]\";\n\t\telse if (typeof segment === \"symbol\") prefix += `[Symbol(${segment.toString()})]`;\n\t\tif (prefix.startsWith(\".\")) prefix = prefix.slice(1);\n\t\tsuper((prefix === \"$\" ? \"\" : `${prefix} `) + message);\n\t\tthis.options = options;\n\t}\n\tstatic is(error) {\n\t\treturn !!error?.[kValidationError];\n\t}\n};\nObject.defineProperty(ValidationError.prototype, kValidationError, { value: true });\nconst Schema = function(options) {\n\tconst schema = function(data, options = {}) {\n\t\treturn Schema.resolve(data, schema, options)[0];\n\t};\n\tif (options.refs) {\n\t\tconst refs = valueMap(options.refs, (options) => new Schema(options));\n\t\tconst getRef = (uid) => refs[uid];\n\t\tfor (const key in refs) {\n\t\t\tconst options = refs[key];\n\t\t\toptions.sKey = getRef(options.sKey);\n\t\t\toptions.inner = getRef(options.inner);\n\t\t\toptions.list = options.list && options.list.map(getRef);\n\t\t\toptions.dict = options.dict && valueMap(options.dict, getRef);\n\t\t}\n\t\treturn refs[options.uid];\n\t}\n\tObject.assign(schema, options);\n\tif (typeof schema.callback === \"string\") try {\n\t\tschema.callback = new Function(\"return \" + schema.callback)();\n\t} catch {}\n\tObject.defineProperty(schema, \"uid\", { value: globalThis.__schemastery_index__++ });\n\tObject.setPrototypeOf(schema, Schema.prototype);\n\tschema.meta ||= {};\n\tschema.toString = schema.toString.bind(schema);\n\treturn schema;\n};\nSchema.prototype = Object.create(Function.prototype);\nSchema.prototype[kSchema] = true;\nObject.defineProperty(Schema.prototype, \"~standard\", { get() {\n\treturn {\n\t\tversion: 1,\n\t\tvendor: \"schemastery\",\n\t\tvalidate: (value) => {\n\t\t\ttry {\n\t\t\t\treturn { value: Schema.resolve(value, this, {})[0] };\n\t\t\t} catch (error) {\n\t\t\t\tif (ValidationError.is(error)) return { issues: [{\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t\tpath: error.options.path\n\t\t\t\t}] };\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t};\n} });\nSchema.ValidationError = ValidationError;\nSchema.prototype.toJSON = function toJSON() {\n\tif (globalThis.__schemastery_refs__) {\n\t\tglobalThis.__schemastery_refs__[this.uid] ??= JSON.parse(JSON.stringify({ ...this }));\n\t\treturn this.uid;\n\t}\n\tglobalThis.__schemastery_refs__ = { [this.uid]: { ...this } };\n\tglobalThis.__schemastery_refs__[this.uid] = JSON.parse(JSON.stringify({ ...this }));\n\tconst result = {\n\t\tuid: this.uid,\n\t\trefs: globalThis.__schemastery_refs__\n\t};\n\tglobalThis.__schemastery_refs__ = void 0;\n\treturn result;\n};\nSchema.prototype.set = function set(key, value) {\n\tthis.dict[key] = value;\n\treturn this;\n};\nSchema.prototype.push = function push(value) {\n\tthis.list.push(value);\n\treturn this;\n};\nfunction mergeDesc(original, messages) {\n\tconst result = typeof original === \"string\" ? { \"\": original } : { ...original };\n\tfor (const locale in messages) {\n\t\tconst value = messages[locale];\n\t\tif (value?.$description || value?.$desc) result[locale] = value.$description || value.$desc;\n\t\telse if (typeof value === \"string\") result[locale] = value;\n\t}\n\treturn result;\n}\nfunction getInner(value) {\n\treturn value?.$value ?? value?.$inner;\n}\nfunction extractKeys(data) {\n\treturn filterKeys(data ?? {}, (key) => !key.startsWith(\"$\"));\n}\nSchema.prototype.i18n = function i18n(messages) {\n\tconst schema = Schema(this);\n\tconst desc = mergeDesc(schema.meta.description, messages);\n\tif (Object.keys(desc).length) schema.meta.description = desc;\n\tif (schema.dict) schema.dict = valueMap(schema.dict, (inner, key) => {\n\t\treturn inner.i18n(valueMap(messages, (data) => getInner(data)?.[key] ?? data?.[key]));\n\t});\n\tif (schema.list) schema.list = schema.list.map((inner, index) => {\n\t\treturn inner.i18n(valueMap(messages, (data = {}) => {\n\t\t\tif (Array.isArray(getInner(data))) return getInner(data)[index];\n\t\t\tif (Array.isArray(data)) return data[index];\n\t\t\treturn extractKeys(data);\n\t\t}));\n\t});\n\tif (schema.inner) schema.inner = schema.inner.i18n(valueMap(messages, (data) => {\n\t\tif (getInner(data)) return getInner(data);\n\t\treturn extractKeys(data);\n\t}));\n\tif (schema.sKey) schema.sKey = schema.sKey.i18n(valueMap(messages, (data) => data?.$key));\n\treturn schema;\n};\nSchema.prototype.extra = function extra(key, value) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\t[key]: value\n\t};\n\treturn schema;\n};\nfor (const key of [\n\t\"required\",\n\t\"disabled\",\n\t\"collapse\",\n\t\"hidden\",\n\t\"loose\"\n]) Object.assign(Schema.prototype, { [key](value = true) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\t[key]: value\n\t};\n\treturn schema;\n} });\nSchema.prototype.deprecated = function deprecated() {\n\tconst schema = Schema(this);\n\tschema.meta.badges ||= [];\n\tschema.meta.badges.push({\n\t\ttext: \"deprecated\",\n\t\ttype: \"danger\"\n\t});\n\treturn schema;\n};\nSchema.prototype.experimental = function experimental() {\n\tconst schema = Schema(this);\n\tschema.meta.badges ||= [];\n\tschema.meta.badges.push({\n\t\ttext: \"experimental\",\n\t\ttype: \"warning\"\n\t});\n\treturn schema;\n};\nSchema.prototype.pattern = function pattern(regexp) {\n\tconst schema = Schema(this);\n\tconst pattern = pick(regexp, [\"source\", \"flags\"]);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\tpattern\n\t};\n\treturn schema;\n};\nSchema.prototype.simplify = function simplify(value) {\n\tif (deepEqual(value, this.meta.default, this.type === \"dict\")) return null;\n\tif (isNullable(value)) return value;\n\tif (this.type === \"object\" || this.type === \"dict\") {\n\t\tconst result = {};\n\t\tfor (const key in value) {\n\t\t\tconst item = (this.type === \"object\" ? this.dict[key] : this.inner)?.simplify(value[key]);\n\t\t\tif (this.type === \"dict\" || !isNullable(item)) result[key] = item;\n\t\t}\n\t\tif (deepEqual(result, this.meta.default, this.type === \"dict\")) return null;\n\t\treturn result;\n\t} else if (this.type === \"array\" || this.type === \"tuple\") {\n\t\tconst result = [];\n\t\tvalue.forEach((value, index) => {\n\t\t\tconst schema = this.type === \"array\" ? this.inner : this.list[index];\n\t\t\tconst item = schema ? schema.simplify(value) : value;\n\t\t\tresult.push(item);\n\t\t});\n\t\treturn result;\n\t} else if (this.type === \"intersect\") {\n\t\tconst result = {};\n\t\tfor (const item of this.list) Object.assign(result, item.simplify(value));\n\t\treturn result;\n\t} else if (this.type === \"union\") for (const schema of this.list) try {\n\t\tSchema.resolve(value, schema, {});\n\t\treturn schema.simplify(value);\n\t} catch {}\n\treturn value;\n};\nSchema.prototype.toString = function toString(inline) {\n\treturn formatters[this.type]?.(this, inline) ?? `Schema<${this.type}>`;\n};\nSchema.prototype.role = function role(role, extra) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\trole,\n\t\textra\n\t};\n\treturn schema;\n};\nfor (const key of [\n\t\"default\",\n\t\"link\",\n\t\"comment\",\n\t\"description\",\n\t\"max\",\n\t\"min\",\n\t\"step\"\n]) Object.assign(Schema.prototype, { [key](value) {\n\tconst schema = Schema(this);\n\tschema.meta = {\n\t\t...schema.meta,\n\t\t[key]: value\n\t};\n\treturn schema;\n} });\nconst resolvers = {};\nSchema.extend = function extend(type, resolve) {\n\tresolvers[type] = resolve;\n};\nSchema.resolve = function resolve(data, schema, options = {}, strict = false) {\n\tif (!schema) return [data];\n\tif (options.ignore?.(data, schema)) return [data];\n\tif (isNullable(data) && schema.type !== \"lazy\") {\n\t\tif (schema.meta.required) throw new ValidationError(`missing required value`, options);\n\t\tlet current = schema;\n\t\tlet fallback = schema.meta.default;\n\t\twhile (current?.type === \"intersect\" && isNullable(fallback)) {\n\t\t\tcurrent = current.list[0];\n\t\t\tfallback = current?.meta.default;\n\t\t}\n\t\tif (isNullable(fallback)) return [data];\n\t\tdata = clone(fallback);\n\t}\n\tconst callback = resolvers[schema.type];\n\tif (!callback) throw new ValidationError(`unsupported type \"${schema.type}\"`, options);\n\ttry {\n\t\treturn callback(data, schema, options, strict);\n\t} catch (error) {\n\t\tif (!schema.meta.loose) throw error;\n\t\treturn [schema.meta.default];\n\t}\n};\nSchema.from = function from(source) {\n\tif (isNullable(source)) return Schema.any();\n\telse if ([\n\t\t\"string\",\n\t\t\"number\",\n\t\t\"boolean\"\n\t].includes(typeof source)) return Schema.const(source).required();\n\telse if (source[kSchema]) return source;\n\telse if (typeof source === \"function\") switch (source) {\n\t\tcase String: return Schema.string().required();\n\t\tcase Number: return Schema.number().required();\n\t\tcase Boolean: return Schema.boolean().required();\n\t\tcase Function: return Schema.function().required();\n\t\tdefault: return Schema.is(source).required();\n\t}\n\telse throw new TypeError(`cannot infer schema from ${source}`);\n};\nSchema.lazy = function lazy(builder) {\n\tconst toJSON = () => {\n\t\tif (!schema.inner[kSchema]) {\n\t\t\tschema.inner = schema.builder();\n\t\t\tschema.inner.meta = {\n\t\t\t\t...schema.meta,\n\t\t\t\t...schema.inner.meta\n\t\t\t};\n\t\t}\n\t\treturn schema.inner.toJSON();\n\t};\n\tconst schema = new Schema({\n\t\ttype: \"lazy\",\n\t\tbuilder,\n\t\tinner: { toJSON }\n\t});\n\treturn schema;\n};\nSchema.natural = function natural() {\n\treturn Schema.number().step(1).min(0);\n};\nSchema.percent = function percent() {\n\treturn Schema.number().step(.01).min(0).max(1).role(\"slider\");\n};\nSchema.date = function date() {\n\treturn Schema.union([Schema.is(Date), Schema.transform(Schema.string().role(\"datetime\"), (value, options) => {\n\t\tconst date = new Date(value);\n\t\tif (isNaN(+date)) throw new ValidationError(`invalid date \"${value}\"`, options);\n\t\treturn date;\n\t}, true)]);\n};\nSchema.regExp = function regExp(flag = \"\") {\n\treturn Schema.union([Schema.is(RegExp), Schema.transform(Schema.string().role(\"regexp\", { flag }), (value, options) => {\n\t\ttry {\n\t\t\treturn new RegExp(value, flag);\n\t\t} catch (e) {\n\t\t\tthrow new ValidationError(e.message, options);\n\t\t}\n\t}, true)]);\n};\nSchema.arrayBuffer = function arrayBuffer(encoding) {\n\treturn Schema.union([\n\t\tSchema.is(ArrayBuffer),\n\t\tSchema.is(SharedArrayBuffer),\n\t\tSchema.transform(Schema.any(), (value, options) => {\n\t\t\tif (Binary.isSource(value)) return Binary.fromSource(value);\n\t\t\tthrow new ValidationError(`expected ArrayBufferSource but got ${value}`, options);\n\t\t}, true),\n\t\t...encoding ? [Schema.transform(Schema.string(), (value, options) => {\n\t\t\ttry {\n\t\t\t\treturn encoding === \"base64\" ? Binary.fromBase64(value) : Binary.fromHex(value);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new ValidationError(e.message, options);\n\t\t\t}\n\t\t}, true)] : []\n\t]);\n};\nSchema.extend(\"lazy\", (data, schema, options, strict) => {\n\tif (!schema.inner[kSchema]) {\n\t\tschema.inner = schema.builder();\n\t\tschema.inner.meta = {\n\t\t\t...schema.meta,\n\t\t\t...schema.inner.meta\n\t\t};\n\t}\n\treturn Schema.resolve(data, schema.inner, options, strict);\n});\nSchema.extend(\"any\", (data) => {\n\treturn [data];\n});\nSchema.extend(\"never\", (data, _, options) => {\n\tthrow new ValidationError(`expected nullable but got ${data}`, options);\n});\nSchema.extend(\"const\", (data, { value }, options) => {\n\tif (deepEqual(data, value)) return [value];\n\tthrow new ValidationError(`expected ${value} but got ${data}`, options);\n});\nfunction checkWithinRange(data, meta, description, options, skipMin = false) {\n\tconst { max = Infinity, min = -Infinity } = meta;\n\tif (data > max) throw new ValidationError(`expected ${description} <= ${max} but got ${data}`, options);\n\tif (data < min && !skipMin) throw new ValidationError(`expected ${description} >= ${min} but got ${data}`, options);\n}\nSchema.extend(\"string\", (data, { meta }, options) => {\n\tif (typeof data !== \"string\") throw new ValidationError(`expected string but got ${data}`, options);\n\tif (meta.pattern) {\n\t\tconst regexp = new RegExp(meta.pattern.source, meta.pattern.flags);\n\t\tif (!regexp.test(data)) throw new ValidationError(`expect string to match regexp ${regexp}`, options);\n\t}\n\tcheckWithinRange(data.length, meta, \"string length\", options);\n\treturn [data];\n});\nfunction decimalShift(data, digits) {\n\tconst str = data.toString();\n\tif (str.includes(\"e\")) return data * Math.pow(10, digits);\n\tconst index = str.indexOf(\".\");\n\tif (index === -1) return data * Math.pow(10, digits);\n\tconst frac = str.slice(index + 1);\n\tconst integer = str.slice(0, index);\n\tif (frac.length <= digits) return +(integer + frac.padEnd(digits, \"0\"));\n\treturn +(integer + frac.slice(0, digits) + \".\" + frac.slice(digits));\n}\nfunction isMultipleOf(data, min, step) {\n\tstep = Math.abs(step);\n\tif (!/^\\d+\\.\\d+$/.test(step.toString())) return (data - min) % step === 0;\n\tconst index = step.toString().indexOf(\".\");\n\tconst digits = step.toString().slice(index + 1).length;\n\treturn Math.abs(decimalShift(data, digits) - decimalShift(min, digits)) % decimalShift(step, digits) === 0;\n}\nSchema.extend(\"number\", (data, { meta }, options) => {\n\tif (typeof data !== \"number\") throw new ValidationError(`expected number but got ${data}`, options);\n\tcheckWithinRange(data, meta, \"number\", options);\n\tconst { step } = meta;\n\tif (step && !isMultipleOf(data, meta.min ?? 0, step)) throw new ValidationError(`expected number multiple of ${step} but got ${data}`, options);\n\treturn [data];\n});\nSchema.extend(\"boolean\", (data, _, options) => {\n\tif (typeof data === \"boolean\") return [data];\n\tthrow new ValidationError(`expected boolean but got ${data}`, options);\n});\nSchema.extend(\"bitset\", (data, { bits, meta }, options) => {\n\tlet value = 0, keys = [];\n\tif (typeof data === \"number\") {\n\t\tvalue = data;\n\t\tfor (const key in bits) if (data & bits[key]) keys.push(key);\n\t} else if (Array.isArray(data)) {\n\t\tkeys = data;\n\t\tfor (const key of keys) {\n\t\t\tif (typeof key !== \"string\") throw new ValidationError(`expected string but got ${key}`, options);\n\t\t\tif (key in bits) value |= bits[key];\n\t\t}\n\t} else throw new ValidationError(`expected number or array but got ${data}`, options);\n\tif (value === meta.default) return [value];\n\treturn [value, keys];\n});\nSchema.extend(\"function\", (data, _, options) => {\n\tif (typeof data === \"function\") return [data];\n\tthrow new ValidationError(`expected function but got ${data}`, options);\n});\nSchema.extend(\"is\", (data, { constructor }, options) => {\n\tif (typeof constructor === \"function\") {\n\t\tif (data instanceof constructor) return [data];\n\t\tthrow new ValidationError(`expected ${constructor.name} but got ${data}`, options);\n\t} else {\n\t\tif (isNullable(data)) throw new ValidationError(`expected ${constructor} but got ${data}`, options);\n\t\tlet prototype = Object.getPrototypeOf(data);\n\t\twhile (prototype) {\n\t\t\tif (prototype.constructor?.name === constructor) return [data];\n\t\t\tprototype = Object.getPrototypeOf(prototype);\n\t\t}\n\t\tthrow new ValidationError(`expected ${constructor} but got ${data}`, options);\n\t}\n});\nfunction property(data, key, schema, options) {\n\ttry {\n\t\tconst [value, adapted] = Schema.resolve(data[key], schema, {\n\t\t\t...options,\n\t\t\tpath: [...options.path || [], key]\n\t\t});\n\t\tif (adapted !== void 0) data[key] = adapted;\n\t\treturn value;\n\t} catch (e) {\n\t\tif (!options?.autofix) throw e;\n\t\tdelete data[key];\n\t\treturn schema.meta.default;\n\t}\n}\nSchema.extend(\"array\", (data, { inner, meta }, options) => {\n\tif (!Array.isArray(data)) throw new ValidationError(`expected array but got ${data}`, options);\n\tcheckWithinRange(data.length, meta, \"array length\", options, !isNullable(inner.meta.default));\n\treturn [data.map((_, index) => property(data, index, inner, options))];\n});\nSchema.extend(\"dict\", (data, { inner, sKey }, options, strict) => {\n\tif (!isPlainObject(data)) throw new ValidationError(`expected object but got ${data}`, options);\n\tconst result = {};\n\tfor (const key in data) {\n\t\tlet rKey;\n\t\ttry {\n\t\t\trKey = Schema.resolve(key, sKey, options)[0];\n\t\t} catch (error) {\n\t\t\tif (strict) continue;\n\t\t\tthrow error;\n\t\t}\n\t\tresult[rKey] = property(data, key, inner, options);\n\t\tdata[rKey] = data[key];\n\t\tif (key !== rKey) delete data[key];\n\t}\n\treturn [result];\n});\nSchema.extend(\"tuple\", (data, { list }, options, strict) => {\n\tif (!Array.isArray(data)) throw new ValidationError(`expected array but got ${data}`, options);\n\tconst result = list.map((inner, index) => property(data, index, inner, options));\n\tif (strict) return [result];\n\tresult.push(...data.slice(list.length));\n\treturn [result];\n});\nfunction merge(result, data) {\n\tfor (const key in data) {\n\t\tif (key in result) continue;\n\t\tresult[key] = data[key];\n\t}\n}\nSchema.extend(\"object\", (data, { dict }, options, strict) => {\n\tif (!isPlainObject(data)) throw new ValidationError(`expected object but got ${data}`, options);\n\tconst result = {};\n\tfor (const key in dict) {\n\t\tconst value = property(data, key, dict[key], options);\n\t\tif (!isNullable(value) || key in data) result[key] = value;\n\t}\n\tif (!strict) merge(result, data);\n\treturn [result];\n});\nSchema.extend(\"union\", (data, { list, toString }, options, strict) => {\n\tconst messages = [];\n\tfor (const inner of list) try {\n\t\treturn Schema.resolve(data, inner, options, strict);\n\t} catch (error) {\n\t\tmessages.push(error);\n\t}\n\tthrow new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);\n});\nSchema.extend(\"intersect\", (data, { list, toString }, options, strict) => {\n\tif (!list.length) return [data];\n\tlet result;\n\tfor (const inner of list) {\n\t\tconst value = Schema.resolve(data, inner, options, true)[0];\n\t\tif (isNullable(value)) continue;\n\t\tif (isNullable(result)) result = value;\n\t\telse if (typeof result !== typeof value) throw new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);\n\t\telse if (typeof value === \"object\") merge(result ??= {}, value);\n\t\telse if (result !== value) throw new ValidationError(`expected ${toString()} but got ${JSON.stringify(data)}`, options);\n\t}\n\tif (!strict && isPlainObject(data)) merge(result, data);\n\treturn [result];\n});\nSchema.extend(\"transform\", (data, { inner, callback, preserve }, options) => {\n\tconst [result, adapted = data] = Schema.resolve(data, inner, options, true);\n\tif (preserve) return [callback(result)];\n\telse return [callback(result), callback(adapted)];\n});\nconst formatters = {};\nfunction defineMethod(name, keys, format) {\n\tformatters[name] = format;\n\tObject.assign(Schema, { [name](...args) {\n\t\tconst schema = new Schema({ type: name });\n\t\tkeys.forEach((key, index) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase \"sKey\":\n\t\t\t\t\tschema.sKey = args[index] ?? Schema.string();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"inner\":\n\t\t\t\t\tschema.inner = Schema.from(args[index]);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"list\":\n\t\t\t\t\tschema.list = args[index].map(Schema.from);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"dict\":\n\t\t\t\t\tschema.dict = valueMap(args[index], Schema.from);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"bits\":\n\t\t\t\t\tschema.bits = {};\n\t\t\t\t\tfor (const key in args[index]) {\n\t\t\t\t\t\tif (typeof args[index][key] !== \"number\") continue;\n\t\t\t\t\t\tschema.bits[key] = args[index][key];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"callback\": {\n\t\t\t\t\tconst callback = schema.callback = args[index];\n\t\t\t\t\tcallback[\"toJSON\"] ||= () => callback.toString();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"constructor\": {\n\t\t\t\t\tconst constructor = schema.constructor = args[index];\n\t\t\t\t\tif (typeof constructor === \"function\") constructor[\"toJSON\"] ||= () => constructor[\"name\"];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: schema[key] = args[index];\n\t\t\t}\n\t\t});\n\t\tif (name === \"object\" || name === \"dict\") schema.meta.default = {};\n\t\telse if (name === \"array\" || name === \"tuple\") schema.meta.default = [];\n\t\telse if (name === \"bitset\") schema.meta.default = 0;\n\t\treturn schema;\n\t} });\n}\ndefineMethod(\"is\", [\"constructor\"], ({ constructor }) => {\n\tif (typeof constructor === \"function\") return constructor.name;\n\telse return constructor;\n});\ndefineMethod(\"any\", [], () => \"any\");\ndefineMethod(\"never\", [], () => \"never\");\ndefineMethod(\"const\", [\"value\"], ({ value }) => typeof value === \"string\" ? JSON.stringify(value) : value);\ndefineMethod(\"string\", [], () => \"string\");\ndefineMethod(\"number\", [], () => \"number\");\ndefineMethod(\"boolean\", [], () => \"boolean\");\ndefineMethod(\"bitset\", [\"bits\"], () => \"bitset\");\ndefineMethod(\"function\", [], () => \"function\");\ndefineMethod(\"array\", [\"inner\"], ({ inner }) => `${inner.toString(true)}[]`);\ndefineMethod(\"dict\", [\"inner\", \"sKey\"], ({ inner, sKey }) => `{ [key: ${sKey.toString()}]: ${inner.toString()} }`);\ndefineMethod(\"tuple\", [\"list\"], ({ list }) => `[${list.map((inner) => inner.toString()).join(\", \")}]`);\ndefineMethod(\"object\", [\"dict\"], ({ dict }) => {\n\tif (Object.keys(dict).length === 0) return \"{}\";\n\treturn `{ ${Object.entries(dict).map(([key, inner]) => {\n\t\treturn `${key}${inner.meta.required ? \"\" : \"?\"}: ${inner.toString()}`;\n\t}).join(\", \")} }`;\n});\ndefineMethod(\"union\", [\"list\"], ({ list }, inline) => {\n\tconst result = list.map(({ toString: format }) => format()).join(\" | \");\n\treturn inline ? `(${result})` : result;\n});\ndefineMethod(\"intersect\", [\"list\"], ({ list }) => {\n\treturn `${list.map((inner) => inner.toString(true)).join(\" & \")}`;\n});\ndefineMethod(\"transform\", [\n\t\"inner\",\n\t\"callback\",\n\t\"preserve\"\n], ({ inner }, isInner) => inner.toString(isInner));\n//#endregion\nexport { Schema as default };\n", "/**\n * Wire contracts for `@deepseek-ai/dsh-interconnect`.\n * The transport is WebSocket-only: `LinkFrame`, `QueryMessage`, and `LinkMessage`\n * define the whole wire shape exchanged over the `/interconnect/link` upgrade\n * (see `index.ts`); this module defines those frames plus the business payloads\n * that ride inside them. No Host RPC envelope is involved.\n * @module @deepseek-ai/dsh-interconnect\n */\n\n/**\n * Logical HTTP route prefix this service owns. Requests reach endpoints as\n * `<baseURL>/interconnect/<endpoint>`.\n */\nexport const INTERCONNECT_CHANNEL = '/interconnect'\n\n/**\n * Credential reference holding the shared auth token. Both halves of a link\n * must resolve the same value: inbound requests are rejected unless their\n * `Authorization: Bearer <token>` matches this secret, and outbound requests\n * send it. An unconfigured token fails closed on the inbound side.\n */\nexport const INTERCONNECT_TOKEN_REF = 'DSH_INTERCONNECT_TOKEN'\n\n/**\n * How one inbound message reaches the target agent's inbox. Each value names an\n * existing `Agent` method, which is exactly the pair `(inbox target, wakeup)`:\n * - `followup` \u2014 `next-turn` + wake: the message becomes its own turn, queued\n * behind whatever the agent is currently doing.\n * - `steer` \u2014 `next-step` + wake: the message cuts into the nearest step\n * boundary of a running turn instead of waiting for that turn to finish; an\n * idle agent starts a turn.\n * - `inject` \u2014 `next-step`, no wake: seeds model-facing context without waking\n * an idle agent, so it can sit unread until something else wakes it.\n */\nexport type DeliveryMode = 'followup' | 'steer' | 'inject'\n\n/**\n * Self-reported identity of the peer that sent a message, carried for reply\n * attribution and echoed `sessionId` of the sending instance. Address-free on\n * purpose: every delivery goes over an already-established WebSocket link, so\n * the receiver addresses a `reply` by recalling the sender's `instanceId` and\n * using its OWN outbound link to that instance \u2014 no origin crosses the wire.\n * Both fields are sender-supplied and self-reported; the receiver stores them\n * only to address a `reply`, never as an auth or routing authority (the shared\n * secret still authenticates the connection itself).\n */\nexport interface SenderIdentity {\n /** The sender's self-reported instance id (diagnostic, as in `ping`). */\n readonly instanceId: string\n /** Session id on the sender's instance to which a `reply` is addressed. */\n readonly sessionId: string\n}\n\n/**\n * Business payload for the `send` endpoint: deliver one text message to one\n * live session of the receiving instance.\n */\nexport interface SendPayload {\n /** Target session id on the receiving instance. */\n readonly sessionId: string\n /** Message text delivered to the peer session's inbox. */\n readonly text: string\n /**\n * The sender's identity, so the receiver can attribute the message and\n * address a reply back. Optional for backward compatibility: a peer running\n * an older version omits it, and the receiver simply has nothing to reply to.\n */\n readonly sender?: SenderIdentity\n /**\n * Per-message override of the receiver's configured delivery mode. Urgency is\n * a property of one message, not of the link, so a sender may ask to cut into\n * a running turn. Absent leaves the receiver's configured default in force.\n */\n readonly delivery?: DeliveryMode\n /**\n * Ask the receiver to wake a persisted session that has no running agent.\n *\n * Opt-in, and deliberately not the default: delivery to a woken session runs\n * a real agent turn \u2014 a billed model call whose assembly carries that\n * session's full toolset \u2014 inside a conversation its owner is not watching\n * and cannot interrupt. That is categorically more than nudging an already\n * open session, so the sender must ask for it explicitly. The receiver can\n * still refuse via `Config.allowResume`, because the cost lands on its\n * machine.\n */\n readonly resume?: boolean\n}\n\n/**\n * Why a `send` did not deliver. `delivered: false` alone cannot be acted on,\n * because the causes need different responses:\n * - `session-not-live` \u2014 the receiver answered; that session has no running\n * agent. Retrying the same id is futile until it is opened, so the caller\n * should list live sessions and pick another target.\n * - `unreachable` \u2014 no usable answer from the receiver (transport failure, or\n * auth rejected). The target may well be fine, so retrying can succeed.\n * - `resume-refused` \u2014 the sender asked to wake a persisted session and this\n * receiver does not allow it. Retrying with `resume` set changes nothing.\n * - `resume-failed` \u2014 waking was allowed and attempted but did not yield a live\n * agent (no persisted session under that id, or another owner holds it).\n * - `session-owned-by-subagent` \u2014 the session is reserved to subagent routing,\n * so its parent agent owns delivery. Injecting here would race that parent;\n * the sender must reach the child through its parent instead.\n * - `no-sender-known` \u2014 a `reply` was addressed to a local session that never\n * recorded a sender, either because that session did not receive a message\n * through this service or the incoming message carried no `sender` identity\n * (an older peer omitted it).\n */\nexport type SendFailure = 'session-not-live' | 'unreachable' | 'resume-refused' | 'resume-failed' | 'session-owned-by-subagent' | 'no-sender-known'\n\n/** Business result of a `send` endpoint call. */\nexport interface SendResult {\n /** True when the target session is live on the receiving instance and the message was delivered. */\n readonly delivered: boolean\n /** Echoed receiver instance id (diagnostic; never trusted for routing). */\n readonly instance: string\n /**\n * The mode actually used, so a sender can tell whether its requested override\n * took effect. Absent when nothing was delivered.\n */\n readonly delivery?: DeliveryMode\n /**\n * Why delivery failed. Present exactly when `delivered` is false, so a caller\n * can distinguish \"wrong target\" from \"receiver unreachable\" instead of\n * guessing from a bare boolean.\n */\n readonly reason?: SendFailure\n}\n\n/** Business result of a `ping` endpoint call. */\nexport interface PingResult {\n /** Always true for an authenticated, live receiver. */\n readonly pong: true\n /** The receiving instance's self-reported id. */\n readonly instance: string\n}\n\n/**\n * One live session on the receiving instance. Only live agents appear: `send`\n * can reach exactly these, so the listing is the set of valid `sessionId`\n * values rather than a directory of everything ever persisted.\n */\nexport interface SessionSummary {\n /** The session id to pass back as `SendPayload.sessionId`. */\n readonly sessionId: string\n /**\n * The session's title when a title projection is available. Absent rather\n * than empty when the projection is missing or the session has no title yet,\n * so a caller can tell \"untitled\" from \"titles unavailable on this receiver\".\n */\n readonly title?: string\n /** The agent's current status, so a sender can prefer an idle target. */\n readonly status?: string\n}\n\n/** Business result of a `list` endpoint call. */\nexport interface ListResult {\n /** Live sessions in registration order. */\n readonly sessions: readonly SessionSummary[]\n /** Echoed receiver instance id (diagnostic; never trusted for routing). */\n readonly instance: string\n}\n\n/** Outbound listing request: which peer instance to list. */\nexport interface ListRequest {\n /** Peers' `instanceId` as configured under {@link Config.peers}. */\n readonly instanceId: string\n}\n\n/** Outbound delivery request: which peer instance plus a `send` business payload. */\nexport interface SendRequest {\n /**\n * The peer instance to deliver to, as configured under {@link Config.peers}.\n * The origin used to reach it comes from that instance's own link.\n */\n readonly instanceId: string\n readonly sessionId: string\n readonly text: string\n /**\n * This sender's identity, forwarded so the receiver can attribute the\n * message and address a reply back.\n */\n readonly sender?: SenderIdentity\n /** Per-message delivery override forwarded to the receiver. */\n readonly delivery?: DeliveryMode\n /** Ask the receiver to wake a persisted session; see {@link SendPayload.resume}. */\n readonly resume?: boolean\n}\n\n/**\n * Business payload for the `reply` endpoint: deliver one text message back to\n * the peer that a given local session most recently received a message from.\n * `sessionId` names the LOCAL session; the outbound target is the sender this\n * session recorded, so the caller does not need to know the peer's origin or\n * session id again.\n */\nexport interface ReplyPayload {\n /** Local session id that received the message being replied to. */\n readonly sessionId: string\n /** Message text delivered back to the recorded sender's session. */\n readonly text: string\n /** Per-message delivery override forwarded to the recalled sender. */\n readonly delivery?: DeliveryMode\n /** Ask the recalled sender's receiver to wake a persisted session. */\n readonly resume?: boolean\n}\n\n/** Outbound reply request: which local session is replying, plus the text. */\nexport interface ReplyRequest {\n /** Local session id that received the message being replied to. */\n readonly sessionId: string\n readonly text: string\n /** Per-message delivery override forwarded to the recalled sender. */\n readonly delivery?: DeliveryMode\n /** Ask the recalled sender's receiver to wake a persisted session. */\n readonly resume?: boolean\n}\n\n/**\n * One serializable lifecycle fact pushed from an emitting instance to its\n * peers. `kind` discriminates the union; the remaining fields are the compact\n * facts extractable from the source event without serializing live objects.\n */\nexport type EventNotification =\n | { readonly kind: 'agent/created'; readonly sessionId: string }\n | { readonly kind: 'agent/disposed'; readonly sessionId: string }\n | { readonly kind: 'agent/status'; readonly sessionId: string; readonly status: 'idle' | 'running' }\n | { readonly kind: 'session/created'; readonly sessionId: string; readonly parentSessionId?: string }\n | { readonly kind: 'session/disposed'; readonly sessionId: string }\n | { readonly kind: 'subagent/end'; readonly provider: string; readonly childSessionId: string; readonly stopReason: string }\n\n/**\n * Wire payload for the `event` endpoint: the pushed fact plus the emitting\n * instance's self-reported id, so a many-upstream receiver can attribute it.\n */\nexport interface EventPayload {\n /** Emitting instance's self-reported id. */\n readonly sender: string\n /** The serialized lifecycle fact. */\n readonly notification: EventNotification\n}\n\n/**\n * One text frame exchanged over a persistent WebSocket peer link. `hello`\n * opens a link with the dialing side's identity; `event` pushes one\n * notification in either direction; `msg`/`msg-result` carry a\n * request/response message delivery over the same long-lived link (correlated\n * by `reqId`). Native ws ping/pong carries the heartbeat, so no application\n * keepalive frame exists.\n */\nexport type LinkFrame =\n | { readonly type: 'hello'; readonly sender: string }\n | { readonly type: 'event'; readonly notification: EventNotification }\n | { readonly type: 'msg'; readonly reqId: string; readonly message: LinkMessage }\n | { readonly type: 'msg-result'; readonly reqId: string; readonly result: SendResult }\n | { readonly type: 'query'; readonly reqId: string; readonly query: QueryMessage }\n | { readonly type: 'query-result'; readonly reqId: string; readonly result: unknown }\n\n/**\n * A request/response query carried by `query`/`query-result` frames, used for\n * the discovery endpoints (`ping`, `list`) over the persistent link. `ping`\n * answers the peer's identity; `list` answers the peer's live session rows.\n */\nexport type QueryMessage =\n | { readonly kind: 'ping' }\n | { readonly kind: 'list' }\n | { readonly kind: 'event'; readonly notification: EventNotification }\n\n/**\n * The message-shaped business payload carried by a `msg` link frame. `kind`\n * picks the delivery semantics: `send` targets the named remote session,\n * `reply` targets the sender a local session recorded. One tagged union keeps\n * the frame count down while the receiver dispatches on `kind`.\n */\nexport type LinkMessage =\n | {\n readonly kind: 'send'\n readonly sessionId: string\n readonly text: string\n /** Delivered and attributed upstream exactly as in `SendPayload`. */\n readonly sender?: SenderIdentity\n readonly delivery?: DeliveryMode\n readonly resume?: boolean\n }\n | {\n readonly kind: 'reply'\n /** LOCAL session id that received the message being replied to. */\n readonly sessionId: string\n readonly text: string\n /** Attribution for the replying instance, so the peer can reply back. */\n readonly sender?: SenderIdentity\n readonly delivery?: DeliveryMode\n readonly resume?: boolean\n }\n\n/**\n * Handle to one established outbound WebSocket peer link. `close` tears the\n * socket down and cancels reconnection; `peer` records the dialed receiver.\n */\nexport interface WebSocketLinkHandle {\n /** The dialed peer origin. */\n readonly peer: string\n /** Terminate the socket and stop reconnect attempts. */\n close(): void\n}\n\n/** Service config bound by the Composition loader. */\nexport interface Config {\n /** Self-reported id of this instance, echoed in ping/send results for diagnostics. */\n readonly instanceId: string\n /** Request timeout for outbound deliveries, in milliseconds. */\n readonly requestTimeoutMs: number\n /**\n * Peer instance routes, keyed by the peer's `instanceId`, valued by the\n * origin this instance dials to reach that peer (e.g. a tunnel endpoint\n * `http://127.0.0.1:13080`). At activation each peer is linked over a\n * persistent WebSocket (heartbeat + reconnect), and every outbound\n * `send`/`reply`/`ping`/`list` is addressed by `instanceId` through that\n * instance's own link. An origin is the ONLY routing authority \u2014 `instanceId`\n * is never used to derive an address.\n *\n * Fan-out of local lifecycle events also goes to every peer in this map.\n * A runtime `subscribe(instanceId, origin)` can extend the map without\n * restart; retuning the origin of an existing peer re-routes it.\n */\n readonly peers?: Record<string, string>\n /**\n * Default mode for inbound `send` messages that carry no per-message\n * override. See {@link DeliveryMode} for what each mode does.\n */\n readonly delivery?: DeliveryMode\n /**\n * Whether this instance honours a sender's `resume` request. Defaults to\n * true: the sender must opt in per message anyway, and this switch exists so\n * the side that pays \u2014 waking a session runs a billed model turn with that\n * session's tools on THIS machine \u2014 can refuse outright.\n */\n readonly allowResume?: boolean\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["value", "Binary", "result", "a", "b", "Time", "date", "template", "options", "pattern", "value", "extra", "resolve", "toJSON", "date", "toString", "key", "resolve"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/interconnect/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/interconnect/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAyBtD,OAAO,CAAC,MAAM,0BAA0B,CAAA;AACxC,OAAO,SAA8B,MAAM,IAAI,CAAA;AAE/C,OAAO,EAEL,KAAK,MAAM,EAEX,KAAK,iBAAiB,EAItB,KAAK,UAAU,EACf,KAAK,UAAU,EAGf,KAAK,YAAY,EAEjB,KAAK,UAAU,EACf,KAAK,WAAW,EAEhB,KAAK,cAAc,EAEnB,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAA;AAEnB,mBAAmB,YAAY,CAAA;AAC/B,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAEnD,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,YAAY,EAAE,mBAAmB,CAAA;KAClC;IACD,UAAU,MAAM;QACd;;;;WAIG;QACH,oBAAoB,CAAC,YAAY,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAC1E;CACF;AA8DD;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,OAAO;IAC9C,MAAM,CAAC,MAAM,WAAyC;IACtD,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAMtB;IAEF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;IAC1D,OAAO,CAAC,cAAc,CAA4B;IAClD,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,8FAA8F;IAC9F,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IACpE,OAAO,CAAC,YAAY,CAAI;gBAEZ,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IA+FxC;;;;OAIG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc;IAIvC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAYrD;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAkBvD;;;;OAIG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAI/D;;;OAGG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAI/D,+EAA+E;IAC/E,OAAO,CAAC,QAAQ;IAKhB;;;;;OAKG;YACW,UAAU;IAsBxB,gFAAgF;YAClE,YAAY;IAU1B,uFAAuF;IACvF,OAAO,CAAC,aAAa;IA2BrB;;;;;;OAMG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI;IAOzD,sDAAsD;IACtD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAMrC;;;;;;;;OAQG;IACH,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,mBAAmB;IAY7D,8EAA8E;IAC9E,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIpC,2EAA2E;IAC3E,OAAO,CAAC,MAAM;IAId,6EAA6E;IAC7E,OAAO,CAAC,SAAS;IAajB;;;;OAIG;YACW,cAAc;IAqB5B,qFAAqF;YACvE,gBAAgB;IAiB9B,sEAAsE;IACtE,OAAO,CAAC,YAAY;IAKpB;;;;;;;;;OASG;IACH,OAAO,CAAC,YAAY;IAyBpB;;;;;;;;;;;;OAYG;YACW,IAAI;IAyBlB;;;OAGG;YACW,OAAO;IAqErB;;;;OAIG;YACW,eAAe;YASf,YAAY;IAK1B,8EAA8E;IAC9E,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAIlD,8EAA8E;YAChE,aAAa;IA4B3B;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAoBxC,iGAAiG;IACjG,OAAO,CAAC,WAAW;IAgEnB,mFAAmF;IACnF,OAAO,CAAC,SAAS;CAKlB;AAyID,eAAe,mBAAmB,CAAA"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Wire contracts for `@deepseek-ai/dsh-interconnect`.
|
|
3
|
-
* The transport
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* The transport is WebSocket-only: `LinkFrame`, `QueryMessage`, and `LinkMessage`
|
|
4
|
+
* define the whole wire shape exchanged over the `/interconnect/link` upgrade
|
|
5
|
+
* (see `index.ts`); this module defines those frames plus the business payloads
|
|
6
|
+
* that ride inside them. No Host RPC envelope is involved.
|
|
6
7
|
* @module @deepseek-ai/dsh-interconnect
|
|
7
8
|
*/
|
|
8
9
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/interconnect/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/interconnect/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-interconnect",
|
|
3
3
|
"description": "Cross-instance message/event handoff plugins for DeepSeek Harness (DSH): interconnect service + model-facing tools + companion skill",
|
|
4
|
-
"version": "0.10.
|
|
4
|
+
"version": "0.10.1",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "lib/index.js",
|
|
@@ -51,12 +51,10 @@
|
|
|
51
51
|
"peerDependencies": {
|
|
52
52
|
"@deepseek-ai/cordis": "*",
|
|
53
53
|
"@deepseek-ai/dsh-agent": "*",
|
|
54
|
-
"@deepseek-ai/dsh-api-remotes": "*",
|
|
55
54
|
"@deepseek-ai/dsh-credentials": "*",
|
|
56
55
|
"@deepseek-ai/dsh-llm": "*",
|
|
57
56
|
"@deepseek-ai/dsh-session": "*",
|
|
58
57
|
"@deepseek-ai/dsh-subagent": "*",
|
|
59
|
-
"@deepseek-ai/dsh-host-apiproxy": "*",
|
|
60
58
|
"@deepseek-ai/dsh-host-webserver": "*",
|
|
61
59
|
"@deepseek-ai/dsh-tools": "*",
|
|
62
60
|
"@deepseek-ai/dsh-skill": "*",
|
|
@@ -68,12 +66,10 @@
|
|
|
68
66
|
"@deepseek-ai/cordis": "link:../dsh/vendor/cordis",
|
|
69
67
|
"@deepseek-ai/schemastery": "link:../dsh/vendor/schemastery",
|
|
70
68
|
"@deepseek-ai/dsh-agent": "link:../dsh/packages/core/agent",
|
|
71
|
-
"@deepseek-ai/dsh-api-remotes": "link:../dsh/packages/api/remotes",
|
|
72
69
|
"@deepseek-ai/dsh-credentials": "link:../dsh/packages/credentials/credentials",
|
|
73
70
|
"@deepseek-ai/dsh-llm": "link:../dsh/packages/llm/llm",
|
|
74
71
|
"@deepseek-ai/dsh-session": "link:../dsh/packages/core/session",
|
|
75
72
|
"@deepseek-ai/dsh-subagent": "link:../dsh/packages/subagent/subagent",
|
|
76
|
-
"@deepseek-ai/dsh-host-apiproxy": "link:../dsh/packages/host/apiproxy",
|
|
77
73
|
"@deepseek-ai/dsh-host-webserver": "link:../dsh/packages/host/webserver",
|
|
78
74
|
"@deepseek-ai/dsh-tools": "link:../dsh/packages/core/tools",
|
|
79
75
|
"@deepseek-ai/dsh-skill": "link:../dsh/packages/skill/skill",
|