@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.
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +18 -3
- package/dist/session-store.d.ts +5 -0
- package/dist/session-store.d.ts.map +1 -1
- package/dist/session-store.js +62 -2
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +13 -5
package/dist/protocol.d.ts.map
CHANGED
|
@@ -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,
|
|
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);
|
package/dist/session-store.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/session-store.js
CHANGED
|
@@ -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
|
}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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.
|
|
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": [
|
|
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": [
|
|
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.
|
|
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.
|
|
43
|
+
"@sandbank.dev/core": "^0.3.5"
|
|
36
44
|
}
|
|
37
45
|
}
|