@cecwxf/dsh-room 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -2
- package/cordis.patch.yml +12 -0
- package/dist/client.js +3015 -0
- package/dist/index.js +3434 -0
- package/dist/types/adapter.d.ts +161 -0
- package/dist/types/adapter.d.ts.map +1 -0
- package/dist/types/approval-queue.d.ts +31 -0
- package/dist/types/approval-queue.d.ts.map +1 -0
- package/dist/types/command-handler.d.ts +5 -0
- package/dist/types/command-handler.d.ts.map +1 -0
- package/dist/types/commands.d.ts +55 -0
- package/dist/types/commands.d.ts.map +1 -0
- package/dist/types/config.d.ts +22 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/http.d.ts +22 -0
- package/dist/types/http.d.ts.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/mcp-workspace.d.ts +23 -0
- package/dist/types/mcp-workspace.d.ts.map +1 -0
- package/dist/types/member-config.d.ts +55 -0
- package/dist/types/member-config.d.ts.map +1 -0
- package/dist/types/plugin.d.ts +336 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/state.d.ts +48 -0
- package/dist/types/state.d.ts.map +1 -0
- package/package.json +76 -4
- package/scripts/ensure-dist.mjs +22 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { DirectoryClient, type CollabPayload, type Identity } from "@collab/protocol";
|
|
2
|
+
import { CollabClient } from "@collab/sdk";
|
|
3
|
+
import { ApprovalQueue } from "./approval-queue.js";
|
|
4
|
+
import { publicMemberConfig, type RoomMemberConfig } from "./member-config.js";
|
|
5
|
+
import type { AgentLike, DshCollabConfig, HostContext, ToolDefinition } from "./adapter.js";
|
|
6
|
+
import { type RoomMeta, type WorkspaceMeta } from "./state.js";
|
|
7
|
+
export declare function describePayload(p: CollabPayload): string;
|
|
8
|
+
/** UI/transcript view of one decrypted room payload. */
|
|
9
|
+
export interface RoomMessage {
|
|
10
|
+
id: string;
|
|
11
|
+
seq?: number;
|
|
12
|
+
from: string;
|
|
13
|
+
self: boolean;
|
|
14
|
+
kind: CollabPayload["kind"];
|
|
15
|
+
text: string;
|
|
16
|
+
ts: number;
|
|
17
|
+
mentions?: string[];
|
|
18
|
+
replyTo?: string;
|
|
19
|
+
taskId?: string;
|
|
20
|
+
title?: string;
|
|
21
|
+
status?: string;
|
|
22
|
+
assignee?: string;
|
|
23
|
+
}
|
|
24
|
+
export type RoomStatus = "connecting" | "online" | "offline";
|
|
25
|
+
export interface RoomView extends Omit<RoomMeta, "invite" | "sessionId" | "memberConfig"> {
|
|
26
|
+
status: RoomStatus;
|
|
27
|
+
error?: string;
|
|
28
|
+
members: {
|
|
29
|
+
agentId: string;
|
|
30
|
+
self: boolean;
|
|
31
|
+
online?: boolean;
|
|
32
|
+
}[];
|
|
33
|
+
last?: {
|
|
34
|
+
from: string;
|
|
35
|
+
text: string;
|
|
36
|
+
ts: number;
|
|
37
|
+
};
|
|
38
|
+
sessionTitle: string;
|
|
39
|
+
bound: boolean;
|
|
40
|
+
transport?: "relay" | "lan";
|
|
41
|
+
/** Public member config (no secrets / no absolute path). */
|
|
42
|
+
memberConfig?: (ReturnType<typeof publicMemberConfig> & {
|
|
43
|
+
workspacePath?: string;
|
|
44
|
+
peerGrants?: RoomMemberConfig["peerGrants"];
|
|
45
|
+
}) | null;
|
|
46
|
+
peerConfigs?: Record<string, ReturnType<typeof publicMemberConfig>>;
|
|
47
|
+
}
|
|
48
|
+
export interface BridgeEvent {
|
|
49
|
+
type: "rooms" | "message";
|
|
50
|
+
roomId?: string;
|
|
51
|
+
message?: RoomMessage;
|
|
52
|
+
}
|
|
53
|
+
/** One live room: connection, decrypted message log, wake bookkeeping. */
|
|
54
|
+
declare class RoomConn {
|
|
55
|
+
meta: RoomMeta;
|
|
56
|
+
client: CollabClient | null;
|
|
57
|
+
status: RoomStatus;
|
|
58
|
+
error?: string;
|
|
59
|
+
messages: RoomMessage[];
|
|
60
|
+
private ids;
|
|
61
|
+
wakeTimes: number[];
|
|
62
|
+
heartbeat?: ReturnType<typeof setInterval>;
|
|
63
|
+
/** agentId → last time we saw them in a peer_update / joined list (ms). Grace keeps UI "online" across reconnect blips. */
|
|
64
|
+
lastSeenPeers: Map<string, number>;
|
|
65
|
+
presenceTimer?: ReturnType<typeof setInterval>;
|
|
66
|
+
constructor(meta: RoomMeta);
|
|
67
|
+
add(m: RoomMessage): boolean;
|
|
68
|
+
transcript(n?: number): string;
|
|
69
|
+
}
|
|
70
|
+
export interface CreateRoomOptions {
|
|
71
|
+
name?: string;
|
|
72
|
+
description?: string;
|
|
73
|
+
tags?: string[] | string;
|
|
74
|
+
public?: boolean;
|
|
75
|
+
/** Dual transport: default LAN/VPS. LAN uses DEFAULT_LAN_HOST_PORT or embedded lan-relay when host blank. */
|
|
76
|
+
mode?: "relay" | "lan";
|
|
77
|
+
/** For LAN: host:port (default VPS). Omit/blank with mode=lan from UI embedded path uses ensureLanRelay. */
|
|
78
|
+
lanHostPort?: string;
|
|
79
|
+
/** Workspace that owns this room (defaults to active). */
|
|
80
|
+
workspaceId?: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The live collab bridge: any number of joined rooms (each one-to-many, E2EE),
|
|
84
|
+
* persisted in ~/.collab/state.json; model-facing tools; the room → Session wake path;
|
|
85
|
+
* an optional public directory listing per owned room.
|
|
86
|
+
*/
|
|
87
|
+
export declare class CollabBridge {
|
|
88
|
+
private ctx;
|
|
89
|
+
readonly config: DshCollabConfig;
|
|
90
|
+
identity: Identity | null;
|
|
91
|
+
rooms: Map<string, RoomConn>;
|
|
92
|
+
workspaces: Map<string, WorkspaceMeta>;
|
|
93
|
+
activeWorkspaceId: string | null;
|
|
94
|
+
activeRoomId: string | null;
|
|
95
|
+
private sessions;
|
|
96
|
+
private listeners;
|
|
97
|
+
private disposed;
|
|
98
|
+
private abort;
|
|
99
|
+
readonly directory: DirectoryClient;
|
|
100
|
+
private ready;
|
|
101
|
+
readonly approvals: ApprovalQueue;
|
|
102
|
+
/** peer agentId → last announced public member config */
|
|
103
|
+
peerConfigs: Map<string, Map<string, {
|
|
104
|
+
model: string | undefined;
|
|
105
|
+
provider: string | undefined;
|
|
106
|
+
reasoningEffort: import("./member-config.js").ReasoningEffort | undefined;
|
|
107
|
+
workspaceLabel: string;
|
|
108
|
+
permissions: {
|
|
109
|
+
autoRead: boolean;
|
|
110
|
+
autoWrite: boolean;
|
|
111
|
+
autoShell: boolean;
|
|
112
|
+
autoNetwork: boolean;
|
|
113
|
+
};
|
|
114
|
+
mcpEnabled: boolean;
|
|
115
|
+
mcpTools: ("workspace_list" | "workspace_read" | "workspace_stat" | "workspace_search" | "workspace_write" | "workspace_mkdir" | "workspace_delete" | "workspace_exec")[];
|
|
116
|
+
peerGrantsDefault: import("./member-config.js").PeerCapabilityGrants;
|
|
117
|
+
}>>;
|
|
118
|
+
private lanRelay;
|
|
119
|
+
private mcpByRoom;
|
|
120
|
+
constructor(ctx: HostContext, config: DshCollabConfig, fetchImpl?: typeof fetch);
|
|
121
|
+
log(level: "info" | "warn" | "error", ...a: unknown[]): void;
|
|
122
|
+
subscribe(fn: (e: BridgeEvent) => void): () => void;
|
|
123
|
+
private emit;
|
|
124
|
+
self(): Promise<Identity>;
|
|
125
|
+
/** Load ~/.collab/state.json (+ a legacy `invite` from config) and reconnect every room. */
|
|
126
|
+
start(): Promise<void>;
|
|
127
|
+
persist(): Promise<void>;
|
|
128
|
+
private open;
|
|
129
|
+
private connect;
|
|
130
|
+
listWorkspaces(): WorkspaceMeta[];
|
|
131
|
+
ensureWorkspace(opts: {
|
|
132
|
+
name?: string;
|
|
133
|
+
path?: string;
|
|
134
|
+
id?: string;
|
|
135
|
+
}): Promise<WorkspaceMeta>;
|
|
136
|
+
setActiveWorkspace(id: string): WorkspaceMeta;
|
|
137
|
+
removeWorkspace(id: string): Promise<{
|
|
138
|
+
ok: boolean;
|
|
139
|
+
}>;
|
|
140
|
+
/** Ensure embedded LAN relay is listening; returns host:port for invites. */
|
|
141
|
+
ensureLanRelay(): Promise<string>;
|
|
142
|
+
browseLan(timeoutMs?: number): Promise<import("@collab/lan-relay").LanPeer[]>;
|
|
143
|
+
/** Create a room (private unless opts.public) and join it. */
|
|
144
|
+
createRoom(opts?: CreateRoomOptions, bindTo?: AgentLike): Promise<{
|
|
145
|
+
invite: string;
|
|
146
|
+
listed: boolean;
|
|
147
|
+
transport: string;
|
|
148
|
+
status: RoomStatus;
|
|
149
|
+
error?: string;
|
|
150
|
+
members: {
|
|
151
|
+
agentId: string;
|
|
152
|
+
self: boolean;
|
|
153
|
+
online?: boolean;
|
|
154
|
+
}[];
|
|
155
|
+
last?: {
|
|
156
|
+
from: string;
|
|
157
|
+
text: string;
|
|
158
|
+
ts: number;
|
|
159
|
+
};
|
|
160
|
+
sessionTitle: string;
|
|
161
|
+
bound: boolean;
|
|
162
|
+
/** Public member config (no secrets / no absolute path). */
|
|
163
|
+
memberConfig?: (ReturnType<typeof publicMemberConfig> & {
|
|
164
|
+
workspacePath?: string;
|
|
165
|
+
peerGrants?: RoomMemberConfig["peerGrants"];
|
|
166
|
+
}) | null;
|
|
167
|
+
peerConfigs?: Record<string, ReturnType<typeof publicMemberConfig>>;
|
|
168
|
+
roomId: string;
|
|
169
|
+
public: boolean;
|
|
170
|
+
name: string;
|
|
171
|
+
description: string;
|
|
172
|
+
tags: string[];
|
|
173
|
+
owner: boolean;
|
|
174
|
+
joinedAt: number;
|
|
175
|
+
workspaceId?: string | undefined;
|
|
176
|
+
}>;
|
|
177
|
+
/** Join by invite. `info` carries directory metadata when joining from search results. */
|
|
178
|
+
joinInvite(invite: string, info?: Partial<Pick<RoomMeta, "name" | "description" | "tags" | "public" | "workspaceId">>, bindTo?: AgentLike): Promise<{
|
|
179
|
+
invite: string;
|
|
180
|
+
status: RoomStatus;
|
|
181
|
+
error?: string;
|
|
182
|
+
members: {
|
|
183
|
+
agentId: string;
|
|
184
|
+
self: boolean;
|
|
185
|
+
online?: boolean;
|
|
186
|
+
}[];
|
|
187
|
+
last?: {
|
|
188
|
+
from: string;
|
|
189
|
+
text: string;
|
|
190
|
+
ts: number;
|
|
191
|
+
};
|
|
192
|
+
sessionTitle: string;
|
|
193
|
+
bound: boolean;
|
|
194
|
+
transport?: "relay" | "lan";
|
|
195
|
+
/** Public member config (no secrets / no absolute path). */
|
|
196
|
+
memberConfig?: (ReturnType<typeof publicMemberConfig> & {
|
|
197
|
+
workspacePath?: string;
|
|
198
|
+
peerGrants?: RoomMemberConfig["peerGrants"];
|
|
199
|
+
}) | null;
|
|
200
|
+
peerConfigs?: Record<string, ReturnType<typeof publicMemberConfig>>;
|
|
201
|
+
roomId: string;
|
|
202
|
+
public: boolean;
|
|
203
|
+
name: string;
|
|
204
|
+
description: string;
|
|
205
|
+
tags: string[];
|
|
206
|
+
owner: boolean;
|
|
207
|
+
joinedAt: number;
|
|
208
|
+
workspaceId?: string | undefined;
|
|
209
|
+
}>;
|
|
210
|
+
leave(roomId: string): Promise<{
|
|
211
|
+
ok: boolean;
|
|
212
|
+
left: boolean;
|
|
213
|
+
}>;
|
|
214
|
+
/** Room by id, else the active one. */
|
|
215
|
+
room(roomId?: string): RoomConn;
|
|
216
|
+
private live;
|
|
217
|
+
setActive(roomId: string): void;
|
|
218
|
+
private publishLocal;
|
|
219
|
+
send(roomId: string | undefined, textIn: string, mentions?: string[], replyTo?: string): Promise<{
|
|
220
|
+
messageId: string;
|
|
221
|
+
seq: number;
|
|
222
|
+
roomId: string;
|
|
223
|
+
}>;
|
|
224
|
+
sendStatus(roomId: string | undefined, t: string): Promise<{
|
|
225
|
+
messageId: string;
|
|
226
|
+
seq: number;
|
|
227
|
+
roomId: string;
|
|
228
|
+
}>;
|
|
229
|
+
createTask(roomId: string | undefined, title: string, body?: string, assignee?: string): Promise<{
|
|
230
|
+
messageId: string;
|
|
231
|
+
seq: number;
|
|
232
|
+
roomId: string;
|
|
233
|
+
taskId: string;
|
|
234
|
+
}>;
|
|
235
|
+
claimTask(roomId: string | undefined, taskId: string): Promise<{
|
|
236
|
+
messageId: string;
|
|
237
|
+
seq: number;
|
|
238
|
+
roomId: string;
|
|
239
|
+
}>;
|
|
240
|
+
updateTask(roomId: string | undefined, taskId: string, status: string, note?: string): Promise<{
|
|
241
|
+
messageId: string;
|
|
242
|
+
seq: number;
|
|
243
|
+
roomId: string;
|
|
244
|
+
}>;
|
|
245
|
+
private publish;
|
|
246
|
+
private startHeartbeat;
|
|
247
|
+
search(q?: string, tag?: string): Promise<{
|
|
248
|
+
joined: boolean;
|
|
249
|
+
roomId: string;
|
|
250
|
+
name: string;
|
|
251
|
+
description: string;
|
|
252
|
+
tags: string[];
|
|
253
|
+
invite: string;
|
|
254
|
+
members: number;
|
|
255
|
+
ownerAgentId: string;
|
|
256
|
+
createdAt: number;
|
|
257
|
+
lastSeen: number;
|
|
258
|
+
}[]>;
|
|
259
|
+
view(conn: RoomConn): RoomView;
|
|
260
|
+
state(): {
|
|
261
|
+
self: string | null;
|
|
262
|
+
relayUrl: string;
|
|
263
|
+
lanRelayPort: number | null;
|
|
264
|
+
activeWorkspaceId: string | null;
|
|
265
|
+
activeRoomId: string | null;
|
|
266
|
+
workspaces: WorkspaceMeta[];
|
|
267
|
+
approvals: Omit<import("./approval-queue.js").PendingApproval, "resolve">[];
|
|
268
|
+
rooms: RoomView[];
|
|
269
|
+
};
|
|
270
|
+
announceMemberConfig(conn: RoomConn): Promise<void>;
|
|
271
|
+
updateMemberConfig(roomId: string, patch: Partial<RoomMemberConfig>): Promise<{
|
|
272
|
+
model: string | undefined;
|
|
273
|
+
provider: string | undefined;
|
|
274
|
+
reasoningEffort: import("./member-config.js").ReasoningEffort | undefined;
|
|
275
|
+
workspaceLabel: string;
|
|
276
|
+
permissions: {
|
|
277
|
+
autoRead: boolean;
|
|
278
|
+
autoWrite: boolean;
|
|
279
|
+
autoShell: boolean;
|
|
280
|
+
autoNetwork: boolean;
|
|
281
|
+
};
|
|
282
|
+
mcpEnabled: boolean;
|
|
283
|
+
mcpTools: ("workspace_list" | "workspace_read" | "workspace_stat" | "workspace_search" | "workspace_write" | "workspace_mkdir" | "workspace_delete" | "workspace_exec")[];
|
|
284
|
+
peerGrantsDefault: import("./member-config.js").PeerCapabilityGrants;
|
|
285
|
+
}>;
|
|
286
|
+
getMemberConfig(roomId: string): {
|
|
287
|
+
workspacePath: string;
|
|
288
|
+
peerGrants: {
|
|
289
|
+
default: import("./member-config.js").PeerCapabilityGrants;
|
|
290
|
+
byAgent?: Record<string, Partial<import("./member-config.js").PeerCapabilityGrants>>;
|
|
291
|
+
} | undefined;
|
|
292
|
+
model: string | undefined;
|
|
293
|
+
provider: string | undefined;
|
|
294
|
+
reasoningEffort: import("./member-config.js").ReasoningEffort | undefined;
|
|
295
|
+
workspaceLabel: string;
|
|
296
|
+
permissions: {
|
|
297
|
+
autoRead: boolean;
|
|
298
|
+
autoWrite: boolean;
|
|
299
|
+
autoShell: boolean;
|
|
300
|
+
autoNetwork: boolean;
|
|
301
|
+
};
|
|
302
|
+
mcpEnabled: boolean;
|
|
303
|
+
mcpTools: ("workspace_list" | "workspace_read" | "workspace_stat" | "workspace_search" | "workspace_write" | "workspace_mkdir" | "workspace_delete" | "workspace_exec")[];
|
|
304
|
+
peerGrantsDefault: import("./member-config.js").PeerCapabilityGrants;
|
|
305
|
+
};
|
|
306
|
+
decideApproval(requestId: string, decision: "allow" | "deny"): Promise<{
|
|
307
|
+
ok: boolean;
|
|
308
|
+
requestId: string;
|
|
309
|
+
decision: "allow" | "deny";
|
|
310
|
+
}>;
|
|
311
|
+
callLocalMcp(roomId: string, tool: string, args: Record<string, unknown>, from?: string): Promise<unknown>;
|
|
312
|
+
mcpCallPeer(roomId: string, target: string, tool: string, args: Record<string, unknown>): Promise<{
|
|
313
|
+
callId: string;
|
|
314
|
+
pending: boolean;
|
|
315
|
+
}>;
|
|
316
|
+
private handleMcpCall;
|
|
317
|
+
private onPayload;
|
|
318
|
+
/** Loop guard: replies do not wake (unless wakeOnReplies); at most maxWakesPerMinute per room. */
|
|
319
|
+
private passesLoopGuard;
|
|
320
|
+
private agentServices;
|
|
321
|
+
/** Bind a room to a live agent (the Session where /collab create|join ran). */
|
|
322
|
+
bind(conn: RoomConn, agent: AgentLike): void;
|
|
323
|
+
/** The bound live agent if its Session is open, without creating one. */
|
|
324
|
+
private boundAgent;
|
|
325
|
+
private notice;
|
|
326
|
+
/** Non-waking room traffic reaches the bound Session as pending context (agent.inject). */
|
|
327
|
+
private injectContext;
|
|
328
|
+
private buildPrompt;
|
|
329
|
+
private wake;
|
|
330
|
+
/** Same creation sequence as @deepseek-ai/dsh-webhook createWebhookSession. */
|
|
331
|
+
private sessionFor;
|
|
332
|
+
dispose(): Promise<void>;
|
|
333
|
+
tools(): ToolDefinition[];
|
|
334
|
+
}
|
|
335
|
+
export {};
|
|
336
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { RoomMemberConfig } from "./member-config.js";
|
|
2
|
+
/** A local workspace that owns one or more Collab rooms. */
|
|
3
|
+
export interface WorkspaceMeta {
|
|
4
|
+
id: string;
|
|
5
|
+
/** Display name */
|
|
6
|
+
name: string;
|
|
7
|
+
/** Absolute path on this machine (MCP sandbox / agent cwd). */
|
|
8
|
+
path: string;
|
|
9
|
+
createdAt: number;
|
|
10
|
+
}
|
|
11
|
+
/** One joined room. The invite carries the room key. */
|
|
12
|
+
export interface RoomMeta {
|
|
13
|
+
roomId: string;
|
|
14
|
+
invite: string;
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
tags: string[];
|
|
18
|
+
/** Listed in the relay's public directory (not confidential). */
|
|
19
|
+
public: boolean;
|
|
20
|
+
/** Created here: this identity signs the directory listing. */
|
|
21
|
+
owner: boolean;
|
|
22
|
+
/** dsh Session the room wakes (where /collab create|join ran, or the auto-created one). */
|
|
23
|
+
sessionId?: string;
|
|
24
|
+
joinedAt: number;
|
|
25
|
+
/** Dual transport: relay (CF) or lan (local relay). */
|
|
26
|
+
transport?: "relay" | "lan";
|
|
27
|
+
/** Per-room local agent config (model, workspace, permissions). Keys never stored. */
|
|
28
|
+
memberConfig?: RoomMemberConfig;
|
|
29
|
+
/** Workspace this room belongs to (required for new rooms). */
|
|
30
|
+
workspaceId?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Runtime room state written by the DSH Room UI and `/collab` so no cordis yml edit is needed.
|
|
34
|
+
* Invites carry room keys, so the file is always mode 600 inside a mode 700 dir.
|
|
35
|
+
*/
|
|
36
|
+
export interface RoomState {
|
|
37
|
+
version: 3;
|
|
38
|
+
activeWorkspaceId: string | null;
|
|
39
|
+
activeRoomId: string | null;
|
|
40
|
+
workspaces: WorkspaceMeta[];
|
|
41
|
+
rooms: RoomMeta[];
|
|
42
|
+
updatedAt?: string;
|
|
43
|
+
}
|
|
44
|
+
export declare function createWorkspaceMeta(name: string, path: string): WorkspaceMeta;
|
|
45
|
+
export declare function loadState(path: string): Promise<RoomState | null>;
|
|
46
|
+
export declare function saveState(path: string, state: RoomState): Promise<void>;
|
|
47
|
+
export declare function clearState(path: string): Promise<void>;
|
|
48
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wDAAwD;AACxD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,iEAAiE;IACjE,MAAM,EAAE,OAAO,CAAC;IAChB,+DAA+D;IAC/D,KAAK,EAAE,OAAO,CAAC;IACf,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,SAAS,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAC5B,sFAAsF;IACtF,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,CAAC,CAAC;IACX,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAO7E;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAmCvE;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB7E;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,78 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cecwxf/dsh-room",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "DSH Room — DeepSeek Harness plugin for accountless E2EE Collab rooms (sidebar: DSH Room)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "cecwxf",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"dsh-plugin",
|
|
10
|
+
"dsh",
|
|
11
|
+
"deepseek",
|
|
12
|
+
"deepseek-harness",
|
|
13
|
+
"collab",
|
|
14
|
+
"e2ee",
|
|
15
|
+
"agent"
|
|
16
|
+
],
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/cecwxf/collab.git",
|
|
20
|
+
"directory": "packages/dsh-room"
|
|
21
|
+
},
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/cecwxf/collab/issues"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://github.com/cecwxf/collab/tree/master/packages/dsh-room",
|
|
26
|
+
"main": "./dist/index.js",
|
|
27
|
+
"types": "./dist/types/index.d.ts",
|
|
28
|
+
"exports": {
|
|
29
|
+
".": {
|
|
30
|
+
"types": "./dist/types/index.d.ts",
|
|
31
|
+
"default": "./dist/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./client": "./dist/client.js",
|
|
34
|
+
"./package.json": "./package.json"
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"README.md",
|
|
38
|
+
"cordis.patch.yml",
|
|
39
|
+
"dist",
|
|
40
|
+
"scripts/ensure-dist.mjs"
|
|
41
|
+
],
|
|
42
|
+
"scripts": {
|
|
43
|
+
"build": "tsc -p tsconfig.json --emitDeclarationOnly --declaration --outDir dist/types && node build.mjs",
|
|
44
|
+
"prepare": "node scripts/ensure-dist.mjs",
|
|
45
|
+
"prepublishOnly": "npm run build",
|
|
46
|
+
"test": "npm run build && node --test test/*.test.mjs"
|
|
47
|
+
},
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"access": "public"
|
|
50
|
+
},
|
|
51
|
+
"dsh": {
|
|
52
|
+
"manifestVersion": 1,
|
|
53
|
+
"bundle": {
|
|
54
|
+
"patch": [
|
|
55
|
+
"./cordis.patch.yml"
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
"client": {
|
|
59
|
+
"platform": "web",
|
|
60
|
+
"inject": []
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"dependencies": {
|
|
64
|
+
"multicast-dns": "^7.2.5",
|
|
65
|
+
"ws": "^8.18.3"
|
|
66
|
+
},
|
|
67
|
+
"devDependencies": {
|
|
68
|
+
"@collab/lan-relay": "0.1.0",
|
|
69
|
+
"@collab/protocol": "0.1.0",
|
|
70
|
+
"@collab/sdk": "0.1.0",
|
|
71
|
+
"@types/node": "^22.18.0",
|
|
72
|
+
"esbuild": "^0.25.12",
|
|
73
|
+
"typescript": "^5.9.3"
|
|
74
|
+
},
|
|
75
|
+
"engines": {
|
|
76
|
+
"node": ">=22"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* prepare: use committed/prebuilt dist when present (npm/git install).
|
|
4
|
+
* Rebuild only when dist is missing and a compiler toolchain is available.
|
|
5
|
+
*/
|
|
6
|
+
import { accessSync } from "node:fs";
|
|
7
|
+
import { spawnSync } from "node:child_process";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import { dirname, join } from "node:path";
|
|
10
|
+
|
|
11
|
+
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
12
|
+
const distJs = join(root, "dist", "index.js");
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
accessSync(distJs);
|
|
16
|
+
process.exit(0);
|
|
17
|
+
} catch {
|
|
18
|
+
// fall through
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const r = spawnSync("npm", ["run", "build"], { cwd: root, stdio: "inherit", shell: true });
|
|
22
|
+
process.exit(r.status ?? 1);
|