@agentworkforce/delivery 4.1.13 → 4.1.14
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/delivery.d.ts +2 -2
- package/dist/delivery.d.ts.map +1 -1
- package/dist/delivery.js +44 -2
- package/dist/delivery.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/relaycast.d.ts +18 -0
- package/dist/relaycast.d.ts.map +1 -0
- package/dist/relaycast.js +72 -0
- package/dist/relaycast.js.map +1 -0
- package/dist/relaycast.test.d.ts +2 -0
- package/dist/relaycast.test.d.ts.map +1 -0
- package/dist/relaycast.test.js +71 -0
- package/dist/relaycast.test.js.map +1 -0
- package/dist/types.d.ts +40 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
package/dist/delivery.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { WorkforceCtx } from '@agentworkforce/runtime';
|
|
2
|
-
import { type DeliveryClient, type DeliveryTransports } from './types.js';
|
|
2
|
+
import { type DeliveryClient, type DeliveryProvider, type DeliveryTransports } from './types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Create a delivery client that auto-discovers configured transports from
|
|
5
5
|
* the persona context and sends to all of them.
|
|
@@ -18,5 +18,5 @@ import { type DeliveryClient, type DeliveryTransports } from './types.js';
|
|
|
18
18
|
*/
|
|
19
19
|
export declare function createDelivery(ctx: WorkforceCtx, transports?: DeliveryTransports,
|
|
20
20
|
/** Override which transports to target (defaults to all configured). */
|
|
21
|
-
onlyTargets?: ReadonlyArray<
|
|
21
|
+
onlyTargets?: ReadonlyArray<DeliveryProvider>): DeliveryClient;
|
|
22
22
|
//# sourceMappingURL=delivery.d.ts.map
|
package/dist/delivery.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAIL,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,gBAAgB,EAErB,KAAK,kBAAkB,EAKxB,MAAM,YAAY,CAAC;AAKpB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,YAAY,EACjB,UAAU,CAAC,EAAE,kBAAkB;AAC/B,wEAAwE;AACxE,WAAW,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAC5C,cAAc,CA2ChB"}
|
package/dist/delivery.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { slackClient, telegramClient } from '@relayfile/relay-helpers';
|
|
2
2
|
import { resolveDeliveryTargets, slackChannel, telegramChat } from './types.js';
|
|
3
|
+
import { defaultRelaycastSender } from './relaycast.js';
|
|
3
4
|
const WRITEBACK_TIMEOUT_MS = 45_000;
|
|
4
5
|
/**
|
|
5
6
|
* Create a delivery client that auto-discovers configured transports from
|
|
@@ -20,7 +21,11 @@ const WRITEBACK_TIMEOUT_MS = 45_000;
|
|
|
20
21
|
export function createDelivery(ctx, transports,
|
|
21
22
|
/** Override which transports to target (defaults to all configured). */
|
|
22
23
|
onlyTargets) {
|
|
23
|
-
|
|
24
|
+
// Slack/Telegram are config-driven (persona inputs). Relaycast is event-driven
|
|
25
|
+
// — it's a target only when the caller supplies a reply address in transports.
|
|
26
|
+
const allTargets = [...resolveDeliveryTargets(ctx)];
|
|
27
|
+
if (transports?.relaycast?.to)
|
|
28
|
+
allTargets.push('relaycast');
|
|
24
29
|
const targets = onlyTargets
|
|
25
30
|
? allTargets.filter((t) => onlyTargets.includes(t))
|
|
26
31
|
: allTargets;
|
|
@@ -40,11 +45,20 @@ onlyTargets) {
|
|
|
40
45
|
const telegramNonBlocking = injectedTelegram ?? (targets.includes('telegram')
|
|
41
46
|
? telegramClient({ writebackTimeoutMs: 0 })
|
|
42
47
|
: undefined);
|
|
48
|
+
// Relaycast reply: address from the inbound event, client from the injected
|
|
49
|
+
// sender or the default env-backed one (POST /v1/dm with RELAY_API_KEY).
|
|
50
|
+
const relaycast = targets.includes('relaycast') && transports?.relaycast?.to
|
|
51
|
+
? {
|
|
52
|
+
to: transports.relaycast.to,
|
|
53
|
+
sender: transports.relaycast.sender ?? defaultRelaycastSender(ctx)
|
|
54
|
+
}
|
|
55
|
+
: undefined;
|
|
43
56
|
return new DeliveryClientImpl(ctx, targets, {
|
|
44
57
|
slackBlocking,
|
|
45
58
|
slackNonBlocking,
|
|
46
59
|
telegramBlocking,
|
|
47
|
-
telegramNonBlocking
|
|
60
|
+
telegramNonBlocking,
|
|
61
|
+
relaycast
|
|
48
62
|
});
|
|
49
63
|
}
|
|
50
64
|
class DeliveryClientImpl {
|
|
@@ -75,6 +89,19 @@ class DeliveryClientImpl {
|
|
|
75
89
|
refs.push(ref); })
|
|
76
90
|
.catch((err) => { errors.push(`telegram: ${String(err)}`); }));
|
|
77
91
|
}
|
|
92
|
+
if (target === 'relaycast') {
|
|
93
|
+
// Relaycast replies are a single blocking DM — there's no draft-ref /
|
|
94
|
+
// server-ordered threading pattern, so they don't participate in
|
|
95
|
+
// publish()/non-blocking sends (which promise no receipt wait).
|
|
96
|
+
if (nonBlocking) {
|
|
97
|
+
this.ctx.log?.('debug', 'delivery.relaycast.skip-nonblocking', { to: this.t.relaycast?.to });
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
tasks.push(this.sendRelaycast(text)
|
|
101
|
+
.then((ref) => { if (ref)
|
|
102
|
+
refs.push(ref); })
|
|
103
|
+
.catch((err) => { errors.push(`relaycast: ${String(err)}`); }));
|
|
104
|
+
}
|
|
78
105
|
}
|
|
79
106
|
await Promise.all(tasks);
|
|
80
107
|
// In non-blocking mode, draft refs always succeed (no receipt wait to fail).
|
|
@@ -148,6 +175,21 @@ class DeliveryClientImpl {
|
|
|
148
175
|
draftRef: result.path
|
|
149
176
|
};
|
|
150
177
|
}
|
|
178
|
+
// ── Relaycast (agent-to-agent) ───────────────────────────────────────────
|
|
179
|
+
async sendRelaycast(text) {
|
|
180
|
+
const rc = this.t.relaycast;
|
|
181
|
+
if (!rc)
|
|
182
|
+
return null;
|
|
183
|
+
const res = await rc.sender.dm(rc.to, text);
|
|
184
|
+
// Treat a missing message id as a failed delivery (matches slack/telegram,
|
|
185
|
+
// which return null on a missing receipt) — don't report success with an
|
|
186
|
+
// unusable ref.
|
|
187
|
+
if (!res.ok || !res.messageId) {
|
|
188
|
+
this.ctx.log?.('warn', 'delivery.relaycast.no-receipt', { to: rc.to });
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
return { provider: 'relaycast', to: rc.to, messageId: res.messageId };
|
|
192
|
+
}
|
|
151
193
|
// ── Telegram ───────────────────────────────────────────────────────────
|
|
152
194
|
async sendTelegram(text, parentRef, nonBlocking) {
|
|
153
195
|
const chatId = telegramChat(this.ctx);
|
package/dist/delivery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAGvE,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,YAAY,
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { createDelivery } from './delivery.js';
|
|
2
|
-
export { resolveDeliveryTargets, slackChannel, telegramChat, type DeliveryClient, type DeliveryOptions, type DeliveryResult, type DeliveryTransports, type MessageRef, type SlackRef, type TelegramRef } from './types.js';
|
|
2
|
+
export { resolveDeliveryTargets, slackChannel, telegramChat, type DeliveryClient, type DeliveryOptions, type DeliveryProvider, type DeliveryResult, type DeliveryTransports, type MessageRef, type RelaycastRef, type RelaycastSender, type RelaycastTarget, type SlackRef, type TelegramRef } from './types.js';
|
|
3
|
+
export { DEFAULT_RELAYCAST_URL, resolveRelaycastUrl, defaultRelaycastSender } from './relaycast.js';
|
|
3
4
|
export { input, list, withTimeout, fetchWithTimeout } from './helpers.js';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEpG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { createDelivery } from './delivery.js';
|
|
2
2
|
export { resolveDeliveryTargets, slackChannel, telegramChat } from './types.js';
|
|
3
|
+
export { DEFAULT_RELAYCAST_URL, resolveRelaycastUrl, defaultRelaycastSender } from './relaycast.js';
|
|
3
4
|
export { input, list, withTimeout, fetchWithTimeout } from './helpers.js';
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,YAAY,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,YAAY,EAYb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEpG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { WorkforceCtx } from '@agentworkforce/runtime';
|
|
2
|
+
import type { RelaycastSender } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Canonical relaycast gateway — SINGLE SOURCE OF TRUTH. Change this one
|
|
5
|
+
* constant to move the default gateway. Per-env override via `RELAYCAST_URL`
|
|
6
|
+
* (preferred) or `RELAY_BASE_URL`.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DEFAULT_RELAYCAST_URL = "https://cast.agentrelay.com";
|
|
9
|
+
/** Resolve the relaycast base URL: RELAYCAST_URL > RELAY_BASE_URL > default. */
|
|
10
|
+
export declare function resolveRelaycastUrl(): string;
|
|
11
|
+
/**
|
|
12
|
+
* Default relaycast sender — DMs a peer agent via `POST /v1/dm` using the box's
|
|
13
|
+
* injected agent token. Bounded by `fetchWithTimeout` and never throws: returns
|
|
14
|
+
* `{ ok: false }` (logged) on missing token, timeout, or non-2xx, so a relay
|
|
15
|
+
* reply degrades gracefully rather than crashing the handler.
|
|
16
|
+
*/
|
|
17
|
+
export declare function defaultRelaycastSender(ctx: WorkforceCtx): RelaycastSender;
|
|
18
|
+
//# sourceMappingURL=relaycast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relaycast.d.ts","sourceRoot":"","sources":["../src/relaycast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,gCAAgC,CAAC;AAEnE,gFAAgF;AAChF,wBAAgB,mBAAmB,IAAI,MAAM,CAM5C;AAkBD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,YAAY,GAAG,eAAe,CAuCzE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { fetchWithTimeout } from './helpers.js';
|
|
2
|
+
/**
|
|
3
|
+
* Canonical relaycast gateway — SINGLE SOURCE OF TRUTH. Change this one
|
|
4
|
+
* constant to move the default gateway. Per-env override via `RELAYCAST_URL`
|
|
5
|
+
* (preferred) or `RELAY_BASE_URL`.
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_RELAYCAST_URL = 'https://cast.agentrelay.com';
|
|
8
|
+
/** Resolve the relaycast base URL: RELAYCAST_URL > RELAY_BASE_URL > default. */
|
|
9
|
+
export function resolveRelaycastUrl() {
|
|
10
|
+
const raw = process.env.RELAYCAST_URL?.trim() ||
|
|
11
|
+
process.env.RELAY_BASE_URL?.trim() ||
|
|
12
|
+
DEFAULT_RELAYCAST_URL;
|
|
13
|
+
return raw.replace(/\/+$/, '');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Resolve the token to authenticate relaycast agent actions (DMs). `/v1/dm` is
|
|
17
|
+
* secured with the AGENT token, not the workspace key — so prefer the agent
|
|
18
|
+
* token and only fall back to the workspace `RELAY_API_KEY` (which lets tests
|
|
19
|
+
* and single-identity boxes still work). Mirrors the runtime's agent-token
|
|
20
|
+
* resolution order.
|
|
21
|
+
*/
|
|
22
|
+
function resolveRelayAgentToken() {
|
|
23
|
+
return (process.env.WORKFORCE_AGENT_TOKEN?.trim() ||
|
|
24
|
+
process.env.RELAY_AGENT_TOKEN?.trim() ||
|
|
25
|
+
process.env.RELAY_API_KEY?.trim() ||
|
|
26
|
+
undefined);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Default relaycast sender — DMs a peer agent via `POST /v1/dm` using the box's
|
|
30
|
+
* injected agent token. Bounded by `fetchWithTimeout` and never throws: returns
|
|
31
|
+
* `{ ok: false }` (logged) on missing token, timeout, or non-2xx, so a relay
|
|
32
|
+
* reply degrades gracefully rather than crashing the handler.
|
|
33
|
+
*/
|
|
34
|
+
export function defaultRelaycastSender(ctx) {
|
|
35
|
+
const token = resolveRelayAgentToken();
|
|
36
|
+
const baseUrl = resolveRelaycastUrl();
|
|
37
|
+
return {
|
|
38
|
+
async dm(to, text) {
|
|
39
|
+
if (!token) {
|
|
40
|
+
ctx.log?.('warn', 'delivery.relaycast.no-token', {
|
|
41
|
+
reason: 'no agent token (WORKFORCE_AGENT_TOKEN/RELAY_AGENT_TOKEN/RELAY_API_KEY) in the agent box'
|
|
42
|
+
});
|
|
43
|
+
return { ok: false };
|
|
44
|
+
}
|
|
45
|
+
const res = await fetchWithTimeout(`${baseUrl}/v1/dm`, {
|
|
46
|
+
method: 'POST',
|
|
47
|
+
headers: { authorization: `Bearer ${token}`, 'content-type': 'application/json' },
|
|
48
|
+
body: JSON.stringify({ to, text })
|
|
49
|
+
});
|
|
50
|
+
if (!res) {
|
|
51
|
+
ctx.log?.('warn', 'delivery.relaycast.send-failed', { to, reason: 'timeout or network error' });
|
|
52
|
+
return { ok: false };
|
|
53
|
+
}
|
|
54
|
+
if (!res.ok) {
|
|
55
|
+
ctx.log?.('warn', 'delivery.relaycast.send-failed', { to, status: res.status });
|
|
56
|
+
return { ok: false };
|
|
57
|
+
}
|
|
58
|
+
// Relaycast REST wraps success as `{ ok, data }`; the /dm message id lives
|
|
59
|
+
// under `data.message.id` (or legacy `data.id`). Unwrap before reading.
|
|
60
|
+
const json = (await res.json().catch(() => null));
|
|
61
|
+
const data = json && typeof json.data === 'object' && json.data !== null
|
|
62
|
+
? json.data
|
|
63
|
+
: json;
|
|
64
|
+
const message = data && typeof data.message === 'object' && data.message !== null
|
|
65
|
+
? data.message
|
|
66
|
+
: undefined;
|
|
67
|
+
const rawId = message?.id ?? data?.messageId ?? data?.id;
|
|
68
|
+
return { ok: true, messageId: rawId != null ? String(rawId) : undefined };
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=relaycast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relaycast.js","sourceRoot":"","sources":["../src/relaycast.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relaycast.test.d.ts","sourceRoot":"","sources":["../src/relaycast.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
import { createDelivery } from './delivery.js';
|
|
4
|
+
import { resolveRelaycastUrl, DEFAULT_RELAYCAST_URL } from './relaycast.js';
|
|
5
|
+
function makeCtx(inputs = {}) {
|
|
6
|
+
return { persona: { inputs, inputSpecs: {} }, log: () => { } };
|
|
7
|
+
}
|
|
8
|
+
test('DEFAULT_RELAYCAST_URL is cast.agentrelay.com', () => {
|
|
9
|
+
assert.equal(DEFAULT_RELAYCAST_URL, 'https://cast.agentrelay.com');
|
|
10
|
+
});
|
|
11
|
+
test('resolveRelaycastUrl: default, RELAY_BASE_URL, then RELAYCAST_URL precedence (trailing slash trimmed)', () => {
|
|
12
|
+
const saved = { u: process.env.RELAYCAST_URL, b: process.env.RELAY_BASE_URL };
|
|
13
|
+
try {
|
|
14
|
+
delete process.env.RELAYCAST_URL;
|
|
15
|
+
delete process.env.RELAY_BASE_URL;
|
|
16
|
+
assert.equal(resolveRelaycastUrl(), 'https://cast.agentrelay.com');
|
|
17
|
+
process.env.RELAY_BASE_URL = 'https://relay.example.com/';
|
|
18
|
+
assert.equal(resolveRelaycastUrl(), 'https://relay.example.com');
|
|
19
|
+
process.env.RELAYCAST_URL = 'https://cast.example.com';
|
|
20
|
+
assert.equal(resolveRelaycastUrl(), 'https://cast.example.com'); // RELAYCAST_URL wins
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
saved.u === undefined ? delete process.env.RELAYCAST_URL : (process.env.RELAYCAST_URL = saved.u);
|
|
24
|
+
saved.b === undefined ? delete process.env.RELAY_BASE_URL : (process.env.RELAY_BASE_URL = saved.b);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
test('relaycast target DMs the inbound sender and returns a RelaycastRef', async () => {
|
|
28
|
+
const sent = [];
|
|
29
|
+
const sender = {
|
|
30
|
+
async dm(to, text) {
|
|
31
|
+
sent.push({ to, text });
|
|
32
|
+
return { ok: true, messageId: 'm1' };
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const delivery = createDelivery(makeCtx(), { relaycast: { to: 'local-tester', sender } });
|
|
36
|
+
assert.deepEqual([...delivery.targets], ['relaycast']);
|
|
37
|
+
const res = await delivery.send('hello over relay');
|
|
38
|
+
assert.equal(res.ok, true);
|
|
39
|
+
assert.deepEqual(sent, [{ to: 'local-tester', text: 'hello over relay' }]);
|
|
40
|
+
assert.deepEqual(res.refs, [{ provider: 'relaycast', to: 'local-tester', messageId: 'm1' }]);
|
|
41
|
+
});
|
|
42
|
+
test('relaycast is NOT a target unless a reply address is supplied (event-driven, not config)', () => {
|
|
43
|
+
assert.equal(createDelivery(makeCtx(), {}).targets.includes('relaycast'), false);
|
|
44
|
+
// Even with slack configured, relaycast only appears when transports.relaycast.to is set.
|
|
45
|
+
assert.deepEqual([...createDelivery(makeCtx({ SLACK_CHANNEL: 'C1' }), {}).targets], ['slack']);
|
|
46
|
+
});
|
|
47
|
+
test('onlyTargets can scope delivery to relaycast (origin-only reply)', () => {
|
|
48
|
+
const sender = { async dm() { return { ok: true, messageId: 'x' }; } };
|
|
49
|
+
const delivery = createDelivery(makeCtx({ SLACK_CHANNEL: 'C1' }), { relaycast: { to: 'peer', sender } }, ['relaycast']);
|
|
50
|
+
assert.deepEqual([...delivery.targets], ['relaycast']); // slack filtered out
|
|
51
|
+
});
|
|
52
|
+
test('relaycast-only send failure surfaces (matches slack/telegram all-targets-failed contract)', async () => {
|
|
53
|
+
const sender = { async dm() { return { ok: false }; } };
|
|
54
|
+
const delivery = createDelivery(makeCtx(), { relaycast: { to: 'peer', sender } });
|
|
55
|
+
await assert.rejects(() => delivery.send('x'), /Delivery failed to all targets/);
|
|
56
|
+
});
|
|
57
|
+
test('relaycast ok:true with no messageId is treated as a failed delivery', async () => {
|
|
58
|
+
const sender = { async dm() { return { ok: true }; } }; // no messageId
|
|
59
|
+
const delivery = createDelivery(makeCtx(), { relaycast: { to: 'peer', sender } });
|
|
60
|
+
await assert.rejects(() => delivery.send('x'), /Delivery failed to all targets/);
|
|
61
|
+
});
|
|
62
|
+
test('publish()/non-blocking does not invoke the relaycast sender', async () => {
|
|
63
|
+
let calls = 0;
|
|
64
|
+
const sender = { async dm() { calls++; return { ok: true, messageId: 'm' }; } };
|
|
65
|
+
const delivery = createDelivery(makeCtx(), { relaycast: { to: 'peer', sender } });
|
|
66
|
+
// relaycast is the only target → nothing delivered in non-blocking mode → throws,
|
|
67
|
+
// and crucially the sender is never called (no draft-ref/threading path for relay).
|
|
68
|
+
await assert.rejects(() => delivery.publish('x'), /Delivery failed to all targets/);
|
|
69
|
+
assert.equal(calls, 0);
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=relaycast.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relaycast.test.js","sourceRoot":"","sources":["../src/relaycast.test.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -15,7 +15,16 @@ export interface TelegramRef {
|
|
|
15
15
|
/** Delivered message id (set after the writeback receipt arrives). */
|
|
16
16
|
messageId: string;
|
|
17
17
|
}
|
|
18
|
-
export
|
|
18
|
+
export interface RelaycastRef {
|
|
19
|
+
provider: 'relaycast';
|
|
20
|
+
/** The agent the reply was DM'd to (the inbound message's sender). */
|
|
21
|
+
to: string;
|
|
22
|
+
/** Delivered relaycast message id, when the send returns one. */
|
|
23
|
+
messageId: string;
|
|
24
|
+
}
|
|
25
|
+
export type MessageRef = SlackRef | TelegramRef | RelaycastRef;
|
|
26
|
+
/** A delivery target provider. */
|
|
27
|
+
export type DeliveryProvider = 'slack' | 'telegram' | 'relaycast';
|
|
19
28
|
export interface DeliveryResult {
|
|
20
29
|
ok: boolean;
|
|
21
30
|
refs: MessageRef[];
|
|
@@ -36,11 +45,40 @@ export interface DeliveryOptions {
|
|
|
36
45
|
*/
|
|
37
46
|
nonBlocking?: boolean;
|
|
38
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Minimal seam for sending a relaycast DM back to a peer agent. The default
|
|
50
|
+
* implementation posts `POST /v1/dm` with the box's injected `RELAY_API_KEY`;
|
|
51
|
+
* tests inject a mock. Unlike Slack/Telegram (config-driven via persona
|
|
52
|
+
* inputs), the relaycast reply address is EVENT-driven — `to` is the inbound
|
|
53
|
+
* message's sender, supplied by the caller.
|
|
54
|
+
*/
|
|
55
|
+
export interface RelaycastSender {
|
|
56
|
+
dm(to: string, text: string): Promise<{
|
|
57
|
+
ok: boolean;
|
|
58
|
+
messageId?: string;
|
|
59
|
+
}>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Relaycast target config. Present iff the agent is replying to a relay DM:
|
|
63
|
+
* `to` is the inbound sender to reply to; `sender` overrides the default
|
|
64
|
+
* env-backed client (for tests).
|
|
65
|
+
*/
|
|
66
|
+
export interface RelaycastTarget {
|
|
67
|
+
to: string;
|
|
68
|
+
sender?: RelaycastSender;
|
|
69
|
+
}
|
|
39
70
|
export interface DeliveryTransports {
|
|
40
71
|
/** Injected Slack client (used for both blocking and non-blocking paths). */
|
|
41
72
|
slack?: SlackClient;
|
|
42
73
|
/** Injected Telegram client (used for both blocking and non-blocking paths). */
|
|
43
74
|
telegram?: TelegramClient;
|
|
75
|
+
/**
|
|
76
|
+
* Relaycast reply target. When set, `relaycast` becomes a delivery target
|
|
77
|
+
* and `send()`/`publish()` DM the inbound sender over the relay. Event-driven
|
|
78
|
+
* (the `to` address comes from the inbound message), so it is NOT discovered
|
|
79
|
+
* by `resolveDeliveryTargets(ctx)`.
|
|
80
|
+
*/
|
|
81
|
+
relaycast?: RelaycastTarget;
|
|
44
82
|
}
|
|
45
83
|
export interface DeliveryClient {
|
|
46
84
|
/**
|
|
@@ -63,7 +101,7 @@ export interface DeliveryClient {
|
|
|
63
101
|
*/
|
|
64
102
|
publish(text: string): Promise<DeliveryResult>;
|
|
65
103
|
/** Which providers are configured. */
|
|
66
|
-
readonly targets: ReadonlyArray<
|
|
104
|
+
readonly targets: ReadonlyArray<DeliveryProvider>;
|
|
67
105
|
}
|
|
68
106
|
/**
|
|
69
107
|
* Resolve which transport targets are configured for the given persona ctx.
|
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,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAK/D,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,UAAU,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAK/D,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,UAAU,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,WAAW,CAAC;IACtB,sEAAsE;IACtE,EAAE,EAAE,MAAM,CAAC;IACX,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC;AAE/D,kCAAkC;AAClC,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;AAIlE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,UAAU,EAAE,CAAC;CACpB;AAID,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAID;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5E;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAID,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAID,MAAM,WAAW,cAAc;IAC7B;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEpE;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAE/C,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;CACnD;AAID;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,YAAY,GAAG,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC,CAKrF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAGlE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAGlE"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AA8HrC,4EAA4E;AAE5E;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAiB;IACtD,MAAM,OAAO,GAAgC,EAAE,CAAC;IAChD,IAAI,KAAK,CAAC,GAAG,EAAE,eAAe,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,KAAK,CAAC,GAAG,EAAE,eAAe,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAiB;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACxC,OAAO,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAiB;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACxC,OAAO,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;AAClD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentworkforce/delivery",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.14",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@relayfile/relay-helpers": "^0.4.2",
|
|
29
|
-
"@agentworkforce/runtime": "4.1.
|
|
29
|
+
"@agentworkforce/runtime": "4.1.14"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build": "tsc -p tsconfig.json",
|