@gravity-rail/cli 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{account-verify-phone-UA5OUOOR.js → account-verify-phone-Q2NIRSX4.js} +2 -2
- package/dist/{chunk-M4XMXS5D.js → chunk-EITDLX75.js} +6 -1
- package/dist/chunk-EITDLX75.js.map +1 -0
- package/dist/gr.js +407 -32
- package/dist/gr.js.map +1 -1
- package/dist/lib.js +162 -16
- package/dist/lib.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-M4XMXS5D.js.map +0 -1
- /package/dist/{account-verify-phone-UA5OUOOR.js.map → account-verify-phone-Q2NIRSX4.js.map} +0 -0
package/dist/gr.js
CHANGED
|
@@ -3213,7 +3213,7 @@ var init_libphonenumber_js = __esm({
|
|
|
3213
3213
|
}
|
|
3214
3214
|
});
|
|
3215
3215
|
|
|
3216
|
-
// ../sdk/dist/chunk-
|
|
3216
|
+
// ../sdk/dist/chunk-4B7T6MBH.js
|
|
3217
3217
|
function sanitizePhoneForBackend(phoneNumber) {
|
|
3218
3218
|
try {
|
|
3219
3219
|
let parsed = parsePhoneNumber4(phoneNumber);
|
|
@@ -3336,6 +3336,16 @@ function supportRequestParams(params) {
|
|
|
3336
3336
|
const query = searchParams.toString();
|
|
3337
3337
|
return query ? `?${query}` : "";
|
|
3338
3338
|
}
|
|
3339
|
+
function withFilters(params, options) {
|
|
3340
|
+
if (options.dateFrom) params.append("dateFrom", options.dateFrom);
|
|
3341
|
+
if (options.dateTo) params.append("dateTo", options.dateTo);
|
|
3342
|
+
if (options.workflowId !== void 0) params.append("workflowId", String(options.workflowId));
|
|
3343
|
+
return params;
|
|
3344
|
+
}
|
|
3345
|
+
function suffix(params) {
|
|
3346
|
+
const query = params.toString();
|
|
3347
|
+
return query ? `?${query}` : "";
|
|
3348
|
+
}
|
|
3339
3349
|
function createApiModules(apiKey, baseUrl3, customFetch) {
|
|
3340
3350
|
return {
|
|
3341
3351
|
abilities: new AbilitiesApi(apiKey, baseUrl3, customFetch),
|
|
@@ -3378,6 +3388,7 @@ function createApiModules(apiKey, baseUrl3, customFetch) {
|
|
|
3378
3388
|
members: new MembersApi(apiKey, baseUrl3, customFetch),
|
|
3379
3389
|
milestones: new MilestonesApi(apiKey, baseUrl3, customFetch),
|
|
3380
3390
|
motd: new MotdApi(apiKey, baseUrl3, customFetch),
|
|
3391
|
+
trackedLinks: new TrackedLinksApi(apiKey, baseUrl3, customFetch),
|
|
3381
3392
|
confluence: new ConfluenceApi(apiKey, baseUrl3, customFetch),
|
|
3382
3393
|
mondayIntegration: new MondayIntegrationApi(apiKey, baseUrl3, customFetch),
|
|
3383
3394
|
notificationRules: new NotificationRulesApi(apiKey, baseUrl3, customFetch),
|
|
@@ -3469,11 +3480,13 @@ function bindTasksMethods(target, tasks, abilities) {
|
|
|
3469
3480
|
function bindChatsMethods(target, chats) {
|
|
3470
3481
|
target.getChats = chats.getChats.bind(chats);
|
|
3471
3482
|
target.getChat = chats.getChat.bind(chats);
|
|
3483
|
+
target.getCurrentSmsChat = chats.getCurrentSmsChat.bind(chats);
|
|
3472
3484
|
target.getChatCallbacks = chats.getChatCallbacks.bind(chats);
|
|
3473
3485
|
target.cancelChatCallback = chats.cancelChatCallback.bind(chats);
|
|
3474
3486
|
target.getChatTokenUsage = chats.getChatTokenUsage.bind(chats);
|
|
3475
3487
|
target.getChatTodos = chats.getChatTodos.bind(chats);
|
|
3476
3488
|
target.getChatSkills = chats.getChatSkills.bind(chats);
|
|
3489
|
+
target.getManagerSkills = chats.getManagerSkills.bind(chats);
|
|
3477
3490
|
target.getChatsNeedsResponse = chats.getChatsNeedsResponse.bind(chats);
|
|
3478
3491
|
target.getChatsDailyCreationStats = chats.getChatsDailyCreationStats.bind(chats);
|
|
3479
3492
|
target.getToolCallNames = chats.getToolCallNames.bind(chats);
|
|
@@ -3540,6 +3553,16 @@ function bindDashboardsMethods(target, dashboards) {
|
|
|
3540
3553
|
function bindMotdMethods(target, motd) {
|
|
3541
3554
|
target.getMotd = motd.getMotd.bind(motd);
|
|
3542
3555
|
}
|
|
3556
|
+
function bindTrackedLinksMethods(target, trackedLinks) {
|
|
3557
|
+
target.getTrackedLinkSummary = trackedLinks.getTrackedLinkSummary.bind(trackedLinks);
|
|
3558
|
+
target.getTrackedLinkDestinations = trackedLinks.getTrackedLinkDestinations.bind(trackedLinks);
|
|
3559
|
+
target.getTrackedLinkStats = trackedLinks.getTrackedLinkStats.bind(trackedLinks);
|
|
3560
|
+
target.getTrackedLinkTimeseries = trackedLinks.getTrackedLinkTimeseries.bind(trackedLinks);
|
|
3561
|
+
target.createTrackedLinkDestination = trackedLinks.createTrackedLinkDestination.bind(trackedLinks);
|
|
3562
|
+
target.updateTrackedLinkDestination = trackedLinks.updateTrackedLinkDestination.bind(trackedLinks);
|
|
3563
|
+
target.deleteTrackedLinkDestination = trackedLinks.deleteTrackedLinkDestination.bind(trackedLinks);
|
|
3564
|
+
target.clearTrackedLinkDestinations = trackedLinks.clearTrackedLinkDestinations.bind(trackedLinks);
|
|
3565
|
+
}
|
|
3543
3566
|
function bindDataTypesMethods(target, dataTypes) {
|
|
3544
3567
|
target.getDataTypes = dataTypes.getDataTypes.bind(dataTypes);
|
|
3545
3568
|
target.getDataType = dataTypes.getDataType.bind(dataTypes);
|
|
@@ -4012,6 +4035,7 @@ function bindToolkitsMethods(target, toolkits, templates, aiModels, customToolki
|
|
|
4012
4035
|
target.getSTTModels = aiModels.getSTTModels.bind(aiModels);
|
|
4013
4036
|
target.getTTSModels = aiModels.getTTSModels.bind(aiModels);
|
|
4014
4037
|
target.getVoiceModels = aiModels.getVoiceModels.bind(aiModels);
|
|
4038
|
+
target.getVoicePresets = aiModels.getVoicePresets.bind(aiModels);
|
|
4015
4039
|
target.getAllModels = aiModels.getAllModels.bind(aiModels);
|
|
4016
4040
|
target.getCustomToolkits = customToolkits.getCustomToolkits.bind(customToolkits);
|
|
4017
4041
|
target.getCustomToolkit = customToolkits.getCustomToolkit.bind(customToolkits);
|
|
@@ -4423,9 +4447,9 @@ function bindSupportRequestMethods(target, supportRequests) {
|
|
|
4423
4447
|
target.reopenWorkspaceSupportRequest = supportRequests.reopenWorkspaceSupportRequest.bind(supportRequests);
|
|
4424
4448
|
target.clickWorkspaceSupportRequestResource = supportRequests.clickWorkspaceSupportRequestResource.bind(supportRequests);
|
|
4425
4449
|
}
|
|
4426
|
-
var AbilitiesApi, AccessGrantsApi, AgentTasksApi, AgentsApi, AIModelsApi, ApiKeysApi, AppsApi, AssignmentsApi, VoiceApi, AuthApi, BuildersApi, CalendarsApi, CallsApi, CELApi, ChatsApi, ConfluenceApi, CustomToolkitsApi, DataTypesApi, DiscordBotsApi, SlackAppsApi, EventsApi, FeaturesApi, FhirConnectionsApi, InboundFaxStatus, DocumoFaxApi, HealthieApi, FilesApi, InboxesApi, InquiriesApi, AppConnectionsApi, McpServersApi, MemberImportValidationError, MembersApi, MilestonesApi, MondayIntegrationApi, NotificationRulesApi, OperatorApi, OrgApi, OAuthConnectionsApi, OAuthApi, PhoneNumbersApi, PronunciationsApi, PromptsApi, PersonasApi, QueriesApi, QualificationsApi, ReportsApi, SalesforceApi, ConnectionSyncApi, HubspotApi, SitesApi, SubscriptionsApi, SupportRequestsApi, CustomersApi, ResellersApi, SupervisorsApi, TasksApi, TemplatesApi, ToolkitsApi, JourneysApi, WorkflowsApi, WorkflowNotesApi, EventRuleEventType, DriverMode, WorkspaceInvitationsApi, WorkspacesApi, DashboardsApi, TeamsAppsApi, ExperimentsApi, PatientSyncConnectionsApi, MotdApi, WORKSPACE_METHOD_NAMES, WORKSPACE_METHOD_NAME_SET, GravityRailClient, WIDGET_SLUGS, CHAT_TYPES, BUILTIN_ASSISTANT_CHAT_TYPES, MEMBER_AGENT_CHAT_TYPES;
|
|
4427
|
-
var
|
|
4428
|
-
"../sdk/dist/chunk-
|
|
4450
|
+
var AbilitiesApi, AccessGrantsApi, AgentTasksApi, AgentsApi, AIModelsApi, ApiKeysApi, AppsApi, AssignmentsApi, VoiceApi, AuthApi, BuildersApi, CalendarsApi, CallsApi, CELApi, ChatsApi, ConfluenceApi, CustomToolkitsApi, DataTypesApi, DiscordBotsApi, SlackAppsApi, EventsApi, FeaturesApi, FhirConnectionsApi, InboundFaxStatus, DocumoFaxApi, HealthieApi, FilesApi, InboxesApi, InquiriesApi, AppConnectionsApi, McpServersApi, MemberImportValidationError, MembersApi, MilestonesApi, MondayIntegrationApi, NotificationRulesApi, OperatorApi, OrgApi, OAuthConnectionsApi, OAuthApi, PhoneNumbersApi, PronunciationsApi, PromptsApi, PersonasApi, QueriesApi, QualificationsApi, ReportsApi, SalesforceApi, ConnectionSyncApi, HubspotApi, SitesApi, SubscriptionsApi, SupportRequestsApi, CustomersApi, ResellersApi, SupervisorsApi, TasksApi, TemplatesApi, ToolkitsApi, JourneysApi, WorkflowsApi, WorkflowNotesApi, EventRuleEventType, DriverMode, WorkspaceInvitationsApi, WorkspacesApi, DashboardsApi, TeamsAppsApi, ExperimentsApi, PatientSyncConnectionsApi, MotdApi, TrackedLinksApi, WORKSPACE_METHOD_NAMES, WORKSPACE_METHOD_NAME_SET, GravityRailClient, WIDGET_SLUGS, CHAT_TYPES, BUILTIN_ASSISTANT_CHAT_TYPES, MEMBER_AGENT_CHAT_TYPES;
|
|
4451
|
+
var init_chunk_4B7T6MBH = __esm({
|
|
4452
|
+
"../sdk/dist/chunk-4B7T6MBH.js"() {
|
|
4429
4453
|
init_chunk_GP6ICMWF();
|
|
4430
4454
|
init_libphonenumber_js();
|
|
4431
4455
|
AbilitiesApi = class extends BaseApiClient {
|
|
@@ -4684,6 +4708,18 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
4684
4708
|
const url = queryString ? `ai-models/realtime?${queryString}` : "ai-models/realtime";
|
|
4685
4709
|
return this.fetch(url);
|
|
4686
4710
|
}
|
|
4711
|
+
/**
|
|
4712
|
+
* Get the voice presets offered by the simplified voice picker.
|
|
4713
|
+
*
|
|
4714
|
+
* A preset bundles a realtime speech-to-speech model with one of its native
|
|
4715
|
+
* voices and the settings recommended alongside it, so choosing a voice is
|
|
4716
|
+
* a single decision. Apply one by assigning its `config` wholesale; compare
|
|
4717
|
+
* against it to tell a preset selection from a customised ("Custom") one.
|
|
4718
|
+
* The full engine/voice/settings matrix lives on `getRealtimeModels`.
|
|
4719
|
+
*/
|
|
4720
|
+
async getVoicePresets() {
|
|
4721
|
+
return this.fetch("ai-models/voice-presets");
|
|
4722
|
+
}
|
|
4687
4723
|
/**
|
|
4688
4724
|
* Get available voice models with metadata
|
|
4689
4725
|
*/
|
|
@@ -5684,6 +5720,8 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
5684
5720
|
if (options.mine !== void 0) params.append("mine", options.mine.toString());
|
|
5685
5721
|
if (options.needsResponse !== void 0)
|
|
5686
5722
|
params.append("needsResponse", options.needsResponse.toString());
|
|
5723
|
+
if (options.needsResponseFirst !== void 0)
|
|
5724
|
+
params.append("needsResponseFirst", options.needsResponseFirst.toString());
|
|
5687
5725
|
if (options.paused !== void 0) params.append("paused", options.paused.toString());
|
|
5688
5726
|
if (options.archived !== void 0) params.append("archived", options.archived.toString());
|
|
5689
5727
|
if (options.channel) params.append("channel", options.channel);
|
|
@@ -5733,6 +5771,25 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
5733
5771
|
async getChat(wid, id) {
|
|
5734
5772
|
return this.fetch(`w/${wid}/chats/${id}`);
|
|
5735
5773
|
}
|
|
5774
|
+
/**
|
|
5775
|
+
* Create-chat preflight for SMS: is a conversation already live between this
|
|
5776
|
+
* workspace number and this member?
|
|
5777
|
+
*
|
|
5778
|
+
* An SMS conversation with a member is a single stream — inbound SMS resolves
|
|
5779
|
+
* to ONE current chat per (member phone, workspace phone) pair — so creating
|
|
5780
|
+
* a new SMS chat SUPERSEDES the existing one and the member's next reply
|
|
5781
|
+
* lands on the new chat. Callers use this to say so before committing.
|
|
5782
|
+
*
|
|
5783
|
+
* Read-only, `chats:read`, and PHI-safe by construction: status and timing
|
|
5784
|
+
* only, no message content and no chat title.
|
|
5785
|
+
*/
|
|
5786
|
+
async getCurrentSmsChat(wid, options) {
|
|
5787
|
+
const params = new URLSearchParams({
|
|
5788
|
+
memberId: options.memberId.toString(),
|
|
5789
|
+
phoneNumberId: options.phoneNumberId.toString()
|
|
5790
|
+
});
|
|
5791
|
+
return this.fetch(`w/${wid}/chats/current-sms?${params}`);
|
|
5792
|
+
}
|
|
5736
5793
|
/** Get token usage statistics for a chat. */
|
|
5737
5794
|
async getChatTokenUsage(wid, chatId) {
|
|
5738
5795
|
return this.fetch(`w/${wid}/chats/${chatId}/token-usage`);
|
|
@@ -5758,6 +5815,10 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
5758
5815
|
`w/${wid}/chats/${chatId}/skills`
|
|
5759
5816
|
);
|
|
5760
5817
|
}
|
|
5818
|
+
/** List built-in skills that can be selected before starting a Manager Chat. */
|
|
5819
|
+
async getManagerSkills(wid) {
|
|
5820
|
+
return this.fetch(`w/${wid}/chats/manager/skills`);
|
|
5821
|
+
}
|
|
5761
5822
|
/** List chat IDs that need a response. */
|
|
5762
5823
|
async getChatsNeedsResponse(wid) {
|
|
5763
5824
|
return this.fetch(`w/${wid}/chats/needs-response`);
|
|
@@ -7143,9 +7204,9 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
7143
7204
|
params?.status?.forEach((value) => query.append("status", value));
|
|
7144
7205
|
if (params?.receivedAfter) query.set("receivedAfter", params.receivedAfter);
|
|
7145
7206
|
if (params?.receivedBefore) query.set("receivedBefore", params.receivedBefore);
|
|
7146
|
-
const
|
|
7207
|
+
const suffix2 = query.toString() === "" ? "" : `?${query.toString()}`;
|
|
7147
7208
|
return this.fetch(
|
|
7148
|
-
`w/${wid}/app-connections/documo-fax/faxes${
|
|
7209
|
+
`w/${wid}/app-connections/documo-fax/faxes${suffix2}`
|
|
7149
7210
|
);
|
|
7150
7211
|
}
|
|
7151
7212
|
/**
|
|
@@ -9127,15 +9188,19 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
9127
9188
|
async getA2PStatus(orgUuid) {
|
|
9128
9189
|
return this.fetch(`o/${orgUuid}/phone-numbers/a2p/status`);
|
|
9129
9190
|
}
|
|
9191
|
+
/** Return fixed phone-number and outbound-messaging prices. */
|
|
9192
|
+
async getPhoneBillingPricing(orgUuid) {
|
|
9193
|
+
return this.fetch(`o/${orgUuid}/phone-numbers/pricing`);
|
|
9194
|
+
}
|
|
9130
9195
|
/**
|
|
9131
9196
|
* Start A2P brand registration under a legal entity. `legalEntityUuid`
|
|
9132
9197
|
* is required — brands register per legal entity (Customer Profile);
|
|
9133
9198
|
* there is no primary-entity fallback.
|
|
9134
9199
|
*/
|
|
9135
|
-
async startA2PRegistration(orgUuid, legalEntityUuid, brandName, brandDescription) {
|
|
9200
|
+
async startA2PRegistration(orgUuid, legalEntityUuid, brandName, brandDescription, brandUuid = null) {
|
|
9136
9201
|
return this.fetch(`o/${orgUuid}/phone-numbers/a2p/start`, {
|
|
9137
9202
|
method: "POST",
|
|
9138
|
-
body: JSON.stringify({ legalEntityUuid, brandName, brandDescription })
|
|
9203
|
+
body: JSON.stringify({ legalEntityUuid, brandName, brandDescription, brandUuid })
|
|
9139
9204
|
});
|
|
9140
9205
|
}
|
|
9141
9206
|
/**
|
|
@@ -9341,14 +9406,34 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
9341
9406
|
);
|
|
9342
9407
|
}
|
|
9343
9408
|
/**
|
|
9344
|
-
* The brand
|
|
9345
|
-
*
|
|
9409
|
+
* The brand's enrollment-form template URL (carries `?brand=…`, no
|
|
9410
|
+
* credential). `url` is null until a Site is linked. Do not append a
|
|
9411
|
+
* patient identifier to this URL — use {@link mintA2PBrandEnrollmentLink}
|
|
9412
|
+
* to get a patient-ready link instead.
|
|
9346
9413
|
*/
|
|
9347
9414
|
async getA2PBrandEnrollmentUrl(orgUuid, brandUuid) {
|
|
9348
9415
|
return this.fetch(
|
|
9349
9416
|
`o/${orgUuid}/a2p-brands/${brandUuid}/enrollment-url`
|
|
9350
9417
|
);
|
|
9351
9418
|
}
|
|
9419
|
+
/**
|
|
9420
|
+
* Mint a patient-ready enrollment link for one patient.
|
|
9421
|
+
*
|
|
9422
|
+
* The returned URL carries a fresh, expiring, single-use `?grant=…` bound to
|
|
9423
|
+
* the member that `externalId` resolves to. `externalId` (the patient's
|
|
9424
|
+
* CRM/EHR identifier) travels in the request body, never the query string,
|
|
9425
|
+
* so it stays out of access logs. When it matches no member, the
|
|
9426
|
+
* credential-free template URL is returned rather than an error.
|
|
9427
|
+
*/
|
|
9428
|
+
async mintA2PBrandEnrollmentLink(orgUuid, brandUuid, externalId) {
|
|
9429
|
+
return this.fetch(
|
|
9430
|
+
`o/${orgUuid}/a2p-brands/${brandUuid}/enrollment-url`,
|
|
9431
|
+
{
|
|
9432
|
+
method: "POST",
|
|
9433
|
+
body: JSON.stringify({ externalId })
|
|
9434
|
+
}
|
|
9435
|
+
);
|
|
9436
|
+
}
|
|
9352
9437
|
/**
|
|
9353
9438
|
* List available member roles for a workspace in the organization.
|
|
9354
9439
|
*/
|
|
@@ -11674,11 +11759,13 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
11674
11759
|
EventRuleEventType2["DATA_RECORD_UPDATED"] = "data_record:updated";
|
|
11675
11760
|
EventRuleEventType2["DATA_RECORD_CHANGED"] = "data_record:changed";
|
|
11676
11761
|
EventRuleEventType2["CHAT_CREATED"] = "chat:created";
|
|
11762
|
+
EventRuleEventType2["CHAT_SUMMARY"] = "chat:summary";
|
|
11677
11763
|
EventRuleEventType2["CHAT_CALLBACK"] = "chat:callback";
|
|
11678
11764
|
EventRuleEventType2["MEMBER_UPDATED"] = "member:updated";
|
|
11679
11765
|
EventRuleEventType2["ROUTINE_TRIGGERED"] = "routine:triggered";
|
|
11680
11766
|
EventRuleEventType2["ASSISTANT_MESSAGE"] = "workflow:assistant_message";
|
|
11681
11767
|
EventRuleEventType2["USER_MESSAGE"] = "workflow:user_message";
|
|
11768
|
+
EventRuleEventType2["WORKFLOW_EXECUTE"] = "workflow:execute";
|
|
11682
11769
|
EventRuleEventType2["CALENDAR_EVENT_CREATED"] = "calendar_event:created";
|
|
11683
11770
|
EventRuleEventType2["CALENDAR_EVENT_UPDATED"] = "calendar_event:updated";
|
|
11684
11771
|
EventRuleEventType2["CALENDAR_EVENT_CANCELLED"] = "calendar_event:cancelled";
|
|
@@ -12075,6 +12162,20 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
12075
12162
|
if (featured !== void 0) params.set("featured", String(featured));
|
|
12076
12163
|
return this.fetch(`products?${params.toString()}`);
|
|
12077
12164
|
}
|
|
12165
|
+
/**
|
|
12166
|
+
* Check whether a promo code is usable, without redeeming it.
|
|
12167
|
+
*
|
|
12168
|
+
* Reserves nothing, so it is safe to call as a form field settles. Redemption
|
|
12169
|
+
* happens server-side after checkout completes, when the organization and its
|
|
12170
|
+
* subscription exist.
|
|
12171
|
+
*/
|
|
12172
|
+
async previewPromoCode(code, options) {
|
|
12173
|
+
return this.fetch("promo-codes/preview", {
|
|
12174
|
+
method: "POST",
|
|
12175
|
+
body: JSON.stringify({ code }),
|
|
12176
|
+
signal: options?.signal
|
|
12177
|
+
});
|
|
12178
|
+
}
|
|
12078
12179
|
/** Get a publicly accessible product by ID. */
|
|
12079
12180
|
async getPublicProduct(id) {
|
|
12080
12181
|
return this.fetch(`products/${id}`);
|
|
@@ -12415,6 +12516,106 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
12415
12516
|
return this.fetch(`w/${wid}/motd${query ? `?${query}` : ""}`);
|
|
12416
12517
|
}
|
|
12417
12518
|
};
|
|
12519
|
+
TrackedLinksApi = class extends BaseApiClient {
|
|
12520
|
+
/** Header counters plus whether shortening is configured and enabled. */
|
|
12521
|
+
async getTrackedLinkSummary(wid, options = {}) {
|
|
12522
|
+
const params = withFilters(new URLSearchParams(), options);
|
|
12523
|
+
return this.fetch(
|
|
12524
|
+
`w/${wid}/tracked-links/summary${suffix(params)}`
|
|
12525
|
+
);
|
|
12526
|
+
}
|
|
12527
|
+
/**
|
|
12528
|
+
* Known destination URLs, most recent first. Powers the "Clicked link"
|
|
12529
|
+
* member-filter autocomplete, so it stays unaggregated and cheap.
|
|
12530
|
+
*/
|
|
12531
|
+
async getTrackedLinkDestinations(wid, options = {}) {
|
|
12532
|
+
const params = new URLSearchParams();
|
|
12533
|
+
if (options.q) params.append("q", options.q);
|
|
12534
|
+
if (options.limit !== void 0) params.append("limit", String(options.limit));
|
|
12535
|
+
return this.fetch(
|
|
12536
|
+
`w/${wid}/tracked-links/destinations${suffix(params)}`
|
|
12537
|
+
);
|
|
12538
|
+
}
|
|
12539
|
+
/**
|
|
12540
|
+
* Register a destination an author can reference as `{{links.<key>}}`.
|
|
12541
|
+
*
|
|
12542
|
+
* The URL is deduplicated server-side, so registering one the workspace
|
|
12543
|
+
* already knows adopts that destination — including a row the retired
|
|
12544
|
+
* auto-harvest left unnamed, whose click history then carries forward
|
|
12545
|
+
* under the new key. Registering a URL that already has a *different* key
|
|
12546
|
+
* is a 409: renaming is what `updateTrackedLinkDestination` is for.
|
|
12547
|
+
*
|
|
12548
|
+
* Keys use the same grammar as snippet keys: lowercase letters, digits,
|
|
12549
|
+
* underscores and dots, starting with a letter (`intake_form`,
|
|
12550
|
+
* `docs.privacy`). No hyphens — Jinja2 reads `links.spring-2026` as
|
|
12551
|
+
* subtraction.
|
|
12552
|
+
*/
|
|
12553
|
+
async createTrackedLinkDestination(wid, data) {
|
|
12554
|
+
return this.fetch(`w/${wid}/tracked-links/destinations`, {
|
|
12555
|
+
method: "POST",
|
|
12556
|
+
body: JSON.stringify(data)
|
|
12557
|
+
});
|
|
12558
|
+
}
|
|
12559
|
+
/**
|
|
12560
|
+
* Re-key or relabel a destination.
|
|
12561
|
+
*
|
|
12562
|
+
* Changing `key` breaks templates: `{{links.old}}` stops resolving and the
|
|
12563
|
+
* message ships without its link. Relabelling (`name`) is always safe.
|
|
12564
|
+
* Passing `key: null` releases the handle so another destination can take
|
|
12565
|
+
* it — the non-destructive alternative to deleting, which would take the
|
|
12566
|
+
* click history with it. The URL is not editable.
|
|
12567
|
+
*/
|
|
12568
|
+
async updateTrackedLinkDestination(wid, destinationId, data) {
|
|
12569
|
+
return this.fetch(
|
|
12570
|
+
`w/${wid}/tracked-links/destinations/${destinationId}`,
|
|
12571
|
+
{ method: "PUT", body: JSON.stringify(data) }
|
|
12572
|
+
);
|
|
12573
|
+
}
|
|
12574
|
+
/** Per-destination sent / clicks / unique clickers / CTR for the window. */
|
|
12575
|
+
async getTrackedLinkStats(wid, options = {}) {
|
|
12576
|
+
const params = withFilters(new URLSearchParams(), options);
|
|
12577
|
+
if (options.page !== void 0) params.append("page", String(options.page));
|
|
12578
|
+
if (options.pageSize !== void 0) params.append("pageSize", String(options.pageSize));
|
|
12579
|
+
if (options.q) params.append("q", options.q);
|
|
12580
|
+
if (options.sortBy) params.append("sortBy", options.sortBy);
|
|
12581
|
+
if (options.sortOrder) params.append("sortOrder", options.sortOrder);
|
|
12582
|
+
return this.fetch(
|
|
12583
|
+
`w/${wid}/tracked-links${suffix(params)}`
|
|
12584
|
+
);
|
|
12585
|
+
}
|
|
12586
|
+
/** Clicks over time for the current filter selection. */
|
|
12587
|
+
async getTrackedLinkTimeseries(wid, options = {}) {
|
|
12588
|
+
const params = withFilters(new URLSearchParams(), options);
|
|
12589
|
+
if (options.destinationId !== void 0) {
|
|
12590
|
+
params.append("destinationId", String(options.destinationId));
|
|
12591
|
+
}
|
|
12592
|
+
if (options.granularity) params.append("granularity", options.granularity);
|
|
12593
|
+
if (options.tz) params.append("tz", options.tz);
|
|
12594
|
+
return this.fetch(
|
|
12595
|
+
`w/${wid}/tracked-links/timeseries${suffix(params)}`
|
|
12596
|
+
);
|
|
12597
|
+
}
|
|
12598
|
+
/**
|
|
12599
|
+
* Delete one destination: its short links stop resolving and its recorded
|
|
12600
|
+
* clicks are removed.
|
|
12601
|
+
*
|
|
12602
|
+
* Turning the workspace setting off only stops NEW links being minted —
|
|
12603
|
+
* links already delivered to members keep working. This is the deliberate
|
|
12604
|
+
* way to break them.
|
|
12605
|
+
*/
|
|
12606
|
+
async deleteTrackedLinkDestination(wid, destinationId) {
|
|
12607
|
+
return this.fetch(
|
|
12608
|
+
`w/${wid}/tracked-links/destinations/${destinationId}`,
|
|
12609
|
+
{ method: "DELETE" }
|
|
12610
|
+
);
|
|
12611
|
+
}
|
|
12612
|
+
/** Delete every destination, its links, and its clicks. Irreversible. */
|
|
12613
|
+
async clearTrackedLinkDestinations(wid) {
|
|
12614
|
+
return this.fetch(`w/${wid}/tracked-links/destinations`, {
|
|
12615
|
+
method: "DELETE"
|
|
12616
|
+
});
|
|
12617
|
+
}
|
|
12618
|
+
};
|
|
12418
12619
|
WORKSPACE_METHOD_NAMES = [
|
|
12419
12620
|
"activateWorkflowRevision",
|
|
12420
12621
|
"addGroupMember",
|
|
@@ -12449,6 +12650,7 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
12449
12650
|
"checkSiteSlugAvailability",
|
|
12450
12651
|
"clearConnectionMemberExclusion",
|
|
12451
12652
|
"clearMemberSwitch",
|
|
12653
|
+
"clearTrackedLinkDestinations",
|
|
12452
12654
|
"clickWorkspaceSupportRequestResource",
|
|
12453
12655
|
"cloneDataType",
|
|
12454
12656
|
"cloneTask",
|
|
@@ -12524,6 +12726,7 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
12524
12726
|
"createSupervisor",
|
|
12525
12727
|
"createTask",
|
|
12526
12728
|
"createTeamsApp",
|
|
12729
|
+
"createTrackedLinkDestination",
|
|
12527
12730
|
"createWorkflow",
|
|
12528
12731
|
"createWorkflowContributor",
|
|
12529
12732
|
"createWorkflowFromTemplate",
|
|
@@ -12589,6 +12792,7 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
12589
12792
|
"deleteSupervisor",
|
|
12590
12793
|
"deleteTask",
|
|
12591
12794
|
"deleteTeamsApp",
|
|
12795
|
+
"deleteTrackedLinkDestination",
|
|
12592
12796
|
"deleteWidgetDomain",
|
|
12593
12797
|
"deleteWorkflow",
|
|
12594
12798
|
"deleteWorkflowContributor",
|
|
@@ -12713,6 +12917,7 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
12713
12917
|
"getChatModelOverride",
|
|
12714
12918
|
"getChatPhoneCalls",
|
|
12715
12919
|
"getChatSkills",
|
|
12920
|
+
"getManagerSkills",
|
|
12716
12921
|
"getChatTodos",
|
|
12717
12922
|
"getChatTokenUsage",
|
|
12718
12923
|
"getChatToolCallMessages",
|
|
@@ -12728,6 +12933,7 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
12728
12933
|
"getConnectionSyncConfig",
|
|
12729
12934
|
"getCredentialUpdateInvites",
|
|
12730
12935
|
"getCurrentMember",
|
|
12936
|
+
"getCurrentSmsChat",
|
|
12731
12937
|
"getCustomToolkit",
|
|
12732
12938
|
"getCustomToolkits",
|
|
12733
12939
|
"getDashboard",
|
|
@@ -12892,6 +13098,7 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
12892
13098
|
"getPublicFolder",
|
|
12893
13099
|
"getPublicFolderFiles",
|
|
12894
13100
|
"getPublicProducts",
|
|
13101
|
+
"previewPromoCode",
|
|
12895
13102
|
"getQualification",
|
|
12896
13103
|
"getQualifications",
|
|
12897
13104
|
"getRecordingInfo",
|
|
@@ -12938,6 +13145,10 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
12938
13145
|
"getTool",
|
|
12939
13146
|
"getToolCallNames",
|
|
12940
13147
|
"getToolkits",
|
|
13148
|
+
"getTrackedLinkDestinations",
|
|
13149
|
+
"getTrackedLinkStats",
|
|
13150
|
+
"getTrackedLinkSummary",
|
|
13151
|
+
"getTrackedLinkTimeseries",
|
|
12941
13152
|
"getUnreadNotificationCount",
|
|
12942
13153
|
"getUsageDashboard",
|
|
12943
13154
|
"getVariableRegistry",
|
|
@@ -13172,6 +13383,7 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
13172
13383
|
"updateTask",
|
|
13173
13384
|
"updateTeamsApp",
|
|
13174
13385
|
"updateThemeSettings",
|
|
13386
|
+
"updateTrackedLinkDestination",
|
|
13175
13387
|
"uploadFile",
|
|
13176
13388
|
"updateVoicemailStatus",
|
|
13177
13389
|
"updateWorkflow",
|
|
@@ -13215,11 +13427,13 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
13215
13427
|
// Chats API
|
|
13216
13428
|
getChats;
|
|
13217
13429
|
getChat;
|
|
13430
|
+
getCurrentSmsChat;
|
|
13218
13431
|
getChatCallbacks;
|
|
13219
13432
|
cancelChatCallback;
|
|
13220
13433
|
getChatTokenUsage;
|
|
13221
13434
|
getChatTodos;
|
|
13222
13435
|
getChatSkills;
|
|
13436
|
+
getManagerSkills;
|
|
13223
13437
|
getChatsNeedsResponse;
|
|
13224
13438
|
getChatsDailyCreationStats;
|
|
13225
13439
|
getToolCallNames;
|
|
@@ -13407,6 +13621,15 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
13407
13621
|
getDashboardWorkflowAssignmentStats;
|
|
13408
13622
|
// MOTD API
|
|
13409
13623
|
getMotd;
|
|
13624
|
+
// Tracked Links analytics (#10934)
|
|
13625
|
+
getTrackedLinkSummary;
|
|
13626
|
+
getTrackedLinkDestinations;
|
|
13627
|
+
getTrackedLinkStats;
|
|
13628
|
+
getTrackedLinkTimeseries;
|
|
13629
|
+
createTrackedLinkDestination;
|
|
13630
|
+
updateTrackedLinkDestination;
|
|
13631
|
+
deleteTrackedLinkDestination;
|
|
13632
|
+
clearTrackedLinkDestinations;
|
|
13410
13633
|
// Journeys API
|
|
13411
13634
|
getJourneys;
|
|
13412
13635
|
getJourney;
|
|
@@ -13511,6 +13734,7 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
13511
13734
|
getProduct;
|
|
13512
13735
|
getWorkspaceProduct;
|
|
13513
13736
|
getPublicProducts;
|
|
13737
|
+
previewPromoCode;
|
|
13514
13738
|
getPublicProduct;
|
|
13515
13739
|
createProduct;
|
|
13516
13740
|
updateProduct;
|
|
@@ -13865,6 +14089,7 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
13865
14089
|
getSTTModels;
|
|
13866
14090
|
getTTSModels;
|
|
13867
14091
|
getVoiceModels;
|
|
14092
|
+
getVoicePresets;
|
|
13868
14093
|
getAllModels;
|
|
13869
14094
|
getCustomToolkits;
|
|
13870
14095
|
getCustomToolkit;
|
|
@@ -14195,6 +14420,7 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
14195
14420
|
bindQueriesMethods(this, apis.queries);
|
|
14196
14421
|
bindDashboardsMethods(this, apis.dashboards);
|
|
14197
14422
|
bindMotdMethods(this, apis.motd);
|
|
14423
|
+
bindTrackedLinksMethods(this, apis.trackedLinks);
|
|
14198
14424
|
bindJourneysMethods(this, apis.journeys);
|
|
14199
14425
|
bindExperimentsMethods(this, apis.experiments);
|
|
14200
14426
|
bindOperatorMethods(this, apis.operatorGroups);
|
|
@@ -14370,9 +14596,9 @@ var init_chunk_K4MDFGMO = __esm({
|
|
|
14370
14596
|
}
|
|
14371
14597
|
});
|
|
14372
14598
|
|
|
14373
|
-
// ../sdk/dist/chunk-
|
|
14374
|
-
var
|
|
14375
|
-
"../sdk/dist/chunk-
|
|
14599
|
+
// ../sdk/dist/chunk-2YLKG4TT.js
|
|
14600
|
+
var init_chunk_2YLKG4TT = __esm({
|
|
14601
|
+
"../sdk/dist/chunk-2YLKG4TT.js"() {
|
|
14376
14602
|
}
|
|
14377
14603
|
});
|
|
14378
14604
|
|
|
@@ -14380,8 +14606,8 @@ var init_chunk_V7ZKEH4V = __esm({
|
|
|
14380
14606
|
var SEARCHABLE_EVENT_RULE_SOURCE_FIELDS;
|
|
14381
14607
|
var init_dist = __esm({
|
|
14382
14608
|
"../sdk/dist/index.js"() {
|
|
14383
|
-
|
|
14384
|
-
|
|
14609
|
+
init_chunk_4B7T6MBH();
|
|
14610
|
+
init_chunk_2YLKG4TT();
|
|
14385
14611
|
init_chunk_GP6ICMWF();
|
|
14386
14612
|
SEARCHABLE_EVENT_RULE_SOURCE_FIELDS = [
|
|
14387
14613
|
"taskId",
|
|
@@ -15623,6 +15849,10 @@ function outputSingle(data, opts, columns) {
|
|
|
15623
15849
|
break;
|
|
15624
15850
|
}
|
|
15625
15851
|
}
|
|
15852
|
+
function hint(opts, lines) {
|
|
15853
|
+
if ((opts.outputFormat ?? "table") !== "table") return;
|
|
15854
|
+
process.stdout.write("\n" + lines.join("\n") + "\n");
|
|
15855
|
+
}
|
|
15626
15856
|
function stderr2(msg) {
|
|
15627
15857
|
process.stderr.write(msg + "\n");
|
|
15628
15858
|
}
|
|
@@ -16611,8 +16841,8 @@ function crudCommands(config) {
|
|
|
16611
16841
|
requiresWorkspace ? [hctx.workspace, id, cascade] : [id, cascade],
|
|
16612
16842
|
resolveClient
|
|
16613
16843
|
);
|
|
16614
|
-
const
|
|
16615
|
-
process.stdout.write(`Deleted ${entityName} ${id}${
|
|
16844
|
+
const suffix2 = result3 && typeof result3 === "object" && "deletedTaskCount" in result3 && result3.deletedTaskCount ? ` and ${result3.deletedTaskCount} child entities` : "";
|
|
16845
|
+
process.stdout.write(`Deleted ${entityName} ${id}${suffix2}
|
|
16616
16846
|
`);
|
|
16617
16847
|
} else {
|
|
16618
16848
|
await callApiWithId(
|
|
@@ -17130,6 +17360,43 @@ var agentTasksDomain = {
|
|
|
17130
17360
|
// src/domains/agents.ts
|
|
17131
17361
|
init_output();
|
|
17132
17362
|
var COLUMNS = [COL.id(), COL.uuid(), COL.name(), COL.status(), COL.created()];
|
|
17363
|
+
var AGENT_FIELD_REFERENCE = `
|
|
17364
|
+
Field reference for --data JSON (create/update):
|
|
17365
|
+
|
|
17366
|
+
Required on create
|
|
17367
|
+
name (string) Display name
|
|
17368
|
+
chatModelId (string) Text chat model ID (see \`gr ai-models chat\`)
|
|
17369
|
+
e.g. "aws:bedrock:claude-4-5-haiku"
|
|
17370
|
+
|
|
17371
|
+
Optional
|
|
17372
|
+
description (string) Short summary shown in listings
|
|
17373
|
+
systemPrompt (string) Base instructions / identity
|
|
17374
|
+
chatModelConfig (object|null) Chat model overrides (temperature, thinking, \u2026)
|
|
17375
|
+
realtimeModelId (string|null) Voice/realtime model (see \`gr ai-models realtime\`)
|
|
17376
|
+
e.g. "xai:realtime:voice-agent-2" (Grok Voice Think Fast 2)
|
|
17377
|
+
Native models auto-fill tts=native + default voice when
|
|
17378
|
+
realtimeModelConfig is omitted.
|
|
17379
|
+
realtimeModelConfig (object|null) Realtime config. Native example:
|
|
17380
|
+
{"ttsModel":"native","voiceModel":"xai:voice:eve"}
|
|
17381
|
+
Composable (custom:realtime:composable) needs
|
|
17382
|
+
voiceModel + ttsModel + inferenceModel.
|
|
17383
|
+
memberRoleId (number) Role id (omit to use the default Agent role)
|
|
17384
|
+
email / phone / externalId Optional contact fields
|
|
17385
|
+
labelIds (number[]) Member label ids
|
|
17386
|
+
codeInterpreterEnabled (bool)
|
|
17387
|
+
maxDailyActions (number|null)
|
|
17388
|
+
|
|
17389
|
+
Attach an agent\u2019s models/identity to a workflow (draft), then publish:
|
|
17390
|
+
gr workflows update --id <wf> -d '{"copyFromAgentId": <agentId>}'
|
|
17391
|
+
gr workflows publish --id <wf>
|
|
17392
|
+
|
|
17393
|
+
One-shot workflow voice WITHOUT creating an agent (preferred for "use Grok Voice 2"):
|
|
17394
|
+
gr workflows update --id <wf> -d '{"realtimeModelId":"xai:realtime:voice-agent-2"}'
|
|
17395
|
+
gr workflows publish --id <wf>
|
|
17396
|
+
|
|
17397
|
+
List models:
|
|
17398
|
+
gr ai-models chat | realtime | voice
|
|
17399
|
+
`;
|
|
17133
17400
|
var agentsDomain = {
|
|
17134
17401
|
name: "agents",
|
|
17135
17402
|
description: "Manage agents",
|
|
@@ -17146,9 +17413,16 @@ var agentsDomain = {
|
|
|
17146
17413
|
unarchiveMethod: "unarchiveAgent",
|
|
17147
17414
|
columns: COLUMNS,
|
|
17148
17415
|
paginationSupport: "full",
|
|
17149
|
-
|
|
17416
|
+
createHelp: `Create an agent
|
|
17417
|
+
${AGENT_FIELD_REFERENCE}`,
|
|
17418
|
+
updateHelp: `Update an agent. All fields optional.
|
|
17419
|
+
${AGENT_FIELD_REFERENCE}`,
|
|
17420
|
+
createExamples: [
|
|
17421
|
+
`gr agents create -d '{"name":"Support","chatModelId":"aws:bedrock:claude-4-5-haiku","realtimeModelId":"xai:realtime:voice-agent-2"}'`,
|
|
17422
|
+
"gr agents create --file agent.json"
|
|
17423
|
+
],
|
|
17150
17424
|
updateExamples: [
|
|
17151
|
-
`gr agents update --id 42
|
|
17425
|
+
`gr agents update --id 42 -d '{"realtimeModelId":"xai:realtime:voice-agent-2"}'`,
|
|
17152
17426
|
"gr agents update --id 42 --file agent.json"
|
|
17153
17427
|
]
|
|
17154
17428
|
})
|
|
@@ -18132,8 +18406,26 @@ Core
|
|
|
18132
18406
|
name (string) Display name
|
|
18133
18407
|
description (string, optional)
|
|
18134
18408
|
defaultPhoneNumberId (number|null) Outbound caller ID (workspace phone id)
|
|
18409
|
+
defaultInboxId (number|null) Default inbox for inbound messaging
|
|
18135
18410
|
permissions (object, optional) Workflow-level permission flags
|
|
18136
18411
|
|
|
18412
|
+
Assistant / models (live on the DRAFT revision \u2014 publish to go live)
|
|
18413
|
+
assistantName (string) Display name for the workflow assistant
|
|
18414
|
+
assistantIdentity (string) Persona / identity instructions
|
|
18415
|
+
chatModelId (string) Text chat model (see \`gr ai-models chat\`)
|
|
18416
|
+
chatModelConfig (object|null) Chat model overrides
|
|
18417
|
+
realtimeModelId (string|null) Voice/realtime model (see \`gr ai-models realtime\`)
|
|
18418
|
+
One-shot voice example:
|
|
18419
|
+
{"realtimeModelId":"xai:realtime:voice-agent-2"}
|
|
18420
|
+
Native models auto-fill tts=native + default voice
|
|
18421
|
+
(xAI \u2192 xai:voice:eve). Optional explicit config:
|
|
18422
|
+
{"realtimeModelId":"xai:realtime:voice-agent-2",
|
|
18423
|
+
"realtimeModelConfig":{"ttsModel":"native",
|
|
18424
|
+
"voiceModel":"xai:voice:ara"}}
|
|
18425
|
+
realtimeModelConfig (object|null) Realtime config; omit for provider defaults
|
|
18426
|
+
copyFromAgentId (number) Copy full assistant settings from an agent
|
|
18427
|
+
copyFromWorkflowRevisionId (number) Copy assistant settings from a revision
|
|
18428
|
+
|
|
18137
18429
|
Member role access (memberRoleAccess)
|
|
18138
18430
|
Array of objects, NOT bare role ids:
|
|
18139
18431
|
[{"memberRoleId": 6, "accessMode": 1}]
|
|
@@ -18159,6 +18451,9 @@ Use the dedicated commands:
|
|
|
18159
18451
|
workflows revisions edit Branch a published revision back into the draft
|
|
18160
18452
|
workflows revisions diff Compare two revisions
|
|
18161
18453
|
workflows revisions update Edit a revision's label / publish notes
|
|
18454
|
+
|
|
18455
|
+
After changing assistant/realtime fields, publish so live traffic picks them up:
|
|
18456
|
+
gr workflows publish --id <workflowId>
|
|
18162
18457
|
`;
|
|
18163
18458
|
|
|
18164
18459
|
// src/domains/workflows.ts
|
|
@@ -18791,7 +19086,15 @@ var COLUMNS6 = [
|
|
|
18791
19086
|
COL.status(),
|
|
18792
19087
|
COL.created()
|
|
18793
19088
|
];
|
|
18794
|
-
var PRODUCT_COLUMNS = [
|
|
19089
|
+
var PRODUCT_COLUMNS = [
|
|
19090
|
+
COL.id(),
|
|
19091
|
+
COL.uuid(),
|
|
19092
|
+
COL.name(),
|
|
19093
|
+
COL.status(),
|
|
19094
|
+
// The plan a flow picks when it cannot ask (the signup funnel's workspace step,
|
|
19095
|
+
// for one). One per type per catalogue — see `gr workspaces products set-default`.
|
|
19096
|
+
{ header: "DEFAULT", getValue: (item) => item.isDefault ? "yes" : "\u2014" }
|
|
19097
|
+
];
|
|
18795
19098
|
var INVITATION_COLUMNS = [
|
|
18796
19099
|
COL.id(),
|
|
18797
19100
|
{ header: "EMAIL", getValue: (item) => item.email ?? "" },
|
|
@@ -19227,6 +19530,40 @@ Provisioning started. Watch it come up with:
|
|
|
19227
19530
|
outputSingle(result3, ctx, PRODUCT_COLUMNS);
|
|
19228
19531
|
}
|
|
19229
19532
|
},
|
|
19533
|
+
{
|
|
19534
|
+
path: ["workspaces", "products", "set-default"],
|
|
19535
|
+
description: "Make a plan the one flows pick when they can't ask",
|
|
19536
|
+
mutates: true,
|
|
19537
|
+
requiresWorkspace: true,
|
|
19538
|
+
args: [
|
|
19539
|
+
{ name: "id", description: "Product ID", required: true },
|
|
19540
|
+
{
|
|
19541
|
+
name: "unset",
|
|
19542
|
+
description: "Clear the flag instead, leaving the catalogue with no default",
|
|
19543
|
+
isFlag: true
|
|
19544
|
+
}
|
|
19545
|
+
],
|
|
19546
|
+
examples: [
|
|
19547
|
+
"gr workspaces products set-default --id 21",
|
|
19548
|
+
"gr workspaces products set-default --id 21 --unset"
|
|
19549
|
+
],
|
|
19550
|
+
handler: async ({ ctx, args, workspace }) => {
|
|
19551
|
+
const id = requireNumber(args, "id");
|
|
19552
|
+
const isDefault = !args["unset"];
|
|
19553
|
+
const result3 = await requireAuth(ctx).apiClient.updateProduct(workspace, id, {
|
|
19554
|
+
isDefault
|
|
19555
|
+
});
|
|
19556
|
+
outputSingle(result3, ctx, PRODUCT_COLUMNS);
|
|
19557
|
+
hint(ctx, [
|
|
19558
|
+
isDefault ? "Any other plan of this type in the catalogue is no longer the default." : (
|
|
19559
|
+
// Only this plan's flag is cleared. Claiming the catalogue now has
|
|
19560
|
+
// no default would be wrong when a different plan holds it — the
|
|
19561
|
+
// response cannot tell us whether this one was the holder.
|
|
19562
|
+
"This plan no longer holds the default flag. Check which plan does:\n gr workspaces products list"
|
|
19563
|
+
)
|
|
19564
|
+
]);
|
|
19565
|
+
}
|
|
19566
|
+
},
|
|
19230
19567
|
// Invitations — workspace-scoped admin methods
|
|
19231
19568
|
{
|
|
19232
19569
|
path: ["workspaces", "invitations", "list"],
|
|
@@ -23429,7 +23766,7 @@ var COLUMNS14 = [
|
|
|
23429
23766
|
];
|
|
23430
23767
|
var aiModelsDomain = {
|
|
23431
23768
|
name: "ai-models",
|
|
23432
|
-
description:
|
|
23769
|
+
description: `List available AI models (chat, realtime/voice stacks, speaker voices). Use realtime ids as workflow/agent realtimeModelId; voice ids go in realtimeModelConfig.voiceModel. One-shot workflow voice: gr workflows update -d '{"realtimeModelId":"xai:realtime:voice-agent-2"}' then publish.`,
|
|
23433
23770
|
commands: [
|
|
23434
23771
|
{
|
|
23435
23772
|
path: ["ai-models", "list"],
|
|
@@ -23442,7 +23779,7 @@ var aiModelsDomain = {
|
|
|
23442
23779
|
},
|
|
23443
23780
|
{
|
|
23444
23781
|
path: ["ai-models", "chat"],
|
|
23445
|
-
description: "List chat models",
|
|
23782
|
+
description: "List chat models (use as chatModelId on agents/workflows)",
|
|
23446
23783
|
requiresWorkspace: false,
|
|
23447
23784
|
handler: async ({ ctx }) => {
|
|
23448
23785
|
const result3 = await requireAuth(ctx).apiClient.getChatModels();
|
|
@@ -23451,7 +23788,7 @@ var aiModelsDomain = {
|
|
|
23451
23788
|
},
|
|
23452
23789
|
{
|
|
23453
23790
|
path: ["ai-models", "realtime"],
|
|
23454
|
-
description: "List realtime
|
|
23791
|
+
description: "List realtime/voice stacks (use as realtimeModelId). e.g. xai:realtime:voice-agent-2 = Grok Voice Think Fast 2",
|
|
23455
23792
|
requiresWorkspace: false,
|
|
23456
23793
|
handler: async ({ ctx }) => {
|
|
23457
23794
|
const result3 = await requireAuth(ctx).apiClient.getRealtimeModels();
|
|
@@ -23460,7 +23797,7 @@ var aiModelsDomain = {
|
|
|
23460
23797
|
},
|
|
23461
23798
|
{
|
|
23462
23799
|
path: ["ai-models", "voice"],
|
|
23463
|
-
description: "List voice
|
|
23800
|
+
description: "List speaker voices (use as realtimeModelConfig.voiceModel). Match provider to the realtime model (xai:voice:* with xAI realtime)",
|
|
23464
23801
|
requiresWorkspace: false,
|
|
23465
23802
|
handler: async ({ ctx }) => {
|
|
23466
23803
|
const result3 = await requireAuth(ctx).apiClient.getVoiceModels();
|
|
@@ -23880,6 +24217,13 @@ var PRODUCT_COLUMNS2 = [
|
|
|
23880
24217
|
const days = p.trialPeriodDays ?? 0;
|
|
23881
24218
|
return days > 0 ? `${days}d` : "\u2014";
|
|
23882
24219
|
}
|
|
24220
|
+
},
|
|
24221
|
+
// Which plan a flow picks when it cannot ask — the signup funnel's workspace
|
|
24222
|
+
// step, for one. Invisible without this: the flag decides what customers get
|
|
24223
|
+
// started on, so reading the catalogue should show it.
|
|
24224
|
+
{
|
|
24225
|
+
header: "DEFAULT",
|
|
24226
|
+
getValue: (p) => p.isDefault ? "yes" : "\u2014"
|
|
23883
24227
|
}
|
|
23884
24228
|
];
|
|
23885
24229
|
var SUBSCRIPTION_COLUMNS = [
|
|
@@ -23904,10 +24248,6 @@ var CONTRACT_BEARING_STATUSES = /* @__PURE__ */ new Set([
|
|
|
23904
24248
|
function isTable(ctx) {
|
|
23905
24249
|
return (ctx.outputFormat ?? "table") === "table";
|
|
23906
24250
|
}
|
|
23907
|
-
function hint(ctx, lines) {
|
|
23908
|
-
if (!isTable(ctx)) return;
|
|
23909
|
-
process.stdout.write("\n" + lines.join("\n") + "\n");
|
|
23910
|
-
}
|
|
23911
24251
|
function productType(args) {
|
|
23912
24252
|
const t = args.type ?? args["product-type"];
|
|
23913
24253
|
if (t === "org" || t === "workspace") return t;
|
|
@@ -25811,7 +26151,41 @@ function simulateInboundRouting(phone, opts = {}) {
|
|
|
25811
26151
|
steps.push({ step: "inbound_call_handling", outcome: "play_message" });
|
|
25812
26152
|
return finish("play_message_hangup", false, false, steps, recommendations, callerRole);
|
|
25813
26153
|
}
|
|
25814
|
-
|
|
26154
|
+
if (inboundCallHandling === "ring_operators") {
|
|
26155
|
+
const operatorGroupId = phone.operatorGroupId;
|
|
26156
|
+
const ringWorkflowId = phone.defaultWorkflowId;
|
|
26157
|
+
if (!operatorGroupId || ringWorkflowId === null || ringWorkflowId === void 0) {
|
|
26158
|
+
steps.push({
|
|
26159
|
+
step: "inbound_call_handling",
|
|
26160
|
+
outcome: "ai_path",
|
|
26161
|
+
detail: "ring_operators skipped \u2014 needs BOTH operatorGroupId and defaultWorkflowId"
|
|
26162
|
+
});
|
|
26163
|
+
recommendations.push(
|
|
26164
|
+
"ring_operators is configured but inert: set operatorGroupId (gr operator-groups list -w $WID) and defaultWorkflowId, or the line silently answers with AI"
|
|
26165
|
+
);
|
|
26166
|
+
} else {
|
|
26167
|
+
const noAnswer = phone.operatorNoAnswerAction ?? "voicemail";
|
|
26168
|
+
const timeout = phone.operatorRingTimeoutSeconds ?? 30;
|
|
26169
|
+
steps.push({
|
|
26170
|
+
step: "inbound_call_handling",
|
|
26171
|
+
outcome: "ring_operators",
|
|
26172
|
+
detail: `group=${operatorGroupId} timeout=${timeout}s no_answer=${noAnswer}`
|
|
26173
|
+
});
|
|
26174
|
+
steps.push({
|
|
26175
|
+
step: "operator_presence",
|
|
26176
|
+
outcome: "runtime_dependent",
|
|
26177
|
+
detail: `live operators are resolved at call time \u2014 not simulatable. If none are live, or none answer within ${timeout}s, the call falls back to: ${noAnswer}`
|
|
26178
|
+
});
|
|
26179
|
+
if (noAnswer === "ai") {
|
|
26180
|
+
recommendations.push(
|
|
26181
|
+
"operatorNoAnswerAction=ai \u2014 an unanswered ring lands on the AI assistant, so callers may reach the AI rather than voicemail"
|
|
26182
|
+
);
|
|
26183
|
+
}
|
|
26184
|
+
return finish("ring_operators", true, true, steps, recommendations, callerRole);
|
|
26185
|
+
}
|
|
26186
|
+
} else {
|
|
26187
|
+
steps.push({ step: "inbound_call_handling", outcome: "ai_path" });
|
|
26188
|
+
}
|
|
25815
26189
|
const workflowId = phone.defaultWorkflowId;
|
|
25816
26190
|
if (workflowId === null || workflowId === void 0) {
|
|
25817
26191
|
steps.push({
|
|
@@ -25869,7 +26243,8 @@ function finish(code, createsChat, createsPhoneCall, steps, recommendations, cal
|
|
|
25869
26243
|
fax_receive: "Create fax chat + receive document",
|
|
25870
26244
|
no_inbound_workflow: "Play unavailable message (no inbound workflow)",
|
|
25871
26245
|
workflow_member_role_denied: "Reject \u2014 caller member role lacks workflow USE (memberRoleAccess)",
|
|
25872
|
-
ai_voice_chat: "Create chat + connect AI voice"
|
|
26246
|
+
ai_voice_chat: "Create chat + connect AI voice",
|
|
26247
|
+
ring_operators: "Ring live operators (falls back if none answer)"
|
|
25873
26248
|
};
|
|
25874
26249
|
return {
|
|
25875
26250
|
callerRole: callerRole ?? "unknown",
|
|
@@ -29999,7 +30374,7 @@ var widgetDomainsDomain = {
|
|
|
29999
30374
|
}
|
|
30000
30375
|
],
|
|
30001
30376
|
examples: [
|
|
30002
|
-
"gr widget-domains enable -w $WID --domain <uuid> --widgets chat,operator --allow-write",
|
|
30377
|
+
"gr widget-domains enable -w $WID --domain <uuid> --widgets chat,operator-tools --allow-write",
|
|
30003
30378
|
"gr widget-domains enable -w $WID --domain <uuid> --widgets chat --allow-subdomains --port 4444 --allow-write"
|
|
30004
30379
|
],
|
|
30005
30380
|
handler: async ({ ctx, workspace, args }) => {
|
|
@@ -35418,7 +35793,7 @@ init_concierge_api();
|
|
|
35418
35793
|
|
|
35419
35794
|
// package.json
|
|
35420
35795
|
var package_default = {
|
|
35421
|
-
version: "0.
|
|
35796
|
+
version: "0.16.0"};
|
|
35422
35797
|
|
|
35423
35798
|
// src/gr.ts
|
|
35424
35799
|
var VERSION = package_default.version;
|