@vellumai/assistant 0.4.49 → 0.4.51
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/ARCHITECTURE.md +24 -33
- package/README.md +3 -3
- package/docs/architecture/integrations.md +2 -2
- package/docs/architecture/keychain-broker.md +6 -6
- package/docs/architecture/memory.md +180 -119
- package/knip.json +32 -0
- package/package.json +3 -2
- package/src/__tests__/agent-loop.test.ts +3 -1
- package/src/__tests__/anthropic-provider.test.ts +114 -23
- package/src/__tests__/approval-cascade.test.ts +1 -15
- package/src/__tests__/approval-routes-http.test.ts +2 -0
- package/src/__tests__/assistant-feature-flag-guard.test.ts +0 -23
- package/src/__tests__/btw-routes.test.ts +61 -5
- package/src/__tests__/canonical-guardian-store.test.ts +95 -0
- package/src/__tests__/checker.test.ts +13 -0
- package/src/__tests__/config-schema.test.ts +1 -68
- package/src/__tests__/config-watcher.test.ts +8 -0
- package/src/__tests__/context-memory-e2e.test.ts +11 -100
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +8 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
- package/src/__tests__/credential-security-e2e.test.ts +1 -0
- package/src/__tests__/credential-security-invariants.test.ts +8 -7
- package/src/__tests__/credential-vault-unit.test.ts +23 -18
- package/src/__tests__/credential-vault.test.ts +30 -18
- package/src/__tests__/credentials-cli.test.ts +257 -82
- package/src/__tests__/cu-unified-flow.test.ts +532 -0
- package/src/__tests__/date-context.test.ts +93 -77
- package/src/__tests__/deterministic-verification-control-plane.test.ts +64 -0
- package/src/__tests__/guardian-routing-invariants.test.ts +93 -0
- package/src/__tests__/history-repair.test.ts +245 -0
- package/src/__tests__/host-cu-proxy.test.ts +165 -3
- package/src/__tests__/http-user-message-parity.test.ts +1 -0
- package/src/__tests__/inbound-invite-redemption.test.ts +36 -7
- package/src/__tests__/integration-status.test.ts +31 -30
- package/src/__tests__/invite-redemption-service.test.ts +166 -13
- package/src/__tests__/invite-routes-http.test.ts +166 -5
- package/src/__tests__/keychain-broker-client.test.ts +4 -4
- package/src/__tests__/list-messages-attachments.test.ts +193 -0
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +56 -18
- package/src/__tests__/memory-lifecycle-e2e.test.ts +244 -387
- package/src/__tests__/memory-recall-quality.test.ts +244 -407
- package/src/__tests__/memory-regressions.experimental.test.ts +126 -101
- package/src/__tests__/memory-regressions.test.ts +477 -2841
- package/src/__tests__/memory-retrieval.benchmark.test.ts +33 -150
- package/src/__tests__/memory-upsert-concurrency.test.ts +5 -244
- package/src/__tests__/mime-builder.test.ts +28 -0
- package/src/__tests__/native-web-search.test.ts +1 -0
- package/src/__tests__/oauth-cli.test.ts +824 -31
- package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
- package/src/__tests__/oauth-store.test.ts +363 -17
- package/src/__tests__/qdrant-collection-migration.test.ts +53 -8
- package/src/__tests__/registry.test.ts +0 -1
- package/src/__tests__/relay-server.test.ts +55 -1
- package/src/__tests__/schedule-tools.test.ts +32 -0
- package/src/__tests__/script-proxy-certs.test.ts +1 -1
- package/src/__tests__/secret-onetime-send.test.ts +1 -0
- package/src/__tests__/secret-routes-managed-proxy.test.ts +183 -0
- package/src/__tests__/secure-keys.test.ts +78 -18
- package/src/__tests__/send-endpoint-busy.test.ts +3 -0
- package/src/__tests__/server-history-render.test.ts +2 -2
- package/src/__tests__/session-abort-tool-results.test.ts +1 -14
- package/src/__tests__/session-agent-loop-overflow.test.ts +1583 -0
- package/src/__tests__/session-agent-loop.test.ts +19 -15
- package/src/__tests__/session-confirmation-signals.test.ts +1 -15
- package/src/__tests__/session-error.test.ts +124 -2
- package/src/__tests__/session-history-web-search.test.ts +918 -0
- package/src/__tests__/session-pre-run-repair.test.ts +1 -14
- package/src/__tests__/session-provider-retry-repair.test.ts +25 -28
- package/src/__tests__/session-queue.test.ts +37 -27
- package/src/__tests__/session-runtime-assembly.test.ts +54 -0
- package/src/__tests__/session-slash-known.test.ts +1 -15
- package/src/__tests__/session-slash-queue.test.ts +1 -15
- package/src/__tests__/session-slash-unknown.test.ts +1 -15
- package/src/__tests__/session-workspace-cache-state.test.ts +3 -33
- package/src/__tests__/session-workspace-injection.test.ts +3 -37
- package/src/__tests__/session-workspace-tool-tracking.test.ts +3 -37
- package/src/__tests__/skills-install-extract.test.ts +93 -0
- package/src/__tests__/skills.test.ts +2 -2
- package/src/__tests__/skillssh-registry.test.ts +451 -0
- package/src/__tests__/slack-channel-config.test.ts +10 -8
- package/src/__tests__/trust-store.test.ts +15 -0
- package/src/__tests__/twilio-config.test.ts +11 -10
- package/src/__tests__/twilio-provider.test.ts +9 -4
- package/src/__tests__/voice-invite-redemption.test.ts +85 -5
- package/src/agent/ax-tree-compaction.test.ts +51 -0
- package/src/agent/loop.ts +39 -12
- package/src/approvals/AGENTS.md +1 -1
- package/src/approvals/guardian-request-resolvers.ts +14 -2
- package/src/bundler/compiler-tools.ts +66 -2
- package/src/calls/call-domain.ts +134 -3
- package/src/calls/call-store.ts +6 -0
- package/src/calls/relay-server.ts +44 -6
- package/src/calls/relay-setup-router.ts +17 -1
- package/src/calls/twilio-config.ts +5 -4
- package/src/calls/twilio-provider.ts +14 -9
- package/src/calls/twilio-rest.ts +10 -7
- package/src/calls/types.ts +3 -1
- package/src/cli/commands/config.ts +14 -9
- package/src/cli/commands/contacts.ts +3 -0
- package/src/cli/commands/credentials.ts +170 -174
- package/src/cli/commands/doctor.ts +11 -8
- package/src/cli/commands/keys.ts +9 -9
- package/src/cli/commands/mcp.ts +46 -59
- package/src/cli/commands/memory.ts +16 -165
- package/src/cli/commands/oauth/apps.ts +68 -10
- package/src/cli/commands/oauth/connections.ts +475 -105
- package/src/cli/commands/oauth/index.ts +3 -3
- package/src/cli/commands/oauth/providers.ts +18 -4
- package/src/cli/commands/sessions.ts +5 -2
- package/src/cli/commands/skills.ts +173 -1
- package/src/cli/http-client.ts +0 -20
- package/src/cli/main-screen.tsx +2 -2
- package/src/cli/program.ts +5 -6
- package/src/cli.ts +20 -22
- package/src/config/__tests__/feature-flag-registry-bundled.test.ts +39 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +1 -1
- package/src/config/bundled-skills/computer-use/tools/computer-use-observe.ts +12 -0
- package/src/config/bundled-skills/contacts/SKILL.md +35 -11
- package/src/config/bundled-skills/contacts/tools/google-contacts.ts +1 -1
- package/src/config/bundled-skills/gmail/SKILL.md +1 -1
- package/src/config/bundled-skills/gmail/TOOLS.json +52 -0
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +13 -3
- package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +9 -2
- package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +5 -1
- package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +5 -1
- package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +5 -1
- package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +5 -1
- package/src/config/bundled-skills/gmail/tools/gmail-label.ts +9 -2
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +5 -1
- package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +5 -1
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +5 -1
- package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +5 -1
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +5 -1
- package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +5 -1
- package/src/config/bundled-skills/google-calendar/TOOLS.json +20 -0
- package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +2 -1
- package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +2 -1
- package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +2 -1
- package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +2 -1
- package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +2 -1
- package/src/config/bundled-skills/google-calendar/tools/shared.ts +8 -2
- package/src/config/bundled-skills/messaging/SKILL.md +1 -1
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +2 -2
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +2 -2
- package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +2 -2
- package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +2 -2
- package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +2 -2
- package/src/config/bundled-skills/messaging/tools/messaging-read.ts +2 -2
- package/src/config/bundled-skills/messaging/tools/messaging-search.ts +2 -2
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +2 -2
- package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +2 -2
- package/src/config/bundled-skills/messaging/tools/shared.ts +7 -5
- package/src/config/bundled-skills/slack/tools/shared.ts +1 -1
- package/src/config/bundled-skills/slack/tools/slack-add-reaction.ts +1 -1
- package/src/config/bundled-skills/slack/tools/slack-channel-details.ts +1 -1
- package/src/config/bundled-skills/slack/tools/slack-delete-message.ts +1 -1
- package/src/config/bundled-skills/slack/tools/slack-edit-message.ts +1 -1
- package/src/config/bundled-skills/slack/tools/slack-leave-channel.ts +1 -1
- package/src/config/bundled-skills/slack/tools/slack-scan-digest.ts +1 -1
- package/src/config/bundled-tool-registry.ts +2 -5
- package/src/config/loader.ts +6 -42
- package/src/config/schema.ts +1 -12
- package/src/config/schemas/memory-lifecycle.ts +0 -9
- package/src/config/schemas/memory-processing.ts +0 -180
- package/src/config/schemas/memory-retrieval.ts +32 -104
- package/src/config/schemas/memory.ts +0 -10
- package/src/config/types.ts +0 -4
- package/src/contacts/contact-store.ts +39 -2
- package/src/contacts/contacts-write.ts +9 -0
- package/src/context/window-manager.ts +4 -1
- package/src/daemon/config-watcher.ts +55 -2
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/date-context.ts +114 -31
- package/src/daemon/handlers/config-ingress.ts +2 -2
- package/src/daemon/handlers/config-slack-channel.ts +59 -39
- package/src/daemon/handlers/config-telegram.ts +23 -14
- package/src/daemon/handlers/session-history.ts +1 -358
- package/src/daemon/handlers/sessions.ts +18 -13
- package/src/daemon/handlers/shared.ts +3 -17
- package/src/daemon/handlers/skills.ts +20 -1
- package/src/daemon/history-repair.ts +72 -8
- package/src/daemon/host-cu-proxy.ts +55 -26
- package/src/daemon/lifecycle.ts +39 -4
- package/src/daemon/mcp-reload-service.ts +2 -2
- package/src/daemon/message-types/computer-use.ts +1 -12
- package/src/daemon/message-types/memory.ts +4 -16
- package/src/daemon/message-types/messages.ts +1 -0
- package/src/daemon/message-types/sessions.ts +4 -42
- package/src/daemon/server.ts +6 -1
- package/src/daemon/session-agent-loop-handlers.ts +38 -0
- package/src/daemon/session-agent-loop.ts +334 -48
- package/src/daemon/session-error.ts +89 -6
- package/src/daemon/session-history.ts +17 -7
- package/src/daemon/session-media-retry.ts +6 -2
- package/src/daemon/session-memory.ts +69 -149
- package/src/daemon/session-process.ts +10 -1
- package/src/daemon/session-runtime-assembly.ts +49 -19
- package/src/daemon/session-slash.ts +3 -5
- package/src/daemon/session-surfaces.ts +4 -1
- package/src/daemon/session-tool-setup.ts +7 -1
- package/src/daemon/session.ts +12 -2
- package/src/email/providers/index.ts +2 -2
- package/src/instrument.ts +61 -1
- package/src/media/avatar-router.ts +1 -1
- package/src/memory/admin.ts +2 -191
- package/src/memory/canonical-guardian-store.ts +38 -2
- package/src/memory/conversation-crud.ts +0 -33
- package/src/memory/conversation-queries.ts +25 -83
- package/src/memory/db-init.ts +32 -0
- package/src/memory/embedding-backend.ts +84 -8
- package/src/memory/embedding-types.ts +9 -1
- package/src/memory/indexer.ts +7 -46
- package/src/memory/invite-store.ts +19 -0
- package/src/memory/items-extractor.ts +274 -76
- package/src/memory/job-handlers/backfill.ts +2 -127
- package/src/memory/job-handlers/cleanup.ts +2 -16
- package/src/memory/job-handlers/extraction.ts +2 -138
- package/src/memory/job-handlers/index-maintenance.ts +1 -6
- package/src/memory/job-handlers/summarization.ts +3 -148
- package/src/memory/job-utils.ts +21 -59
- package/src/memory/jobs-store.ts +1 -159
- package/src/memory/jobs-worker.ts +9 -52
- package/src/memory/migrations/104-core-indexes.ts +3 -3
- package/src/memory/migrations/149-oauth-tables.ts +2 -0
- package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +98 -0
- package/src/memory/migrations/151-oauth-providers-ping-url.ts +11 -0
- package/src/memory/migrations/152-memory-item-supersession.ts +44 -0
- package/src/memory/migrations/153-drop-entity-tables.ts +15 -0
- package/src/memory/migrations/154-drop-fts.ts +20 -0
- package/src/memory/migrations/155-drop-conflicts.ts +7 -0
- package/src/memory/migrations/156-call-session-invite-metadata.ts +24 -0
- package/src/memory/migrations/157-invite-contact-id.ts +104 -0
- package/src/memory/migrations/index.ts +8 -0
- package/src/memory/migrations/registry.ts +6 -0
- package/src/memory/qdrant-client.ts +148 -51
- package/src/memory/raw-query.ts +1 -1
- package/src/memory/retriever.test.ts +294 -273
- package/src/memory/retriever.ts +421 -645
- package/src/memory/schema/calls.ts +2 -0
- package/src/memory/schema/contacts.ts +1 -0
- package/src/memory/schema/memory-core.ts +3 -48
- package/src/memory/schema/oauth.ts +2 -0
- package/src/memory/search/formatting.ts +263 -176
- package/src/memory/search/lexical.ts +1 -254
- package/src/memory/search/ranking.ts +0 -455
- package/src/memory/search/semantic.ts +100 -14
- package/src/memory/search/staleness.ts +47 -0
- package/src/memory/search/tier-classifier.ts +21 -0
- package/src/memory/search/types.ts +15 -77
- package/src/memory/task-memory-cleanup.ts +4 -6
- package/src/messaging/provider.ts +1 -1
- package/src/messaging/providers/gmail/adapter.ts +1 -1
- package/src/messaging/providers/gmail/mime-builder.ts +17 -7
- package/src/messaging/providers/telegram-bot/adapter.ts +17 -8
- package/src/messaging/providers/whatsapp/adapter.ts +13 -9
- package/src/messaging/registry.ts +9 -5
- package/src/oauth/byo-connection.test.ts +40 -25
- package/src/oauth/connect-orchestrator.ts +4 -10
- package/src/oauth/connection-resolver.ts +20 -6
- package/src/oauth/manual-token-connection.ts +5 -5
- package/src/oauth/oauth-store.ts +183 -31
- package/src/oauth/platform-connection.test.ts +1 -1
- package/src/oauth/provider-behaviors.ts +503 -4
- package/src/oauth/seed-providers.ts +214 -8
- package/src/oauth/token-persistence.ts +31 -16
- package/src/permissions/defaults.ts +1 -0
- package/src/permissions/trust-store.ts +23 -1
- package/src/playbooks/playbook-compiler.ts +1 -1
- package/src/prompts/system-prompt.ts +18 -2
- package/src/providers/anthropic/client.ts +56 -126
- package/src/providers/types.ts +7 -1
- package/src/runtime/AGENTS.md +9 -0
- package/src/runtime/auth/route-policy.ts +6 -3
- package/src/runtime/channel-readiness-service.ts +48 -40
- package/src/runtime/guardian-reply-router.ts +24 -22
- package/src/runtime/http-server.ts +2 -2
- package/src/runtime/http-types.ts +2 -0
- package/src/runtime/invite-redemption-service.ts +72 -12
- package/src/runtime/invite-service.ts +43 -0
- package/src/runtime/middleware/twilio-validation.ts +1 -1
- package/src/runtime/pending-interactions.ts +2 -2
- package/src/runtime/routes/brain-graph-routes.ts +10 -90
- package/src/runtime/routes/btw-routes.ts +10 -5
- package/src/runtime/routes/conversation-routes.ts +56 -11
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +21 -12
- package/src/runtime/routes/integrations/slack/channel.ts +2 -2
- package/src/runtime/routes/integrations/telegram.ts +2 -2
- package/src/runtime/routes/integrations/twilio.ts +17 -17
- package/src/runtime/routes/invite-routes.ts +29 -4
- package/src/runtime/routes/memory-item-routes.test.ts +754 -0
- package/src/runtime/routes/memory-item-routes.ts +503 -0
- package/src/runtime/routes/secret-routes.ts +17 -0
- package/src/runtime/routes/session-management-routes.ts +3 -3
- package/src/runtime/routes/settings-routes.ts +3 -3
- package/src/runtime/routes/trust-rules-routes.ts +14 -0
- package/src/runtime/routes/workspace-routes.ts +9 -4
- package/src/runtime/routes/workspace-utils.ts +8 -2
- package/src/schedule/integration-status.ts +26 -19
- package/src/security/keychain-broker-client.ts +17 -4
- package/src/security/oauth2.ts +6 -7
- package/src/security/secure-keys.ts +44 -19
- package/src/security/token-manager.ts +46 -39
- package/src/services/vercel-deploy.ts +0 -24
- package/src/signals/confirm.ts +78 -0
- package/src/signals/mcp-reload.ts +18 -0
- package/src/skills/catalog-install.ts +74 -18
- package/src/skills/skillssh-registry.ts +503 -0
- package/src/tools/assets/search.ts +5 -1
- package/src/tools/computer-use/definitions.ts +0 -10
- package/src/tools/computer-use/registry.ts +1 -1
- package/src/tools/credentials/vault.ts +22 -7
- package/src/tools/memory/definitions.ts +4 -13
- package/src/tools/memory/handlers.test.ts +83 -103
- package/src/tools/memory/handlers.ts +50 -85
- package/src/tools/network/script-proxy/session-manager.ts +8 -8
- package/src/tools/schedule/create.ts +10 -3
- package/src/tools/schedule/update.ts +8 -1
- package/src/tools/skills/load.ts +25 -2
- package/src/watcher/provider-types.ts +1 -1
- package/src/watcher/providers/github.ts +1 -1
- package/src/watcher/providers/gmail.ts +3 -3
- package/src/watcher/providers/google-calendar.ts +3 -3
- package/src/watcher/providers/linear.ts +1 -1
- package/src/__tests__/clarification-resolver.test.ts +0 -193
- package/src/__tests__/conflict-intent-tokenization.test.ts +0 -160
- package/src/__tests__/conflict-policy.test.ts +0 -269
- package/src/__tests__/conflict-store.test.ts +0 -372
- package/src/__tests__/contradiction-checker.test.ts +0 -361
- package/src/__tests__/entity-extractor.test.ts +0 -211
- package/src/__tests__/entity-search.test.ts +0 -1117
- package/src/__tests__/profile-compiler.test.ts +0 -392
- package/src/__tests__/session-conflict-gate.test.ts +0 -1228
- package/src/__tests__/session-profile-injection.test.ts +0 -557
- package/src/config/bundled-skills/knowledge-graph/SKILL.md +0 -25
- package/src/config/bundled-skills/knowledge-graph/TOOLS.json +0 -66
- package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +0 -211
- package/src/daemon/session-conflict-gate.ts +0 -167
- package/src/daemon/session-dynamic-profile.ts +0 -77
- package/src/memory/clarification-resolver.ts +0 -417
- package/src/memory/conflict-intent.ts +0 -205
- package/src/memory/conflict-policy.ts +0 -127
- package/src/memory/conflict-store.ts +0 -410
- package/src/memory/contradiction-checker.ts +0 -508
- package/src/memory/entity-extractor.ts +0 -535
- package/src/memory/format-recall.ts +0 -47
- package/src/memory/fts-reconciler.ts +0 -165
- package/src/memory/job-handlers/conflict.ts +0 -200
- package/src/memory/profile-compiler.ts +0 -195
- package/src/memory/recall-cache.ts +0 -117
- package/src/memory/search/entity.ts +0 -535
- package/src/memory/search/query-expansion.test.ts +0 -70
- package/src/memory/search/query-expansion.ts +0 -118
- package/src/runtime/routes/mcp-routes.ts +0 -20
|
@@ -66,10 +66,10 @@ function pruneAssistantPhoneNumbers(
|
|
|
66
66
|
/**
|
|
67
67
|
* GET /v1/integrations/twilio/config
|
|
68
68
|
*/
|
|
69
|
-
export function handleGetTwilioConfig(): Response {
|
|
70
|
-
const hasCredentials = hasTwilioCredentials();
|
|
69
|
+
export async function handleGetTwilioConfig(): Promise<Response> {
|
|
70
|
+
const hasCredentials = await hasTwilioCredentials();
|
|
71
71
|
const accountSid = hasCredentials
|
|
72
|
-
? getTwilioCredentials().accountSid
|
|
72
|
+
? (await getTwilioCredentials()).accountSid
|
|
73
73
|
: undefined;
|
|
74
74
|
const raw = loadRawConfig();
|
|
75
75
|
const twilio = (raw?.twilio ?? {}) as Record<string, unknown>;
|
|
@@ -100,7 +100,7 @@ export async function handleSetTwilioCredentials(
|
|
|
100
100
|
return Response.json(
|
|
101
101
|
{
|
|
102
102
|
success: false,
|
|
103
|
-
hasCredentials: hasTwilioCredentials(),
|
|
103
|
+
hasCredentials: await hasTwilioCredentials(),
|
|
104
104
|
error: "accountSid and authToken are required",
|
|
105
105
|
},
|
|
106
106
|
{ status: 400 },
|
|
@@ -120,7 +120,7 @@ export async function handleSetTwilioCredentials(
|
|
|
120
120
|
const errBody = await res.text();
|
|
121
121
|
return Response.json({
|
|
122
122
|
success: false,
|
|
123
|
-
hasCredentials: hasTwilioCredentials(),
|
|
123
|
+
hasCredentials: await hasTwilioCredentials(),
|
|
124
124
|
error: `Twilio API validation failed (${res.status}): ${errBody}`,
|
|
125
125
|
});
|
|
126
126
|
}
|
|
@@ -128,7 +128,7 @@ export async function handleSetTwilioCredentials(
|
|
|
128
128
|
const message = err instanceof Error ? err.message : String(err);
|
|
129
129
|
return Response.json({
|
|
130
130
|
success: false,
|
|
131
|
-
hasCredentials: hasTwilioCredentials(),
|
|
131
|
+
hasCredentials: await hasTwilioCredentials(),
|
|
132
132
|
error: `Failed to validate Twilio credentials: ${message}`,
|
|
133
133
|
});
|
|
134
134
|
}
|
|
@@ -231,7 +231,7 @@ export async function handleClearTwilioCredentials(): Promise<Response> {
|
|
|
231
231
|
* GET /v1/integrations/twilio/numbers
|
|
232
232
|
*/
|
|
233
233
|
export async function handleListTwilioNumbers(): Promise<Response> {
|
|
234
|
-
if (!hasTwilioCredentials()) {
|
|
234
|
+
if (!(await hasTwilioCredentials())) {
|
|
235
235
|
return Response.json({
|
|
236
236
|
success: false,
|
|
237
237
|
hasCredentials: false,
|
|
@@ -239,7 +239,7 @@ export async function handleListTwilioNumbers(): Promise<Response> {
|
|
|
239
239
|
});
|
|
240
240
|
}
|
|
241
241
|
|
|
242
|
-
const { accountSid, authToken } = getTwilioCredentials();
|
|
242
|
+
const { accountSid, authToken } = await getTwilioCredentials();
|
|
243
243
|
const numbers = await listIncomingPhoneNumbers(accountSid, authToken);
|
|
244
244
|
|
|
245
245
|
return Response.json({ success: true, hasCredentials: true, numbers });
|
|
@@ -253,7 +253,7 @@ export async function handleListTwilioNumbers(): Promise<Response> {
|
|
|
253
253
|
export async function handleProvisionTwilioNumber(
|
|
254
254
|
req: Request,
|
|
255
255
|
): Promise<Response> {
|
|
256
|
-
if (!hasTwilioCredentials()) {
|
|
256
|
+
if (!(await hasTwilioCredentials())) {
|
|
257
257
|
return Response.json({
|
|
258
258
|
success: false,
|
|
259
259
|
hasCredentials: false,
|
|
@@ -265,7 +265,7 @@ export async function handleProvisionTwilioNumber(
|
|
|
265
265
|
country?: string;
|
|
266
266
|
areaCode?: string;
|
|
267
267
|
};
|
|
268
|
-
const { accountSid, authToken } = getTwilioCredentials();
|
|
268
|
+
const { accountSid, authToken } = await getTwilioCredentials();
|
|
269
269
|
const country = body.country ?? "US";
|
|
270
270
|
|
|
271
271
|
const available = await searchAvailableNumbers(
|
|
@@ -324,7 +324,7 @@ export async function handleAssignTwilioNumber(
|
|
|
324
324
|
return Response.json(
|
|
325
325
|
{
|
|
326
326
|
success: false,
|
|
327
|
-
hasCredentials: hasTwilioCredentials(),
|
|
327
|
+
hasCredentials: await hasTwilioCredentials(),
|
|
328
328
|
error: "phoneNumber is required",
|
|
329
329
|
},
|
|
330
330
|
{ status: 400 },
|
|
@@ -339,9 +339,9 @@ export async function handleAssignTwilioNumber(
|
|
|
339
339
|
|
|
340
340
|
// Best-effort webhook configuration when credentials are available
|
|
341
341
|
let webhookWarning: string | undefined;
|
|
342
|
-
if (hasTwilioCredentials()) {
|
|
342
|
+
if (await hasTwilioCredentials()) {
|
|
343
343
|
const { accountSid: acctSid, authToken: acctToken } =
|
|
344
|
-
getTwilioCredentials();
|
|
344
|
+
await getTwilioCredentials();
|
|
345
345
|
const webhookResult = await syncTwilioWebhooks(
|
|
346
346
|
body.phoneNumber,
|
|
347
347
|
acctSid,
|
|
@@ -353,7 +353,7 @@ export async function handleAssignTwilioNumber(
|
|
|
353
353
|
|
|
354
354
|
return Response.json({
|
|
355
355
|
success: true,
|
|
356
|
-
hasCredentials: hasTwilioCredentials(),
|
|
356
|
+
hasCredentials: await hasTwilioCredentials(),
|
|
357
357
|
phoneNumber: body.phoneNumber,
|
|
358
358
|
warning: webhookWarning,
|
|
359
359
|
});
|
|
@@ -367,7 +367,7 @@ export async function handleAssignTwilioNumber(
|
|
|
367
367
|
export async function handleReleaseTwilioNumber(
|
|
368
368
|
req: Request,
|
|
369
369
|
): Promise<Response> {
|
|
370
|
-
if (!hasTwilioCredentials()) {
|
|
370
|
+
if (!(await hasTwilioCredentials())) {
|
|
371
371
|
return Response.json({
|
|
372
372
|
success: false,
|
|
373
373
|
hasCredentials: false,
|
|
@@ -389,7 +389,7 @@ export async function handleReleaseTwilioNumber(
|
|
|
389
389
|
});
|
|
390
390
|
}
|
|
391
391
|
|
|
392
|
-
const { accountSid, authToken } = getTwilioCredentials();
|
|
392
|
+
const { accountSid, authToken } = await getTwilioCredentials();
|
|
393
393
|
|
|
394
394
|
await releasePhoneNumber(accountSid, authToken, phoneNumber);
|
|
395
395
|
|
|
@@ -416,7 +416,7 @@ export function twilioRouteDefinitions(): RouteDefinition[] {
|
|
|
416
416
|
{
|
|
417
417
|
endpoint: "integrations/twilio/config",
|
|
418
418
|
method: "GET",
|
|
419
|
-
handler: () => handleGetTwilioConfig(),
|
|
419
|
+
handler: async () => handleGetTwilioConfig(),
|
|
420
420
|
},
|
|
421
421
|
{
|
|
422
422
|
endpoint: "integrations/twilio/credentials",
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
* Route handlers for invite management.
|
|
3
3
|
*
|
|
4
4
|
* Invites:
|
|
5
|
-
* GET /v1/contacts/invites
|
|
6
|
-
* POST /v1/contacts/invites
|
|
7
|
-
* DELETE /v1/contacts/invites/:id
|
|
8
|
-
* POST /v1/contacts/invites/redeem
|
|
5
|
+
* GET /v1/contacts/invites — list invites
|
|
6
|
+
* POST /v1/contacts/invites — create an invite (supports voice)
|
|
7
|
+
* DELETE /v1/contacts/invites/:id — revoke an invite
|
|
8
|
+
* POST /v1/contacts/invites/redeem — redeem an invite (token or voice code)
|
|
9
|
+
* POST /v1/contacts/invites/:id/call — trigger an outbound call for a phone invite
|
|
9
10
|
*/
|
|
10
11
|
|
|
11
12
|
import type { RouteDefinition } from "../http-router.js";
|
|
@@ -15,6 +16,7 @@ import {
|
|
|
15
16
|
redeemIngressInvite,
|
|
16
17
|
redeemVoiceInviteCode,
|
|
17
18
|
revokeIngressInvite,
|
|
19
|
+
triggerInviteCall,
|
|
18
20
|
} from "../invite-service.js";
|
|
19
21
|
|
|
20
22
|
// ---------------------------------------------------------------------------
|
|
@@ -57,6 +59,7 @@ export async function handleCreateInvite(req: Request): Promise<Response> {
|
|
|
57
59
|
voiceCodeDigits: body.voiceCodeDigits as number | undefined,
|
|
58
60
|
friendName: body.friendName as string | undefined,
|
|
59
61
|
guardianName: body.guardianName as string | undefined,
|
|
62
|
+
contactId: body.contactId as string,
|
|
60
63
|
});
|
|
61
64
|
|
|
62
65
|
if (!result.ok) {
|
|
@@ -141,6 +144,22 @@ export async function handleRedeemInvite(req: Request): Promise<Response> {
|
|
|
141
144
|
return Response.json({ ok: true, invite: result.data });
|
|
142
145
|
}
|
|
143
146
|
|
|
147
|
+
/**
|
|
148
|
+
* POST /v1/contacts/invites/:id/call
|
|
149
|
+
*
|
|
150
|
+
* Trigger an outbound call for a phone invite. The invite must be active and
|
|
151
|
+
* have sourceChannel "phone" with the required voice metadata populated.
|
|
152
|
+
*/
|
|
153
|
+
export async function handleTriggerInviteCall(
|
|
154
|
+
inviteId: string,
|
|
155
|
+
): Promise<Response> {
|
|
156
|
+
const result = await triggerInviteCall(inviteId);
|
|
157
|
+
if (!result.ok) {
|
|
158
|
+
return Response.json({ ok: false, error: result.error }, { status: 400 });
|
|
159
|
+
}
|
|
160
|
+
return Response.json({ ok: true, callSid: result.data.callSid });
|
|
161
|
+
}
|
|
162
|
+
|
|
144
163
|
// ---------------------------------------------------------------------------
|
|
145
164
|
// Route definitions
|
|
146
165
|
// ---------------------------------------------------------------------------
|
|
@@ -168,5 +187,11 @@ export function inviteRouteDefinitions(): RouteDefinition[] {
|
|
|
168
187
|
policyKey: "contacts/invites",
|
|
169
188
|
handler: ({ params }) => handleRevokeInvite(params.id),
|
|
170
189
|
},
|
|
190
|
+
{
|
|
191
|
+
endpoint: "contacts/invites/:id/call",
|
|
192
|
+
method: "POST",
|
|
193
|
+
policyKey: "contacts/invites",
|
|
194
|
+
handler: async ({ params }) => handleTriggerInviteCall(params.id),
|
|
195
|
+
},
|
|
171
196
|
];
|
|
172
197
|
}
|