@vellumai/assistant 0.4.33 → 0.4.35
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/package.json +1 -1
- package/src/__tests__/access-request-decision.test.ts +2 -3
- package/src/__tests__/actor-token-service.test.ts +4 -11
- package/src/__tests__/approval-primitive.test.ts +0 -45
- package/src/__tests__/assistant-id-boundary-guard.test.ts +169 -0
- package/src/__tests__/callback-handoff-copy.test.ts +0 -1
- package/src/__tests__/channel-approval-routes.test.ts +5 -45
- package/src/__tests__/channel-guardian.test.ts +122 -345
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +4 -3
- package/src/__tests__/contacts-tools.test.ts +4 -5
- package/src/__tests__/conversation-attention-store.test.ts +2 -65
- package/src/__tests__/conversation-attention-telegram.test.ts +0 -2
- package/src/__tests__/conversation-pairing.test.ts +0 -1
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -2
- package/src/__tests__/guardian-action-conversation-turn.test.ts +1 -7
- package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -74
- package/src/__tests__/guardian-action-late-reply.test.ts +1 -8
- package/src/__tests__/guardian-grant-minting.test.ts +0 -1
- package/src/__tests__/guardian-routing-state.test.ts +0 -3
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -3
- package/src/__tests__/non-member-access-request.test.ts +0 -7
- package/src/__tests__/notification-broadcaster.test.ts +1 -2
- package/src/__tests__/notification-decision-fallback.test.ts +0 -2
- package/src/__tests__/notification-decision-strategy.test.ts +0 -1
- package/src/__tests__/relay-server.test.ts +11 -83
- package/src/__tests__/scoped-approval-grants.test.ts +9 -40
- package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -36
- package/src/__tests__/send-endpoint-busy.test.ts +0 -1
- package/src/__tests__/send-notification-tool.test.ts +0 -1
- package/src/__tests__/slack-inbound-verification.test.ts +2 -4
- package/src/__tests__/thread-seed-composer.test.ts +0 -1
- package/src/__tests__/tool-approval-handler.test.ts +0 -1
- package/src/__tests__/tool-grant-request-escalation.test.ts +0 -4
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -5
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +1 -17
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -13
- package/src/__tests__/trusted-contact-verification.test.ts +3 -15
- package/src/__tests__/twilio-routes.test.ts +2 -2
- package/src/__tests__/voice-invite-redemption.test.ts +0 -1
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -37
- package/src/approvals/approval-primitive.ts +0 -15
- package/src/approvals/guardian-decision-primitive.ts +0 -3
- package/src/approvals/guardian-request-resolvers.ts +0 -5
- package/src/calls/call-domain.ts +0 -3
- package/src/calls/call-store.ts +0 -3
- package/src/calls/guardian-action-sweep.ts +2 -1
- package/src/calls/guardian-dispatch.ts +1 -2
- package/src/calls/relay-access-wait.ts +0 -4
- package/src/calls/relay-server.ts +3 -11
- package/src/calls/relay-setup-router.ts +1 -2
- package/src/calls/relay-verification.ts +0 -1
- package/src/calls/twilio-routes.ts +0 -3
- package/src/calls/types.ts +0 -1
- package/src/calls/voice-session-bridge.ts +0 -1
- package/src/config/bundled-skills/google-oauth-setup/SKILL.md +100 -171
- package/src/config/bundled-skills/notifications/tools/send-notification.ts +0 -1
- package/src/contacts/contact-store.ts +13 -88
- package/src/contacts/contacts-write.ts +3 -11
- package/src/contacts/types.ts +0 -1
- package/src/daemon/handlers/config-channels.ts +16 -42
- package/src/daemon/handlers/config-inbox.ts +6 -6
- package/src/daemon/handlers/contacts.ts +3 -11
- package/src/daemon/handlers/index.ts +0 -2
- package/src/daemon/session-process.ts +0 -4
- package/src/memory/conversation-attention-store.ts +4 -19
- package/src/memory/conversation-crud.ts +0 -2
- package/src/memory/db-init.ts +4 -0
- package/src/memory/guardian-action-store.ts +0 -12
- package/src/memory/guardian-approvals.ts +35 -80
- package/src/memory/guardian-rate-limits.ts +1 -14
- package/src/memory/guardian-verification.ts +6 -34
- package/src/memory/invite-store.ts +5 -14
- package/src/memory/migrations/026-guardian-verification-sessions.ts +28 -9
- package/src/memory/migrations/027a-guardian-bootstrap-token.ts +16 -3
- package/src/memory/migrations/038-actor-token-records.ts +8 -1
- package/src/memory/migrations/039-actor-refresh-token-records.ts +11 -2
- package/src/memory/migrations/110-channel-guardian.ts +27 -6
- package/src/memory/migrations/112-assistant-inbox.ts +39 -15
- package/src/memory/migrations/114-notifications.ts +37 -15
- package/src/memory/migrations/117-conversation-attention.ts +33 -9
- package/src/memory/migrations/134-contacts-notes-column.ts +64 -45
- package/src/memory/migrations/136-drop-assistant-id-columns.ts +263 -0
- package/src/memory/migrations/index.ts +1 -0
- package/src/memory/migrations/registry.ts +14 -1
- package/src/memory/migrations/schema-introspection.ts +18 -0
- package/src/memory/schema/calls.ts +0 -7
- package/src/memory/schema/contacts.ts +0 -8
- package/src/memory/schema/guardian.ts +0 -5
- package/src/memory/schema/infrastructure.ts +0 -2
- package/src/memory/schema/notifications.ts +3 -17
- package/src/memory/scoped-approval-grants.ts +2 -24
- package/src/notifications/adapters/sms.ts +2 -1
- package/src/notifications/broadcaster.ts +1 -6
- package/src/notifications/decision-engine.ts +3 -4
- package/src/notifications/deliveries-store.ts +0 -4
- package/src/notifications/destination-resolver.ts +4 -6
- package/src/notifications/deterministic-checks.ts +1 -6
- package/src/notifications/emit-signal.ts +4 -11
- package/src/notifications/events-store.ts +7 -17
- package/src/notifications/preference-summary.ts +2 -2
- package/src/notifications/preferences-store.ts +2 -9
- package/src/notifications/signal.ts +0 -1
- package/src/notifications/thread-candidates.ts +1 -11
- package/src/notifications/types.ts +0 -3
- package/src/runtime/access-request-helper.ts +3 -10
- package/src/runtime/actor-refresh-token-store.ts +0 -6
- package/src/runtime/actor-token-store.ts +3 -16
- package/src/runtime/actor-trust-resolver.ts +1 -4
- package/src/runtime/auth/__tests__/credential-service.test.ts +0 -9
- package/src/runtime/auth/credential-service.ts +1 -15
- package/src/runtime/auth/require-bound-guardian.ts +1 -4
- package/src/runtime/channel-guardian-service.ts +15 -46
- package/src/runtime/channel-invite-transport.ts +8 -0
- package/src/runtime/channel-invite-transports/email.ts +4 -0
- package/src/runtime/channel-invite-transports/slack.ts +6 -0
- package/src/runtime/channel-invite-transports/sms.ts +4 -0
- package/src/runtime/channel-invite-transports/telegram.ts +6 -0
- package/src/runtime/confirmation-request-guardian-bridge.ts +0 -1
- package/src/runtime/guardian-action-followup-executor.ts +3 -2
- package/src/runtime/guardian-action-grant-minter.ts +0 -1
- package/src/runtime/guardian-outbound-actions.ts +2 -12
- package/src/runtime/guardian-vellum-migration.ts +2 -3
- package/src/runtime/http-server.ts +3 -10
- package/src/runtime/http-types.ts +13 -1
- package/src/runtime/invite-redemption-service.ts +1 -14
- package/src/runtime/local-actor-identity.ts +2 -5
- package/src/runtime/routes/access-request-decision.ts +0 -1
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +0 -9
- package/src/runtime/routes/channel-readiness-routes.ts +29 -18
- package/src/runtime/routes/contact-routes.ts +15 -40
- package/src/runtime/routes/conversation-attention-routes.ts +0 -2
- package/src/runtime/routes/global-search-routes.ts +0 -2
- package/src/runtime/routes/guardian-bootstrap-routes.ts +6 -7
- package/src/runtime/routes/guardian-expiry-sweep.ts +3 -2
- package/src/runtime/routes/inbound-message-handler.ts +0 -3
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +7 -43
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +1 -4
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +1 -6
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +0 -1
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +0 -1
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +3 -7
- package/src/runtime/routes/pairing-routes.ts +4 -4
- package/src/runtime/routes/surface-content-routes.ts +104 -0
- package/src/runtime/tool-grant-request-helper.ts +0 -1
- package/src/tools/browser/browser-manager.ts +22 -21
- package/src/tools/browser/runtime-check.ts +111 -6
- package/src/tools/calls/call-start.ts +1 -3
- package/src/tools/followups/followup_create.ts +1 -2
- package/src/tools/tool-approval-handler.ts +0 -2
|
@@ -282,12 +282,8 @@ function resetTables() {
|
|
|
282
282
|
ensuredConvIds = new Set();
|
|
283
283
|
}
|
|
284
284
|
|
|
285
|
-
function addTrustedVoiceContact(
|
|
286
|
-
phoneNumber: string,
|
|
287
|
-
assistantId: string = "self",
|
|
288
|
-
): void {
|
|
285
|
+
function addTrustedVoiceContact(phoneNumber: string): void {
|
|
289
286
|
upsertMember({
|
|
290
|
-
assistantId,
|
|
291
287
|
sourceChannel: "voice",
|
|
292
288
|
externalUserId: phoneNumber,
|
|
293
289
|
externalChatId: phoneNumber,
|
|
@@ -297,12 +293,10 @@ function addTrustedVoiceContact(
|
|
|
297
293
|
}
|
|
298
294
|
|
|
299
295
|
function createVoiceVerificationSession(
|
|
300
|
-
assistantId: string,
|
|
301
296
|
expectedPhoneE164: string,
|
|
302
297
|
sessionId?: string,
|
|
303
298
|
): string {
|
|
304
299
|
const { secret } = createOutboundSession({
|
|
305
|
-
assistantId,
|
|
306
300
|
channel: "voice",
|
|
307
301
|
expectedExternalUserId: expectedPhoneE164,
|
|
308
302
|
expectedChatId: expectedPhoneE164,
|
|
@@ -313,12 +307,10 @@ function createVoiceVerificationSession(
|
|
|
313
307
|
}
|
|
314
308
|
|
|
315
309
|
function createPendingVoiceGuardianChallenge(
|
|
316
|
-
assistantId: string,
|
|
317
310
|
secret: string = "123456",
|
|
318
311
|
): string {
|
|
319
312
|
createChallenge({
|
|
320
313
|
id: randomUUID(),
|
|
321
|
-
assistantId,
|
|
322
314
|
channel: "voice",
|
|
323
315
|
challengeHash: createHash("sha256").update(secret).digest("hex"),
|
|
324
316
|
expiresAt: Date.now() + 10 * 60 * 1000,
|
|
@@ -1333,12 +1325,11 @@ describe("relay-server", () => {
|
|
|
1333
1325
|
provider: "twilio",
|
|
1334
1326
|
fromNumber: "+15559999999",
|
|
1335
1327
|
toNumber: "+15551111111",
|
|
1336
|
-
assistantId: "self",
|
|
1337
1328
|
// no task — inbound call
|
|
1338
1329
|
});
|
|
1339
1330
|
|
|
1340
1331
|
// Create a pending voice guardian challenge
|
|
1341
|
-
const secret = createPendingVoiceGuardianChallenge(
|
|
1332
|
+
const secret = createPendingVoiceGuardianChallenge();
|
|
1342
1333
|
|
|
1343
1334
|
mockSendMessage.mockImplementation(
|
|
1344
1335
|
createMockProviderResponse(["Hello, how can I help you?"]),
|
|
@@ -1413,10 +1404,9 @@ describe("relay-server", () => {
|
|
|
1413
1404
|
provider: "twilio",
|
|
1414
1405
|
fromNumber: "+15559999999",
|
|
1415
1406
|
toNumber: "+15551111111",
|
|
1416
|
-
assistantId: "self",
|
|
1417
1407
|
});
|
|
1418
1408
|
|
|
1419
|
-
const secret = createPendingVoiceGuardianChallenge(
|
|
1409
|
+
const secret = createPendingVoiceGuardianChallenge();
|
|
1420
1410
|
|
|
1421
1411
|
mockSendMessage.mockImplementation(
|
|
1422
1412
|
createMockProviderResponse(["Hello, verified caller!"]),
|
|
@@ -1474,11 +1464,9 @@ describe("relay-server", () => {
|
|
|
1474
1464
|
provider: "twilio",
|
|
1475
1465
|
fromNumber: "+15550001111",
|
|
1476
1466
|
toNumber: "+15551111111",
|
|
1477
|
-
assistantId: "self",
|
|
1478
1467
|
});
|
|
1479
1468
|
|
|
1480
1469
|
createGuardianBinding({
|
|
1481
|
-
assistantId: "self",
|
|
1482
1470
|
channel: "voice",
|
|
1483
1471
|
guardianExternalUserId: "+15550001111",
|
|
1484
1472
|
guardianDeliveryChatId: "+15550001111",
|
|
@@ -1524,18 +1512,16 @@ describe("relay-server", () => {
|
|
|
1524
1512
|
provider: "twilio",
|
|
1525
1513
|
fromNumber: "+15550002222",
|
|
1526
1514
|
toNumber: "+15551111111",
|
|
1527
|
-
assistantId: "self",
|
|
1528
1515
|
});
|
|
1529
1516
|
|
|
1530
1517
|
createGuardianBinding({
|
|
1531
|
-
assistantId: "self",
|
|
1532
1518
|
channel: "voice",
|
|
1533
1519
|
guardianExternalUserId: "+15550009999",
|
|
1534
1520
|
guardianDeliveryChatId: "+15550009999",
|
|
1535
1521
|
guardianPrincipalId: "+15550009999",
|
|
1536
1522
|
verifiedVia: "test",
|
|
1537
1523
|
});
|
|
1538
|
-
addTrustedVoiceContact("+15550002222"
|
|
1524
|
+
addTrustedVoiceContact("+15550002222");
|
|
1539
1525
|
|
|
1540
1526
|
mockSendMessage.mockImplementation(
|
|
1541
1527
|
createMockProviderResponse(["Hello there."]),
|
|
@@ -1578,12 +1564,10 @@ describe("relay-server", () => {
|
|
|
1578
1564
|
provider: "twilio",
|
|
1579
1565
|
fromNumber: "+15551111111",
|
|
1580
1566
|
toNumber: "+15550001111",
|
|
1581
|
-
assistantId: "self",
|
|
1582
1567
|
initiatedFromConversationId: "conv-guardian-outbound-voice-origin",
|
|
1583
1568
|
});
|
|
1584
1569
|
|
|
1585
1570
|
createGuardianBinding({
|
|
1586
|
-
assistantId: "self",
|
|
1587
1571
|
channel: "voice",
|
|
1588
1572
|
guardianExternalUserId: "+15550001111",
|
|
1589
1573
|
guardianDeliveryChatId: "+15550001111",
|
|
@@ -1630,12 +1614,10 @@ describe("relay-server", () => {
|
|
|
1630
1614
|
provider: "twilio",
|
|
1631
1615
|
fromNumber: "+15551111111",
|
|
1632
1616
|
toNumber: "+15550001111",
|
|
1633
|
-
assistantId: "self",
|
|
1634
1617
|
initiatedFromConversationId: "conv-guardian-outbound-strict-origin",
|
|
1635
1618
|
});
|
|
1636
1619
|
|
|
1637
1620
|
createGuardianBinding({
|
|
1638
|
-
assistantId: "self",
|
|
1639
1621
|
channel: "telegram",
|
|
1640
1622
|
guardianExternalUserId: "tg-guardian-user",
|
|
1641
1623
|
guardianDeliveryChatId: "tg-guardian-chat",
|
|
@@ -1682,10 +1664,9 @@ describe("relay-server", () => {
|
|
|
1682
1664
|
provider: "twilio",
|
|
1683
1665
|
fromNumber: "+15550003333",
|
|
1684
1666
|
toNumber: "+15551111111",
|
|
1685
|
-
assistantId: "self",
|
|
1686
1667
|
});
|
|
1687
1668
|
|
|
1688
|
-
const secret = createPendingVoiceGuardianChallenge(
|
|
1669
|
+
const secret = createPendingVoiceGuardianChallenge();
|
|
1689
1670
|
const spokenCode = secret.split("").join(" ");
|
|
1690
1671
|
|
|
1691
1672
|
const { relay } = createMockWs(session.id);
|
|
@@ -1740,10 +1721,9 @@ describe("relay-server", () => {
|
|
|
1740
1721
|
provider: "twilio",
|
|
1741
1722
|
fromNumber: "+15559999999",
|
|
1742
1723
|
toNumber: "+15551111111",
|
|
1743
|
-
assistantId: "self",
|
|
1744
1724
|
});
|
|
1745
1725
|
|
|
1746
|
-
createPendingVoiceGuardianChallenge(
|
|
1726
|
+
createPendingVoiceGuardianChallenge();
|
|
1747
1727
|
|
|
1748
1728
|
const { ws, relay } = createMockWs(session.id);
|
|
1749
1729
|
|
|
@@ -1785,10 +1765,9 @@ describe("relay-server", () => {
|
|
|
1785
1765
|
provider: "twilio",
|
|
1786
1766
|
fromNumber: "+15559999999",
|
|
1787
1767
|
toNumber: "+15551111111",
|
|
1788
|
-
assistantId: "self",
|
|
1789
1768
|
});
|
|
1790
1769
|
|
|
1791
|
-
createPendingVoiceGuardianChallenge(
|
|
1770
|
+
createPendingVoiceGuardianChallenge();
|
|
1792
1771
|
|
|
1793
1772
|
const { ws, relay } = createMockWs(session.id);
|
|
1794
1773
|
|
|
@@ -1851,7 +1830,6 @@ describe("relay-server", () => {
|
|
|
1851
1830
|
provider: "twilio",
|
|
1852
1831
|
fromNumber: "+15559999999",
|
|
1853
1832
|
toNumber: "+15551111111",
|
|
1854
|
-
assistantId: "self",
|
|
1855
1833
|
// no task — inbound call
|
|
1856
1834
|
});
|
|
1857
1835
|
|
|
@@ -1860,7 +1838,7 @@ describe("relay-server", () => {
|
|
|
1860
1838
|
mockSendMessage.mockImplementation(
|
|
1861
1839
|
createMockProviderResponse(["Welcome to the line."]),
|
|
1862
1840
|
);
|
|
1863
|
-
addTrustedVoiceContact("+15559999999"
|
|
1841
|
+
addTrustedVoiceContact("+15559999999");
|
|
1864
1842
|
|
|
1865
1843
|
const { ws, relay } = createMockWs(session.id);
|
|
1866
1844
|
|
|
@@ -1897,10 +1875,9 @@ describe("relay-server", () => {
|
|
|
1897
1875
|
provider: "twilio",
|
|
1898
1876
|
fromNumber: "+15559999999",
|
|
1899
1877
|
toNumber: "+15551111111",
|
|
1900
|
-
assistantId: "self",
|
|
1901
1878
|
});
|
|
1902
1879
|
|
|
1903
|
-
createPendingVoiceGuardianChallenge(
|
|
1880
|
+
createPendingVoiceGuardianChallenge();
|
|
1904
1881
|
|
|
1905
1882
|
const { ws, relay } = createMockWs(session.id);
|
|
1906
1883
|
|
|
@@ -1952,14 +1929,12 @@ describe("relay-server", () => {
|
|
|
1952
1929
|
provider: "twilio",
|
|
1953
1930
|
fromNumber: "+15551111111",
|
|
1954
1931
|
toNumber: "+15559999999",
|
|
1955
|
-
assistantId: "self",
|
|
1956
1932
|
callMode: "guardian_verification",
|
|
1957
1933
|
guardianVerificationSessionId: "gv-session-ptr-success",
|
|
1958
1934
|
initiatedFromConversationId: "conv-gv-pointer-success-origin",
|
|
1959
1935
|
});
|
|
1960
1936
|
|
|
1961
1937
|
const secret = createVoiceVerificationSession(
|
|
1962
|
-
"self",
|
|
1963
1938
|
"+15559999999",
|
|
1964
1939
|
"gv-session-ptr-success",
|
|
1965
1940
|
);
|
|
@@ -2009,17 +1984,12 @@ describe("relay-server", () => {
|
|
|
2009
1984
|
provider: "twilio",
|
|
2010
1985
|
fromNumber: "+15551111111",
|
|
2011
1986
|
toNumber: "+15559999999",
|
|
2012
|
-
assistantId: "self",
|
|
2013
1987
|
callMode: "guardian_verification",
|
|
2014
1988
|
guardianVerificationSessionId: "gv-session-ptr-fail",
|
|
2015
1989
|
initiatedFromConversationId: "conv-gv-pointer-fail-origin",
|
|
2016
1990
|
});
|
|
2017
1991
|
|
|
2018
|
-
createVoiceVerificationSession(
|
|
2019
|
-
"self",
|
|
2020
|
-
"+15559999999",
|
|
2021
|
-
"gv-session-ptr-fail",
|
|
2022
|
-
);
|
|
1992
|
+
createVoiceVerificationSession("+15559999999", "gv-session-ptr-fail");
|
|
2023
1993
|
|
|
2024
1994
|
const { relay } = createMockWs(session.id);
|
|
2025
1995
|
|
|
@@ -2071,14 +2041,12 @@ describe("relay-server", () => {
|
|
|
2071
2041
|
provider: "twilio",
|
|
2072
2042
|
fromNumber: "+15558887777",
|
|
2073
2043
|
toNumber: "+15551111111",
|
|
2074
|
-
assistantId: "self",
|
|
2075
2044
|
});
|
|
2076
2045
|
|
|
2077
2046
|
// Create a voice invite with friend/guardian names
|
|
2078
2047
|
const code = generateVoiceCode(6);
|
|
2079
2048
|
const codeHash = hashVoiceCode(code);
|
|
2080
2049
|
createInvite({
|
|
2081
|
-
assistantId: "self",
|
|
2082
2050
|
sourceChannel: "voice",
|
|
2083
2051
|
maxUses: 1,
|
|
2084
2052
|
expectedExternalUserId: "+15558887777",
|
|
@@ -2146,14 +2114,12 @@ describe("relay-server", () => {
|
|
|
2146
2114
|
provider: "twilio",
|
|
2147
2115
|
fromNumber: "+15558886666",
|
|
2148
2116
|
toNumber: "+15551111111",
|
|
2149
|
-
assistantId: "self",
|
|
2150
2117
|
});
|
|
2151
2118
|
|
|
2152
2119
|
// Create a voice invite with friend/guardian names
|
|
2153
2120
|
const code = generateVoiceCode(6);
|
|
2154
2121
|
const codeHash = hashVoiceCode(code);
|
|
2155
2122
|
createInvite({
|
|
2156
|
-
assistantId: "self",
|
|
2157
2123
|
sourceChannel: "voice",
|
|
2158
2124
|
maxUses: 1,
|
|
2159
2125
|
expectedExternalUserId: "+15558886666",
|
|
@@ -2228,7 +2194,6 @@ describe("relay-server", () => {
|
|
|
2228
2194
|
provider: "twilio",
|
|
2229
2195
|
fromNumber: "+15558885555",
|
|
2230
2196
|
toNumber: "+15551111111",
|
|
2231
|
-
assistantId: "self",
|
|
2232
2197
|
});
|
|
2233
2198
|
|
|
2234
2199
|
// No voice invite created for this caller
|
|
@@ -2282,7 +2247,6 @@ describe("relay-server", () => {
|
|
|
2282
2247
|
provider: "twilio",
|
|
2283
2248
|
fromNumber: "+15558885556",
|
|
2284
2249
|
toNumber: "+15551111111",
|
|
2285
|
-
assistantId: "self",
|
|
2286
2250
|
});
|
|
2287
2251
|
|
|
2288
2252
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -2323,7 +2287,6 @@ describe("relay-server", () => {
|
|
|
2323
2287
|
provider: "twilio",
|
|
2324
2288
|
fromNumber: "+15558884444",
|
|
2325
2289
|
toNumber: "+15551111111",
|
|
2326
|
-
assistantId: "self",
|
|
2327
2290
|
});
|
|
2328
2291
|
|
|
2329
2292
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -2388,7 +2351,6 @@ describe("relay-server", () => {
|
|
|
2388
2351
|
provider: "twilio",
|
|
2389
2352
|
fromNumber: "+15558883333",
|
|
2390
2353
|
toNumber: "+15551111111",
|
|
2391
|
-
assistantId: "self",
|
|
2392
2354
|
});
|
|
2393
2355
|
|
|
2394
2356
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -2422,7 +2384,6 @@ describe("relay-server", () => {
|
|
|
2422
2384
|
provider: "twilio",
|
|
2423
2385
|
fromNumber: "+15558882222",
|
|
2424
2386
|
toNumber: "+15551111111",
|
|
2425
|
-
assistantId: "self",
|
|
2426
2387
|
});
|
|
2427
2388
|
|
|
2428
2389
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -2480,12 +2441,10 @@ describe("relay-server", () => {
|
|
|
2480
2441
|
provider: "twilio",
|
|
2481
2442
|
fromNumber: "+15558881111",
|
|
2482
2443
|
toNumber: "+15551111111",
|
|
2483
|
-
assistantId: "self",
|
|
2484
2444
|
});
|
|
2485
2445
|
|
|
2486
2446
|
// Create a blocked member
|
|
2487
2447
|
upsertMember({
|
|
2488
|
-
assistantId: "self",
|
|
2489
2448
|
sourceChannel: "voice",
|
|
2490
2449
|
externalUserId: "+15558881111",
|
|
2491
2450
|
externalChatId: "+15558881111",
|
|
@@ -2531,7 +2490,6 @@ describe("relay-server", () => {
|
|
|
2531
2490
|
provider: "twilio",
|
|
2532
2491
|
fromNumber: "+15557770001",
|
|
2533
2492
|
toNumber: "+15551111111",
|
|
2534
|
-
assistantId: "self",
|
|
2535
2493
|
});
|
|
2536
2494
|
|
|
2537
2495
|
const { relay } = createMockWs(session.id);
|
|
@@ -2579,7 +2537,6 @@ describe("relay-server", () => {
|
|
|
2579
2537
|
provider: "twilio",
|
|
2580
2538
|
fromNumber: "+15557770002",
|
|
2581
2539
|
toNumber: "+15551111111",
|
|
2582
|
-
assistantId: "self",
|
|
2583
2540
|
});
|
|
2584
2541
|
|
|
2585
2542
|
// Track provider calls to verify no LLM turn is triggered on approval
|
|
@@ -2670,7 +2627,6 @@ describe("relay-server", () => {
|
|
|
2670
2627
|
provider: "twilio",
|
|
2671
2628
|
fromNumber: "+15557770003",
|
|
2672
2629
|
toNumber: "+15551111111",
|
|
2673
|
-
assistantId: "self",
|
|
2674
2630
|
});
|
|
2675
2631
|
|
|
2676
2632
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -2754,7 +2710,6 @@ describe("relay-server", () => {
|
|
|
2754
2710
|
provider: "twilio",
|
|
2755
2711
|
fromNumber: "+15557770004",
|
|
2756
2712
|
toNumber: "+15551111111",
|
|
2757
|
-
assistantId: "self",
|
|
2758
2713
|
});
|
|
2759
2714
|
|
|
2760
2715
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -2831,7 +2786,6 @@ describe("relay-server", () => {
|
|
|
2831
2786
|
provider: "twilio",
|
|
2832
2787
|
fromNumber: "+15557770005",
|
|
2833
2788
|
toNumber: "+15551111111",
|
|
2834
|
-
assistantId: "self",
|
|
2835
2789
|
});
|
|
2836
2790
|
|
|
2837
2791
|
const { relay } = createMockWs(session.id);
|
|
@@ -2877,7 +2831,6 @@ describe("relay-server", () => {
|
|
|
2877
2831
|
provider: "twilio",
|
|
2878
2832
|
fromNumber: "+15557770010",
|
|
2879
2833
|
toNumber: "+15551111111",
|
|
2880
|
-
assistantId: "self",
|
|
2881
2834
|
});
|
|
2882
2835
|
|
|
2883
2836
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -2935,7 +2888,6 @@ describe("relay-server", () => {
|
|
|
2935
2888
|
provider: "twilio",
|
|
2936
2889
|
fromNumber: "+15557770011",
|
|
2937
2890
|
toNumber: "+15551111111",
|
|
2938
|
-
assistantId: "self",
|
|
2939
2891
|
});
|
|
2940
2892
|
|
|
2941
2893
|
mockSendMessage.mockImplementation(
|
|
@@ -3001,7 +2953,6 @@ describe("relay-server", () => {
|
|
|
3001
2953
|
provider: "twilio",
|
|
3002
2954
|
fromNumber: "+15557770012",
|
|
3003
2955
|
toNumber: "+15551111111",
|
|
3004
|
-
assistantId: "self",
|
|
3005
2956
|
});
|
|
3006
2957
|
|
|
3007
2958
|
const { relay } = createMockWs(session.id);
|
|
@@ -3037,7 +2988,6 @@ describe("relay-server", () => {
|
|
|
3037
2988
|
provider: "twilio",
|
|
3038
2989
|
fromNumber: "+15557770013",
|
|
3039
2990
|
toNumber: "+15551111111",
|
|
3040
|
-
assistantId: "self",
|
|
3041
2991
|
});
|
|
3042
2992
|
|
|
3043
2993
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -3108,7 +3058,6 @@ describe("relay-server", () => {
|
|
|
3108
3058
|
provider: "twilio",
|
|
3109
3059
|
fromNumber: "+15557770014",
|
|
3110
3060
|
toNumber: "+15551111111",
|
|
3111
|
-
assistantId: "self",
|
|
3112
3061
|
});
|
|
3113
3062
|
|
|
3114
3063
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -3194,7 +3143,6 @@ describe("relay-server", () => {
|
|
|
3194
3143
|
provider: "twilio",
|
|
3195
3144
|
fromNumber: "+15557770015",
|
|
3196
3145
|
toNumber: "+15551111111",
|
|
3197
|
-
assistantId: "self",
|
|
3198
3146
|
});
|
|
3199
3147
|
|
|
3200
3148
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -3252,7 +3200,6 @@ describe("relay-server", () => {
|
|
|
3252
3200
|
provider: "twilio",
|
|
3253
3201
|
fromNumber: "+15557770016",
|
|
3254
3202
|
toNumber: "+15551111111",
|
|
3255
|
-
assistantId: "self",
|
|
3256
3203
|
});
|
|
3257
3204
|
|
|
3258
3205
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -3301,7 +3248,6 @@ describe("relay-server", () => {
|
|
|
3301
3248
|
provider: "twilio",
|
|
3302
3249
|
fromNumber: "+15557770017",
|
|
3303
3250
|
toNumber: "+15551111111",
|
|
3304
|
-
assistantId: "self",
|
|
3305
3251
|
});
|
|
3306
3252
|
|
|
3307
3253
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -3365,7 +3311,6 @@ describe("relay-server", () => {
|
|
|
3365
3311
|
provider: "twilio",
|
|
3366
3312
|
fromNumber: "+15557770020",
|
|
3367
3313
|
toNumber: "+15551111111",
|
|
3368
|
-
assistantId: "self",
|
|
3369
3314
|
});
|
|
3370
3315
|
|
|
3371
3316
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -3468,7 +3413,6 @@ describe("relay-server", () => {
|
|
|
3468
3413
|
provider: "twilio",
|
|
3469
3414
|
fromNumber: "+15557770021",
|
|
3470
3415
|
toNumber: "+15551111111",
|
|
3471
|
-
assistantId: "self",
|
|
3472
3416
|
});
|
|
3473
3417
|
|
|
3474
3418
|
const { relay } = createMockWs(session.id);
|
|
@@ -3526,7 +3470,6 @@ describe("relay-server", () => {
|
|
|
3526
3470
|
provider: "twilio",
|
|
3527
3471
|
fromNumber: "+15557770022",
|
|
3528
3472
|
toNumber: "+15551111111",
|
|
3529
|
-
assistantId: "self",
|
|
3530
3473
|
});
|
|
3531
3474
|
|
|
3532
3475
|
const { relay } = createMockWs(session.id);
|
|
@@ -3595,7 +3538,6 @@ describe("relay-server", () => {
|
|
|
3595
3538
|
provider: "twilio",
|
|
3596
3539
|
fromNumber: "+15557770023",
|
|
3597
3540
|
toNumber: "+15551111111",
|
|
3598
|
-
assistantId: "self",
|
|
3599
3541
|
});
|
|
3600
3542
|
|
|
3601
3543
|
const { relay } = createMockWs(session.id);
|
|
@@ -3673,7 +3615,6 @@ describe("relay-server", () => {
|
|
|
3673
3615
|
provider: "twilio",
|
|
3674
3616
|
fromNumber: "+15557770024",
|
|
3675
3617
|
toNumber: "+15551111111",
|
|
3676
|
-
assistantId: "self",
|
|
3677
3618
|
});
|
|
3678
3619
|
|
|
3679
3620
|
const { relay } = createMockWs(session.id);
|
|
@@ -3764,7 +3705,6 @@ describe("relay-server", () => {
|
|
|
3764
3705
|
provider: "twilio",
|
|
3765
3706
|
fromNumber: "+15557770025",
|
|
3766
3707
|
toNumber: "+15551111111",
|
|
3767
|
-
assistantId: "self",
|
|
3768
3708
|
});
|
|
3769
3709
|
|
|
3770
3710
|
// Do NOT add caller as trusted contact
|
|
@@ -3851,7 +3791,6 @@ describe("relay-server", () => {
|
|
|
3851
3791
|
provider: "twilio",
|
|
3852
3792
|
fromNumber: "+15551111111",
|
|
3853
3793
|
toNumber: "+15559876543",
|
|
3854
|
-
assistantId: "self",
|
|
3855
3794
|
initiatedFromConversationId: "conv-relay-ptr-complete-origin",
|
|
3856
3795
|
});
|
|
3857
3796
|
updateCallSession(session.id, {
|
|
@@ -3890,7 +3829,6 @@ describe("relay-server", () => {
|
|
|
3890
3829
|
provider: "twilio",
|
|
3891
3830
|
fromNumber: "+15551111111",
|
|
3892
3831
|
toNumber: "+15559876543",
|
|
3893
|
-
assistantId: "self",
|
|
3894
3832
|
initiatedFromConversationId: "conv-relay-ptr-fail-origin",
|
|
3895
3833
|
});
|
|
3896
3834
|
updateCallSession(session.id, { status: "in_progress" });
|
|
@@ -3927,7 +3865,6 @@ describe("relay-server", () => {
|
|
|
3927
3865
|
provider: "twilio",
|
|
3928
3866
|
fromNumber: "+15553334444",
|
|
3929
3867
|
toNumber: "+15551111111",
|
|
3930
|
-
assistantId: "self",
|
|
3931
3868
|
});
|
|
3932
3869
|
|
|
3933
3870
|
// Create a trusted-contact verification challenge with status 'pending'
|
|
@@ -3937,7 +3874,6 @@ describe("relay-server", () => {
|
|
|
3937
3874
|
const tcSecret = "654321";
|
|
3938
3875
|
createVerificationSession({
|
|
3939
3876
|
id: randomUUID(),
|
|
3940
|
-
assistantId: "self",
|
|
3941
3877
|
channel: "voice",
|
|
3942
3878
|
challengeHash: createHash("sha256").update(tcSecret).digest("hex"),
|
|
3943
3879
|
expiresAt: Date.now() + 10 * 60 * 1000,
|
|
@@ -4011,11 +3947,10 @@ describe("relay-server", () => {
|
|
|
4011
3947
|
provider: "twilio",
|
|
4012
3948
|
fromNumber: "+15552223333",
|
|
4013
3949
|
toNumber: "+15551111111",
|
|
4014
|
-
assistantId: "self",
|
|
4015
3950
|
});
|
|
4016
3951
|
|
|
4017
3952
|
// Create a guardian challenge (default verificationPurpose = 'guardian')
|
|
4018
|
-
const secret = createPendingVoiceGuardianChallenge(
|
|
3953
|
+
const secret = createPendingVoiceGuardianChallenge();
|
|
4019
3954
|
|
|
4020
3955
|
mockSendMessage.mockImplementation(
|
|
4021
3956
|
createMockProviderResponse(["Hello, how can I help you?"]),
|
|
@@ -4067,13 +4002,11 @@ describe("relay-server", () => {
|
|
|
4067
4002
|
provider: "twilio",
|
|
4068
4003
|
fromNumber: "+15557776666",
|
|
4069
4004
|
toNumber: "+15551111111",
|
|
4070
|
-
assistantId: "self",
|
|
4071
4005
|
});
|
|
4072
4006
|
|
|
4073
4007
|
const code = generateVoiceCode(6);
|
|
4074
4008
|
const codeHash = hashVoiceCode(code);
|
|
4075
4009
|
createInvite({
|
|
4076
|
-
assistantId: "self",
|
|
4077
4010
|
sourceChannel: "voice",
|
|
4078
4011
|
maxUses: 1,
|
|
4079
4012
|
expectedExternalUserId: "+15557776666",
|
|
@@ -4148,7 +4081,6 @@ describe("relay-server", () => {
|
|
|
4148
4081
|
|
|
4149
4082
|
// Create a guardian binding with a different displayName
|
|
4150
4083
|
createGuardianBinding({
|
|
4151
|
-
assistantId: "self",
|
|
4152
4084
|
channel: "voice",
|
|
4153
4085
|
guardianExternalUserId: "+15559990001",
|
|
4154
4086
|
guardianDeliveryChatId: "+15559990001",
|
|
@@ -4163,7 +4095,6 @@ describe("relay-server", () => {
|
|
|
4163
4095
|
provider: "twilio",
|
|
4164
4096
|
fromNumber: "+15559990099",
|
|
4165
4097
|
toNumber: "+15551111111",
|
|
4166
|
-
assistantId: "self",
|
|
4167
4098
|
});
|
|
4168
4099
|
|
|
4169
4100
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -4195,7 +4126,6 @@ describe("relay-server", () => {
|
|
|
4195
4126
|
|
|
4196
4127
|
// Create a guardian binding with a displayName
|
|
4197
4128
|
createGuardianBinding({
|
|
4198
|
-
assistantId: "self",
|
|
4199
4129
|
channel: "voice",
|
|
4200
4130
|
guardianExternalUserId: "+15559990002",
|
|
4201
4131
|
guardianDeliveryChatId: "+15559990002",
|
|
@@ -4210,7 +4140,6 @@ describe("relay-server", () => {
|
|
|
4210
4140
|
provider: "twilio",
|
|
4211
4141
|
fromNumber: "+15559990098",
|
|
4212
4142
|
toNumber: "+15551111111",
|
|
4213
|
-
assistantId: "self",
|
|
4214
4143
|
});
|
|
4215
4144
|
|
|
4216
4145
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -4247,7 +4176,6 @@ describe("relay-server", () => {
|
|
|
4247
4176
|
provider: "twilio",
|
|
4248
4177
|
fromNumber: "+15559990097",
|
|
4249
4178
|
toNumber: "+15551111111",
|
|
4250
|
-
assistantId: "self",
|
|
4251
4179
|
});
|
|
4252
4180
|
|
|
4253
4181
|
const { ws, relay } = createMockWs(session.id);
|
|
@@ -72,7 +72,6 @@ function grantParams(
|
|
|
72
72
|
): CreateScopedApprovalGrantParams {
|
|
73
73
|
const futureExpiry = new Date(Date.now() + 60_000).toISOString();
|
|
74
74
|
return {
|
|
75
|
-
assistantId: "self",
|
|
76
75
|
scopeMode: "request_id",
|
|
77
76
|
requestChannel: "telegram",
|
|
78
77
|
decisionChannel: "telegram",
|
|
@@ -95,11 +94,7 @@ describe("scoped-approval-grants / request_id scope", () => {
|
|
|
95
94
|
expect(grant.status).toBe("active");
|
|
96
95
|
expect(grant.requestId).toBe("req-1");
|
|
97
96
|
|
|
98
|
-
const result = consumeScopedApprovalGrantByRequestId(
|
|
99
|
-
"req-1",
|
|
100
|
-
"consumer-1",
|
|
101
|
-
"self",
|
|
102
|
-
);
|
|
97
|
+
const result = consumeScopedApprovalGrantByRequestId("req-1", "consumer-1");
|
|
103
98
|
expect(result.ok).toBe(true);
|
|
104
99
|
expect(result.grant).not.toBeNull();
|
|
105
100
|
expect(result.grant!.status).toBe("consumed");
|
|
@@ -111,18 +106,10 @@ describe("scoped-approval-grants / request_id scope", () => {
|
|
|
111
106
|
grantParams({ scopeMode: "request_id", requestId: "req-2" }),
|
|
112
107
|
);
|
|
113
108
|
|
|
114
|
-
const first = consumeScopedApprovalGrantByRequestId(
|
|
115
|
-
"req-2",
|
|
116
|
-
"consumer-a",
|
|
117
|
-
"self",
|
|
118
|
-
);
|
|
109
|
+
const first = consumeScopedApprovalGrantByRequestId("req-2", "consumer-a");
|
|
119
110
|
expect(first.ok).toBe(true);
|
|
120
111
|
|
|
121
|
-
const second = consumeScopedApprovalGrantByRequestId(
|
|
122
|
-
"req-2",
|
|
123
|
-
"consumer-b",
|
|
124
|
-
"self",
|
|
125
|
-
);
|
|
112
|
+
const second = consumeScopedApprovalGrantByRequestId("req-2", "consumer-b");
|
|
126
113
|
expect(second.ok).toBe(false);
|
|
127
114
|
expect(second.grant).toBeNull();
|
|
128
115
|
});
|
|
@@ -131,7 +118,6 @@ describe("scoped-approval-grants / request_id scope", () => {
|
|
|
131
118
|
const result = consumeScopedApprovalGrantByRequestId(
|
|
132
119
|
"nonexistent",
|
|
133
120
|
"consumer-x",
|
|
134
|
-
"self",
|
|
135
121
|
);
|
|
136
122
|
expect(result.ok).toBe(false);
|
|
137
123
|
});
|
|
@@ -149,7 +135,6 @@ describe("scoped-approval-grants / request_id scope", () => {
|
|
|
149
135
|
const result = consumeScopedApprovalGrantByRequestId(
|
|
150
136
|
"req-expired",
|
|
151
137
|
"consumer-1",
|
|
152
|
-
"self",
|
|
153
138
|
);
|
|
154
139
|
expect(result.ok).toBe(false);
|
|
155
140
|
});
|
|
@@ -421,11 +406,7 @@ describe("scoped-approval-grants / expiry", () => {
|
|
|
421
406
|
expect(count).toBe(2);
|
|
422
407
|
|
|
423
408
|
// Verify the alive grant is still active
|
|
424
|
-
const alive = consumeScopedApprovalGrantByRequestId(
|
|
425
|
-
"req-alive",
|
|
426
|
-
"c1",
|
|
427
|
-
"self",
|
|
428
|
-
);
|
|
409
|
+
const alive = consumeScopedApprovalGrantByRequestId("req-alive", "c1");
|
|
429
410
|
expect(alive.ok).toBe(true);
|
|
430
411
|
});
|
|
431
412
|
|
|
@@ -438,7 +419,7 @@ describe("scoped-approval-grants / expiry", () => {
|
|
|
438
419
|
expiresAt: new Date(Date.now() + 60_000).toISOString(),
|
|
439
420
|
}),
|
|
440
421
|
);
|
|
441
|
-
consumeScopedApprovalGrantByRequestId("req-consumed", "c1"
|
|
422
|
+
consumeScopedApprovalGrantByRequestId("req-consumed", "c1");
|
|
442
423
|
|
|
443
424
|
// Force the expiry time to the past for the consumed grant (simulating time passing)
|
|
444
425
|
// The sweep should not touch consumed grants
|
|
@@ -483,15 +464,11 @@ describe("scoped-approval-grants / revoke", () => {
|
|
|
483
464
|
expect(count).toBe(2);
|
|
484
465
|
|
|
485
466
|
// Revoked grant cannot be consumed
|
|
486
|
-
const revoked = consumeScopedApprovalGrantByRequestId(
|
|
487
|
-
"req-r1",
|
|
488
|
-
"c1",
|
|
489
|
-
"self",
|
|
490
|
-
);
|
|
467
|
+
const revoked = consumeScopedApprovalGrantByRequestId("req-r1", "c1");
|
|
491
468
|
expect(revoked.ok).toBe(false);
|
|
492
469
|
|
|
493
470
|
// Unaffected grant is still consumable
|
|
494
|
-
const alive = consumeScopedApprovalGrantByRequestId("req-r3", "c1"
|
|
471
|
+
const alive = consumeScopedApprovalGrantByRequestId("req-r3", "c1");
|
|
495
472
|
expect(alive.ok).toBe(true);
|
|
496
473
|
});
|
|
497
474
|
|
|
@@ -506,11 +483,7 @@ describe("scoped-approval-grants / revoke", () => {
|
|
|
506
483
|
|
|
507
484
|
revokeScopedApprovalGrantsForContext({ conversationId: "conv-1" });
|
|
508
485
|
|
|
509
|
-
const result = consumeScopedApprovalGrantByRequestId(
|
|
510
|
-
"req-revoke",
|
|
511
|
-
"c1",
|
|
512
|
-
"self",
|
|
513
|
-
);
|
|
486
|
+
const result = consumeScopedApprovalGrantByRequestId("req-revoke", "c1");
|
|
514
487
|
expect(result.ok).toBe(false);
|
|
515
488
|
});
|
|
516
489
|
|
|
@@ -530,11 +503,7 @@ describe("scoped-approval-grants / revoke", () => {
|
|
|
530
503
|
);
|
|
531
504
|
|
|
532
505
|
// The grant should still be active (not revoked)
|
|
533
|
-
const result = consumeScopedApprovalGrantByRequestId(
|
|
534
|
-
"req-guard",
|
|
535
|
-
"c1",
|
|
536
|
-
"self",
|
|
537
|
-
);
|
|
506
|
+
const result = consumeScopedApprovalGrantByRequestId("req-guard", "c1");
|
|
538
507
|
expect(result.ok).toBe(true);
|
|
539
508
|
});
|
|
540
509
|
});
|