@sandbank.dev/relay 0.1.1 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzE,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,YAAY,CAAA;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,0BAA0B;AAC1B,wBAAgB,SAAS,CACvB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAA;CAAE,GACxF,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAmC5C;AAED,wBAAwB;AACxB,wBAAgB,UAAU,CACxB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,eAAe,GACxB,eAAe,CA6CjB"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzE,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,YAAY,CAAA;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,0BAA0B;AAC1B,wBAAgB,SAAS,CACvB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAA;CAAE,GACxF,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAsC5C;AAED,wBAAwB;AACxB,wBAAgB,UAAU,CACxB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,eAAe,GACxB,eAAe,CA6CjB"}
package/dist/protocol.js CHANGED
@@ -5,12 +5,14 @@ export function handleRpc(store, request, client) {
5
5
  switch (method) {
6
6
  case 'session.register':
7
7
  return handleRegister(store, id, client.sessionId, p);
8
+ case 'session.unregister':
9
+ return handleUnregister(store, id, client.sessionId, p);
8
10
  case 'message.send':
9
11
  return handleSend(store, id, client.sessionId, client.sandboxName, p);
10
12
  case 'message.broadcast':
11
13
  return handleBroadcast(store, id, client.sessionId, client.sandboxName, p);
12
14
  case 'message.recv':
13
- return handleRecv(store, id, client.sessionId, client.sandboxName, p);
15
+ return handleRecv(store, id, client.sessionId, client.sandboxName, client.role, p);
14
16
  case 'context.get':
15
17
  return handleContextGet(store, id, client.sessionId, p);
16
18
  case 'context.set':
@@ -80,6 +82,14 @@ function handleRegister(store, id, sessionId, params) {
80
82
  return rpcError(id, -32000, e.message);
81
83
  }
82
84
  }
85
+ function handleUnregister(store, id, sessionId, params) {
86
+ const name = params['name'];
87
+ if (!name) {
88
+ return rpcError(id, -32602, 'Missing name');
89
+ }
90
+ store.unregisterSandbox(sessionId, name);
91
+ return rpcResult(id, { ok: true });
92
+ }
83
93
  function handleSend(store, id, sessionId, fromName, params) {
84
94
  const session = store.getSession(sessionId);
85
95
  if (!session)
@@ -123,13 +133,18 @@ function handleBroadcast(store, id, sessionId, fromName, params) {
123
133
  store.broadcastMessage(session, msg, fromName ?? '');
124
134
  return rpcResult(id, { ok: true });
125
135
  }
126
- function handleRecv(store, id, sessionId, sandboxName, params) {
136
+ function handleRecv(store, id, sessionId, sandboxName, role, params) {
127
137
  const session = store.getSession(sessionId);
128
138
  if (!session)
129
139
  return rpcError(id, -32000, 'Session not found');
140
+ const limit = params['limit'] ?? 100;
141
+ // Orchestrator pull — 从 durable queue 拉取消息
142
+ if (!sandboxName && role === 'orchestrator') {
143
+ const msgs = store.drainOrchestratorQueue(session, limit);
144
+ return rpcResult(id, { messages: msgs });
145
+ }
130
146
  if (!sandboxName)
131
147
  return rpcError(id, -32602, 'No sandbox name — cannot recv');
132
- const limit = params['limit'] ?? 100;
133
148
  const wait = params['wait'] ?? 0;
134
149
  if (wait <= 0) {
135
150
  const msgs = store.drainQueue(session, sandboxName, limit);
@@ -7,6 +7,7 @@ export declare class SessionStore {
7
7
  readonly sessionTtlMs: number;
8
8
  readonly maxSessions: number;
9
9
  readonly maxQueueSize: number;
10
+ readonly maxSandboxesPerSession: number;
10
11
  constructor(options?: SessionStoreOptions);
11
12
  /** 停止清扫定时器(用于优雅关闭) */
12
13
  dispose(): void;
@@ -22,6 +23,8 @@ export declare class SessionStore {
22
23
  deleteSession(id: string): void;
23
24
  /** 清扫过期且无活跃连接的 session */
24
25
  sweep(): number;
26
+ /** 注销沙箱(幂等:session/sandbox 不存在不报错) */
27
+ unregisterSandbox(sessionId: string, name: string): void;
25
28
  /** 注册沙箱名 */
26
29
  registerSandbox(sessionId: string, name: string, sandboxId: string): void;
27
30
  /** 发送消息到指定沙箱的队列 */
@@ -34,6 +37,8 @@ export declare class SessionStore {
34
37
  waitForMessages(session: RelaySession, sandboxName: string, waitMs: number, limit: number): Promise<QueuedMessage[]>;
35
38
  /** 标记沙箱完成 */
36
39
  completeSandbox(session: RelaySession, sandboxName: string, status: string, summary: string): void;
40
+ /** 清空 orchestrator 队列(供 orchestrator pull 使用) */
41
+ drainOrchestratorQueue(session: RelaySession, limit?: number): QueuedMessage[];
37
42
  private pushToWebSocketClient;
38
43
  private pushToOrchestrator;
39
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAgB,aAAa,EAAmB,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAOjH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,UAAU,CAA8C;IAEhE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;gBAEjB,OAAO,GAAE,mBAAwB;IAY7C,sBAAsB;IACtB,OAAO,IAAI,IAAI;IAOf,sBAAsB;IACtB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY;IA2BvD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIhD,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY;IAI5D,yBAAyB;IACzB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAIlC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAQxD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI7D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAqB/B,0BAA0B;IAC1B,KAAK,IAAI,MAAM;IAqBf,YAAY;IACZ,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAWzE,mBAAmB;IACnB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI;IAoC3E,gBAAgB;IAChB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAYxF,sBAAsB;IACtB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,aAAa,EAAE;IAoBpF,0BAA0B;IAC1B,eAAe,CACb,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,EAAE,CAAC;IA+B3B,aAAa;IACb,eAAe,CACb,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,IAAI;IA+BP,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,kBAAkB;CAY3B"}
1
+ {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAgB,aAAa,EAAmB,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAQjH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,UAAU,CAA8C;IAEhE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAA;gBAE3B,OAAO,GAAE,mBAAwB;IAa7C,sBAAsB;IACtB,OAAO,IAAI,IAAI;IAOf,sBAAsB;IACtB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY;IA4BvD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIhD,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY;IAI5D,yBAAyB;IACzB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAIlC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAQxD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAI7D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAqB/B,0BAA0B;IAC1B,KAAK,IAAI,MAAM;IAqBf,sCAAsC;IACtC,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IA2BxD,YAAY;IACZ,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAczE,mBAAmB;IACnB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI;IAwC3E,gBAAgB;IAChB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAYxF,sBAAsB;IACtB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,aAAa,EAAE;IAoBpF,0BAA0B;IAC1B,eAAe,CACb,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,EAAE,CAAC;IA+B3B,aAAa;IACb,eAAe,CACb,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,IAAI;IA+BP,iDAAiD;IACjD,sBAAsB,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,SAAM,GAAG,aAAa,EAAE;IAM3E,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,kBAAkB;CA2B3B"}
@@ -3,6 +3,7 @@ import { ContextStoreServer } from './context-store.js';
3
3
  const DEFAULT_SESSION_TTL_MS = 30 * 60 * 1000; // 30 minutes
4
4
  const DEFAULT_MAX_SESSIONS = 1000;
5
5
  const DEFAULT_MAX_QUEUE_SIZE = 10_000;
6
+ const DEFAULT_MAX_SANDBOXES_PER_SESSION = 100;
6
7
  const DEFAULT_SWEEP_INTERVAL_MS = 60 * 1000; // 60 seconds
7
8
  export class SessionStore {
8
9
  sessions = new Map();
@@ -11,10 +12,12 @@ export class SessionStore {
11
12
  sessionTtlMs;
12
13
  maxSessions;
13
14
  maxQueueSize;
15
+ maxSandboxesPerSession;
14
16
  constructor(options = {}) {
15
17
  this.sessionTtlMs = options.sessionTtlMs ?? DEFAULT_SESSION_TTL_MS;
16
18
  this.maxSessions = options.maxSessions ?? DEFAULT_MAX_SESSIONS;
17
19
  this.maxQueueSize = options.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE;
20
+ this.maxSandboxesPerSession = options.maxSandboxesPerSession ?? DEFAULT_MAX_SANDBOXES_PER_SESSION;
18
21
  const sweepInterval = options.sweepIntervalMs ?? DEFAULT_SWEEP_INTERVAL_MS;
19
22
  if (this.sessionTtlMs > 0) {
20
23
  this.sweepTimer = setInterval(() => this.sweep(), sweepInterval);
@@ -50,6 +53,7 @@ export class SessionStore {
50
53
  clients: new Set(),
51
54
  messageQueues: new Map(),
52
55
  pollWaiters: new Map(),
56
+ orchestratorQueue: [],
53
57
  createdAt: now,
54
58
  lastActivityAt: now,
55
59
  };
@@ -117,6 +121,30 @@ export class SessionStore {
117
121
  }
118
122
  return evicted;
119
123
  }
124
+ /** 注销沙箱(幂等:session/sandbox 不存在不报错) */
125
+ unregisterSandbox(sessionId, name) {
126
+ const session = this.getSession(sessionId);
127
+ if (!session)
128
+ return;
129
+ session.sandboxes.delete(name);
130
+ session.messageQueues.delete(name);
131
+ // 清理 poll waiters(resolve 空数组让客户端正常退出)
132
+ const waiters = session.pollWaiters.get(name);
133
+ if (waiters) {
134
+ for (const w of waiters) {
135
+ clearTimeout(w.timer);
136
+ w.resolve([]);
137
+ }
138
+ session.pollWaiters.delete(name);
139
+ }
140
+ // 断开该 sandbox 的 WebSocket 客户端
141
+ for (const client of session.clients) {
142
+ if (client.sandboxName === name && client.ws.readyState === client.ws.OPEN) {
143
+ client.ws.close(1000, 'sandbox unregistered');
144
+ }
145
+ }
146
+ this.touch(session);
147
+ }
120
148
  /** 注册沙箱名 */
121
149
  registerSandbox(sessionId, name, sandboxId) {
122
150
  const session = this.getSession(sessionId);
@@ -126,6 +154,9 @@ export class SessionStore {
126
154
  throw new Error('Reserved name: orchestrator');
127
155
  if (session.sandboxes.has(name))
128
156
  throw new Error(`Sandbox already registered: ${name}`);
157
+ if (session.sandboxes.size >= this.maxSandboxesPerSession) {
158
+ throw new Error(`Max sandboxes per session reached (${this.maxSandboxesPerSession})`);
159
+ }
129
160
  this.touch(session);
130
161
  session.sandboxes.set(name, { name, sandboxId, state: 'running' });
131
162
  session.messageQueues.set(name, []);
@@ -160,8 +191,13 @@ export class SessionStore {
160
191
  waiter.resolve(msgs);
161
192
  return;
162
193
  }
163
- // WebSocket 实时推送
164
- this.pushToWebSocketClient(session, to, msg);
194
+ // WebSocket 实时推送 — 成功后从队列移除,避免后续 poll 重复拿到
195
+ const pushed = this.pushToWebSocketClient(session, to, msg);
196
+ if (pushed) {
197
+ const idx = queue.indexOf(msg);
198
+ if (idx >= 0)
199
+ queue.splice(idx, 1);
200
+ }
165
201
  }
166
202
  /** 广播消息到所有沙箱 */
167
203
  broadcastMessage(session, msg, excludeSender) {
@@ -255,28 +291,52 @@ export class SessionStore {
255
291
  }
256
292
  }
257
293
  }
294
+ /** 清空 orchestrator 队列(供 orchestrator pull 使用) */
295
+ drainOrchestratorQueue(session, limit = 100) {
296
+ const msgs = session.orchestratorQueue.splice(0, limit);
297
+ if (msgs.length > 0)
298
+ this.touch(session);
299
+ return msgs;
300
+ }
258
301
  pushToWebSocketClient(session, targetName, msg) {
259
302
  const notification = JSON.stringify({
260
303
  jsonrpc: '2.0',
261
304
  method: 'message',
262
305
  params: msg,
263
306
  });
307
+ let sent = false;
264
308
  for (const client of session.clients) {
265
309
  if (client.sandboxName === targetName && client.ws.readyState === client.ws.OPEN) {
266
310
  client.ws.send(notification);
311
+ sent = true;
267
312
  }
268
313
  }
314
+ return sent;
269
315
  }
270
316
  pushToOrchestrator(session, msg) {
317
+ // 先入队(durable queue — 断连时不丢消息)
318
+ session.orchestratorQueue.push(msg);
319
+ if (session.orchestratorQueue.length > this.maxQueueSize) {
320
+ session.orchestratorQueue.shift();
321
+ }
322
+ // 尝试实时推送
271
323
  const notification = JSON.stringify({
272
324
  jsonrpc: '2.0',
273
325
  method: 'message',
274
326
  params: msg,
275
327
  });
328
+ let sent = false;
276
329
  for (const client of session.clients) {
277
330
  if (client.role === 'orchestrator' && client.ws.readyState === client.ws.OPEN) {
278
331
  client.ws.send(notification);
332
+ sent = true;
279
333
  }
280
334
  }
335
+ // 推送成功则从队列移除
336
+ if (sent) {
337
+ const idx = session.orchestratorQueue.indexOf(msg);
338
+ if (idx >= 0)
339
+ session.orchestratorQueue.splice(idx, 1);
340
+ }
281
341
  }
282
342
  }
package/dist/types.d.ts CHANGED
@@ -39,6 +39,8 @@ export interface RelaySession {
39
39
  resolve: (msgs: QueuedMessage[]) => void;
40
40
  timer: ReturnType<typeof setTimeout>;
41
41
  }>>;
42
+ /** Orchestrator 的 durable message queue(断连时保留消息) */
43
+ orchestratorQueue: QueuedMessage[];
42
44
  createdAt: number;
43
45
  lastActivityAt: number;
44
46
  }
@@ -50,6 +52,8 @@ export interface SessionStoreOptions {
50
52
  maxSessions?: number;
51
53
  /** 每个沙箱的最大消息队列长度,默认 10000 */
52
54
  maxQueueSize?: number;
55
+ /** 每个 session 最大沙箱数,默认 100 */
56
+ maxSandboxesPerSession?: number;
53
57
  /** 清扫间隔(毫秒),默认 60 秒 */
54
58
  sweepIntervalMs?: number;
55
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAEnC,sBAAsB;AACtB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,SAAS,GAAG,WAAW,CAAA;IAC9B,UAAU,CAAC,EAAE;QACX,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;AAED,gBAAgB;AAChB,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,SAAS,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,IAAI,EAAE,cAAc,GAAG,OAAO,CAAA;CAC/B;AAED,eAAe;AACf,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,iBAAiB;AACjB,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACpC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,EAAE,GAAG,CAAC,eAAe,CAAC,CAAA;IAC7B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAA;IAC3C,kDAAkD;IAClD,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;QAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,IAAI,CAAA;QACxC,KAAK,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;KACrC,CAAC,CAAC,CAAA;IACH,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,wBAAwB;AACxB,MAAM,WAAW,mBAAmB;IAClC,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,uBAAuB;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAEnC,sBAAsB;AACtB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,SAAS,GAAG,WAAW,CAAA;IAC9B,UAAU,CAAC,EAAE;QACX,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;AAED,gBAAgB;AAChB,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,SAAS,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,IAAI,EAAE,cAAc,GAAG,OAAO,CAAA;CAC/B;AAED,eAAe;AACf,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,iBAAiB;AACjB,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACpC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,EAAE,GAAG,CAAC,eAAe,CAAC,CAAA;IAC7B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAA;IAC3C,kDAAkD;IAClD,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;QAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,IAAI,CAAA;QACxC,KAAK,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;KACrC,CAAC,CAAC,CAAA;IACH,oDAAoD;IACpD,iBAAiB,EAAE,aAAa,EAAE,CAAA;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,wBAAwB;AACxB,MAAM,WAAW,mBAAmB;IAClC,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8BAA8B;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,uBAAuB;IACvB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sandbank.dev/relay",
3
- "version": "0.1.1",
3
+ "version": "0.2.1",
4
4
  "description": "WebSocket relay server for multi-agent communication in Sandbank",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -10,14 +10,22 @@
10
10
  "url": "https://github.com/chekusu/sandbank.git",
11
11
  "directory": "packages/relay"
12
12
  },
13
- "keywords": ["sandbox", "ai-agent", "relay", "websocket", "multi-agent"],
13
+ "keywords": [
14
+ "sandbox",
15
+ "ai-agent",
16
+ "relay",
17
+ "websocket",
18
+ "multi-agent"
19
+ ],
14
20
  "exports": {
15
21
  ".": {
16
22
  "types": "./dist/index.d.ts",
17
23
  "import": "./dist/index.js"
18
24
  }
19
25
  },
20
- "files": ["dist"],
26
+ "files": [
27
+ "dist"
28
+ ],
21
29
  "scripts": {
22
30
  "build": "tsc",
23
31
  "typecheck": "tsc --noEmit",
@@ -27,11 +35,11 @@
27
35
  "ws": "^8.18.0"
28
36
  },
29
37
  "devDependencies": {
30
- "@sandbank.dev/core": "^0.1.1",
38
+ "@sandbank.dev/core": "^0.3.5",
31
39
  "@types/ws": "^8.18.0",
32
40
  "typescript": "^5.7.3"
33
41
  },
34
42
  "peerDependencies": {
35
- "@sandbank.dev/core": "^0.1.1"
43
+ "@sandbank.dev/core": "^0.3.5"
36
44
  }
37
45
  }