@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/gr.js CHANGED
@@ -3213,7 +3213,7 @@ var init_libphonenumber_js = __esm({
3213
3213
  }
3214
3214
  });
3215
3215
 
3216
- // ../sdk/dist/chunk-K4MDFGMO.js
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 init_chunk_K4MDFGMO = __esm({
4428
- "../sdk/dist/chunk-K4MDFGMO.js"() {
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 suffix = query.toString() === "" ? "" : `?${query.toString()}`;
7207
+ const suffix2 = query.toString() === "" ? "" : `?${query.toString()}`;
7147
7208
  return this.fetch(
7148
- `w/${wid}/app-connections/documo-fax/faxes${suffix}`
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-addressable enrollment form URL (carries `?brand=…`). Outreach
9345
- * appends each patient's `external_id`. `url` is null until a Site is linked.
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-V7ZKEH4V.js
14374
- var init_chunk_V7ZKEH4V = __esm({
14375
- "../sdk/dist/chunk-V7ZKEH4V.js"() {
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
- init_chunk_K4MDFGMO();
14384
- init_chunk_V7ZKEH4V();
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 suffix = result3 && typeof result3 === "object" && "deletedTaskCount" in result3 && result3.deletedTaskCount ? ` and ${result3.deletedTaskCount} child entities` : "";
16615
- process.stdout.write(`Deleted ${entityName} ${id}${suffix}
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
- updateHelp: "Update an agent. Body schema (JSON via --data/--file/stdin), all fields optional:\n name string display name\n description string short summary shown in listings\n systemPrompt string base instructions for the agent\n model string AI model slug (see `gr ai-models list`)\n temperature number sampling temperature (0-2)\n avatarFileId number workspace file ID for the avatar\n config object AgentConfig overrides (advanced)\nWorkflow abilities are managed with `gr abilities`.",
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 --data '{"name":"Scheduler","temperature":0.4}'`,
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 = [COL.id(), COL.uuid(), COL.name(), COL.status()];
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: "List available AI models",
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 models",
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 models",
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
- steps.push({ step: "inbound_call_handling", outcome: "ai_path" });
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.14.0"};
35796
+ version: "0.16.0"};
35422
35797
 
35423
35798
  // src/gr.ts
35424
35799
  var VERSION = package_default.version;