@wayai/cli 0.3.205 → 0.3.207

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/index.js CHANGED
@@ -9789,7 +9789,7 @@ function communityLessonVideoWatchUrl(video) {
9789
9789
  return `https://www.youtube.com/watch?v=${video.id}`;
9790
9790
  }
9791
9791
  }
9792
- var connectionIdParam, connectorIdParam, listConnectionsQuery, deleteConnectionQuery, addConnectionBody, editConnectionBody, PRODUCTION_DIRECT_FIELDS, setProductionCredentialBody, registerWhatsappQuery, registerWhatsappBody, retryProvisioningQuery, resendDomainStatusQuery, initialValueCreateSchema, initialValueUpdateSchema, stateIdParam, listStatesQuery, stateNameSchema, createStateBody, updateStateBody, reorderStatesBody, variantAiModeSchema, experimentStatusSchema, overlayUpdateSchema, experimentIdParam, variantIdParam, listExperimentsQuery, listVariantsQuery, listOverridesQuery, deleteOverrideQuery, createExperimentBody, updateExperimentBody, setExperimentStatusBody, createVariantBody, updateVariantBody, upsertOverrideBody, orgTagIdParam, listOrgTagsQuery, ORG_TAG_NAME_REGEX, ORG_TAG_NAME_MAX_LENGTH, createOrgTagBody, updateOrgTagBody, orgCredentialIdParam, listOrgCredentialsQuery, createOrgCredentialBody, updateOrgCredentialBody, BASE_CREDENTIAL_MANAGED_BY, BASE_CREDENTIAL_NAME_MAX, baseCredentialNameSchema, createBaseCredentialLinkBody, baseCredentialLinkParams, baseCredentialLinkQuery, orgResourceIdParam, orgResourceFileIdParam, orgResourceFolderIdParam, hubOrgResourceParam, listOrgResourcesQuery, orgIdQuery, createOrgResourceBody, updateOrgResourceBody, createOrgResourceFolderBody, updateOrgResourceFolderBody, uploadOrgResourceFileBody, updateOrgResourceFileBody, uploadOrgSkillZipBody, linkOrgResourceBody, resourceIdParam, listResourcesQuery, createResourceBody, updateResourceBody, syncSkillsBody, resourceFileIdParam, listResourceFilesQuery, createResourceFileBody, updateResourceFileBody, uploadResourceFileBody, uploadSkillZipBody, resourceFolderIdParam, listResourceFoldersQuery, createResourceFolderBody, updateResourceFolderBody, agentResourceQuery, hubResourceQuery, linkAgentResourceBody, updateAgentResourceBody, unlinkAgentResourceQuery, navItemSchema, hubCountResetBody, navItemCountResetBody, typingBody, analyticsHubIdParam, analyticsVariableIdParam, updateVariablePinBody, updateAnalyticsViewBody, NUMERIC_FILTER_OPS, TEXT_FILTER_OPS, CATEGORICAL_FILTER_OPS, VARIABLE_FILTER_OPS, STRUCTURED_QUERY_OPS, STRUCTURED_QUERY_AGGREGATIONS, filterValueSchema, conversationsBody, analyticsConversationIdParam, messagesQuery, conversationDetailDataQuery, analyticsDataBody, structuredQueryBody, analyticsSqlBody, analyticsSqlTable, analyticsSqlSchemaQuery, getConversationsQuery, getMessagesQuery, appMessageSenderType, appMessageReceiverType, apiChannelMessage, apiChannelMessageBody, appMessageBody, appMessageResponse, CALL_STATUSES, callStatus, CALL_END_REASONS, callEndReason, CALL_TRANSPORTS, callTransport, CALL_PARTICIPANT_TYPES, callParticipantType, callInstant, MAX_SDP_OFFER_LENGTH, sdpDescription, sdpOffer, MAX_CALL_REQUEST_BODY_BYTES, hubScoped, callSummaryFields, callSummary, callIdParam, createCallBody, createCallResponse, callReadyBody, callHangupBody, callStatusQuery, MAX_REPORTED_DELEGATION_IDS, callDelegationId, callDelegationsBody, callResponse, MAX_CALL_RECORDING_GAPS, callRecordingGap, callRecordingNoteMetadata, evalCallInstant, EVAL_CALL_MIN_SECONDS, EVAL_CALL_MAX_SECONDS, EVAL_CALL_SPOKEN_LINE_MAX_CHARS, hubScoped2, createEvalCallBody, createEvalCallResponse, evalCallConversationQuery, evalCallRecordQuery, evalCallSpeaker, evalCallUtterance, evalCallTurn, evalCallRecording, evalCallRecordResponse, evalCallFinishResponse, updateUserBody, updateProfileBody, pathnameRegex, updatePreferencesBody, registerPushTokenBody, deletePushTokenQuery, recordAiDisclosureAcceptanceBody, activityQuery, deletionModeSchema, deletionRequestBody, CACHE_RECONCILE_MAX_IDS, CACHE_RECONCILE_MAX_HUBS, cacheReconcileScopeSchema, cachedConversationPageSchema, cachedHistoryThreadSchema, cachedPeopleThreadSchema, cacheReconcileBody, archiveHubIdParam, archiveConversationParams, archiveListQuery, archiveMessageObservabilityParams, conversationIdParam, conversationHubQuery, claimBody, releaseBody, transferBody, closeBody, additionalContextPayloadSchema, kanbanUpdateBody, annotateConversationBody, observabilityParams, observabilityListParams, deleteUserConversationsBody, deleteUserConversationsResponse, sendMessageBody, listConversationsQuery, flagSourceSchema, getConversationsResponse, getConversationDetailParams, getConversationDetailQuery, getConversationDetailResponse, listWhatsAppTemplatesQuery, sendWhatsAppTemplateBody, copilotSuggestBody, copilotSuggestResponse, CONSULT_THREAD_STATUSES, consultThreadStatus, CONSULT_THREAD_TITLE_MAX, consultThreadTitle, consultThreadSummary, listConsultThreadsQuery, listConsultThreadsResponse, createConsultThreadBody, createConsultThreadResponse, consultThreadIdParam, updateConsultThreadBody, updateConsultThreadResponse, CONSULT_AWAIT_TIMEOUT_MS, billingOrgIdParam, subscriptionItemParams, spendCapBody, growthPacksBody, portalSessionBody, checkoutSessionBody, updateBillingCurrencyBody, invoicesQuery, planKeySchema, billingStatusSchema, billingPlanTypeSchema, dataUsageCountersSchema, REKOR_ENTITLEMENT_CONTRACT_VERSION, entitlementProjectionSchema, rekorEntitlementRefreshMessageSchema, downloadBody, uploadQuery, SIGN_URL_MAX_EXPIRES_IN_SECONDS, signUrlBody, templateIdParam, listTemplatesQuery, deleteTemplateQuery, templateStatusQuery, createTemplateBody, updateTemplateBody, submitTemplateBody, testTemplateBody, CONTACT_ENVIRONMENTS, CONTACT_NAME_MAX, CONTACT_EMAIL_MAX, CONTACT_PHONE_INPUT_MAX, CONTACT_INSTAGRAM_SID_MAX, CONTACT_METADATA_MAX_BYTES, CONTACT_LABEL_MAX, CONTACT_LABELS_MAX, CONTACT_SCOPE_TAGS_MAX, CONTACT_PAGE_MAX, CONTACT_IMPORT_BATCH_MAX, CONTACT_SEARCH_MAX, CONTACT_LIST_NAME_MAX, CONTACT_LIST_NAME_REGEX, CONTACT_LIST_DESCRIPTION_MAX, CONTACT_LIST_FILTER_MAX, CONTACT_LIST_PINS_PER_REQUEST_MAX, SUPPRESSION_SCOPES, SUPPRESSION_ID_REGEX, contactName, contactPhone, contactEmail, contactInstagramSid, contactLabel, contactLabels, contactMetadata, scopeTagIds, contactVisibilitySchema, hasIdentity, IDENTITY_REQUIRED, contactBookOrgQuery, contactBookContactParam, contactBookListParam, contactBookHubParam, contactBookPageQuery, listContactBookContactsQuery, listHubContactBookContactsQuery, contactBookLinkCandidatesQuery, listContactBookListMembersQuery, contactRowFields, createContactBookContactBody, updateContactBookContactBody, contactImportRowSchema, importContactBookContactsBody, linkContactBookContactBody, listName, contactListFilterSchema, createContactBookListBody, updateContactBookListBody, updateContactBookListPinsBody, suppressionIdentitySchema, createContactBookSuppressionBody, contactBookSuppressionParam, listContactBookSuppressionsQuery, CONTACT_BOOK_EMAIL_UNSUBSCRIBE_PATH, contactBookEmailUnsubscribeTokenSchema, contactBookEmailUnsubscribeQuery, orgListReferenceSchema, hubListNameSchema, HUB_LIST_FILTER_REQUIRED, hubContactListFilterSchema, hubContactListIdParam, hubContactListHubQuery, description, createHubContactListBody, updateHubContactListBody, AUTOMATION_TRIGGER_TYPES, AUTOMATION_EVENT_TYPES, AUTOMATION_TARGET_TYPES, AUTOMATION_ACTION_TYPES, AUTOMATION_CHANNEL_TYPES, AUTOMATION_PURPOSES, AUTOMATION_NAME_MAX, AUTOMATION_DESCRIPTION_MAX, AUTOMATION_INSTRUCTIONS_MAX, AUTOMATION_TEXT_MAX, AUTOMATION_CRON_MAX, AUTOMATION_WEBHOOK_AUTHS, AUTOMATION_WEBHOOK_HEADERS, AUTOMATION_WEBHOOK_BODY_MAX_BYTES, AUTOMATION_WEBHOOK_HEADER_NAME_MAX, AUTOMATION_WEBHOOK_MOUNT, WEBHOOK_RESERVED_HEADERS, automationTriggerSchema, automationTargetSchema, automationActionSchema, automationGateSchema, automationName, automationDescription, automationIdParam, automationHubQuery, automationWebhookParams, AUTOMATION_RUNS_PAGE_MAX, listAutomationRunsQuery, createAutomationBody, updateAutomationBody, AUTOMATION_ALERT_CATEGORIES, AUTOMATION_BLOCKED_ALERT_CATEGORY, automationEventSubscriberParam, VERSION_PART, MOBILE_APP_VERSION_RE, mobileAppVersionSchema, MOBILE_PLATFORMS, mobilePlatformSchema, mobileVersionPolicyQuery, mobileVersionPolicySchema, mobileVersionPolicyResponse, adminOrgIdParam, adminOrgAdminIdParam, adminUserIdParam, PRICING_PLAN_ID_RE, adminPlanIdParam, adminOrganizationsQuery, adminUserSearchQuery, kanbanSlugMigrationQuery, adjustQuotaBody, updatePlanBody, addAdminUserBody, MAX_VOICE_CALL_MINUTE_OPS, voiceCallMinuteOps, AUTOMATION_GATE_EVALUATIONS_PER_OPERATION_BOUND, automationGateEvaluationsPerOperation, AUTOMATION_RUN_RETENTION_DAYS_MAX, automationRunRetentionDays, updatePlatformConfigBody, updateFreeOrgLimitBody, adminScopedTargetShape, adminScopedTargetBody, BRANCHING_ORPHAN_ENTITY_TYPES, BRANCHING_ORPHAN_MAX_TARGETS, adminRepairBranchingOrphansBody, adminRepairLegacyOrgGrantsBody, adminRepairCompedPlansBody, updatePricingPlanBody, dataExplorerSearchQuery, dataExplorerOrgIdParam, dataExplorerHubIdParam, dataExplorerConvIdParam, dataExplorerDoInstancesQuery, dataExplorerNsIdParam, dataExplorerKvKeysBody, dataExplorerKvKeyBody, uuidOrHexId, dataExplorerDeleteOrgParam, dataExplorerDeleteHubParam, dataExplorerDeleteConvParam, dataExplorerDeleteUserParam, dataExplorerDeleteQuery, dataExplorerKvDeleteBody, pitrDoNamespace, pitrBookmarkParam, pitrRestoreBody, healthSamplingTriggerBody, dataExplorerDebugDoType, DEBUG_READ_MAX_LIMIT, DEBUG_READ_DEFAULT_LIMIT, DEBUG_DO_HEX_PREFIX, debugDoEntityId, debugTableName, dataExplorerDebugTablesParam, dataExplorerDebugRowsParam, dataExplorerDebugRowsQuery, dataExplorerDebugAnalyticsTable, debugUuid, dataExplorerDebugAnalyticsRowsParam, dataExplorerDebugAnalyticsRowsQuery, debugHubConvParam, debugMessageIdQuery, sandboxEgressPolicy, SANDBOX_EXEC_MAX_CMD_LENGTH, SANDBOX_EXEC_MAX_ALLOWLIST, SANDBOX_EXEC_MAX_TIMEOUT_MS, adminSandboxExecBody, META_ENTITY_ID_PATTERN, metaEntityId, whatsappCallbackBody, authMeResponse, wsTicketResponse, sessionCheckResponse, logoutResponse, magicCodeSendBody, magicCodeSendResponse, magicCodeVerifyBody, magicCodeVerifyResponse, passwordLoginBody, stateOperationBody, conversationListResourcesQuery, conversationReadResourceQuery, listPendingSchedulesQuery, listHubAggregateSchedulesQuery, reportSourceSchema, intakeReportSourceSchema, reportClassificationSchema, reportStatusSchema, reportLocaleSchema, reportMessageAuthorRoleSchema, reportMessageSchema, sentryRefStatusSchema, createReportBody, editReportBody, reporterReportSummarySchema, reporterListResponseSchema, getReportResponseSchema, reporterTransitionResponseSchema, contestReportBody, reporterListQuery, listReportsQuery, GITHUB_ISSUE_URL_REGEX, githubIssueUrlSchema, transitionReportBody, groupReportsBody, holdReportBody, clickhouseReadyResponse, bootstrapQuery, MAX_NAME_LENGTH, MAX_VALUE_LENGTH, MAX_TAGS, MAX_TAG_LENGTH, MAX_SCOPE_HUBS, MAX_SCOPE_TAGS, vaultSecretScopeSchema, vaultCreateBody, vaultUpdateBody, MAX_NAME_LENGTH2, MAX_HUBS_PER_GRANT, MAX_HUB_TAGS_PER_GRANT, MAX_GRANTS, permissionEnum, grantScopeSchema, grantSchema, createTokenBody, tokenOrgIdParam, invitePreviewQuery, inviteRolePreviewResponse, inviteContactPreviewResponse, invitePreviewResponse, inviteUnsubscribeBody, jsonSchemaSchema, hubUserIdentity, stateValueEntry, getHubUserContextResponse, updateHubUserBody, updateHubUserResponse, unlockHubUserNameResponse, stateResetParams, stateResetResponse, hubAlertsParam, hubAlertSeverity, hubAlert, hubAlertsListResponse, noticeSeveritySchema, noticeStatusSchema, NOTICE_SCOPE_REGEX, noticeScopeSchema, noticeLinkSchema, createNoticeBody, updateNoticeBody, listNoticesQuery, noticeIdParamSchema, ADMIN_SKILL_NAME_REGEX, adminSkillNameParam, REKOR_ACTOR_TYPE_HEADER, REKOR_ACTOR_ID_HEADER, REKOR_ACTOR_LABEL_HEADER, REKOR_ACTOR_ORG_HEADER, REKOR_ACTOR_ADMIN_HEADER, REKOR_CLIENT_HEADER, REKOR_TOOL_ID_HEADER, REKOR_CLIENTS, rekorClientSchema, MAX_REKOR_TOOL_ID_LENGTH, rekorToolIdSchema, DATA_PROXY_MOUNT, DATA_PROXY_PREFIX, REKOR_V1_PREFIX, DATA_PROXY_ORG_QUERY_PARAM, MAX_PROVISIONING_BODY_BYTES, dataProxyQuery, rekorAttestation, REQUIRED_REKOR_ATTESTATION_HEADERS, BASE_DESTRUCTION_MOUNT, BASE_DESTRUCTION_PREFIX, BASE_DESTRUCTION_CONFIRM_PATH, baseDestructionConfirmBody, BASE_DESTRUCTION_GRACE_MS, BASE_DESTRUCTION_CONFIRM_TTL_MS, BASE_DESTRUCTION_ORG_QUERY_PARAM, baseDestructionQuery, baseDestructionParam, baseDestructionInitiateBody, baseDestructionStatus, baseDestructionRequest, baseDestructionListResponse, baseDestructionInitiateResponse, baseDestructionConfirmResponse, baseDestructionCancelResponse, rekorBaseChangeMessageSchema, PEOPLE_CONTACT_PAGE_MAX, PEOPLE_CONTACT_PAGE_DEFAULT, PEOPLE_CONTACT_EMAIL_MAX_LENGTH, peopleUserIdSchema, peopleInviteEmailSchema, peopleContactInviteBody, peopleContactInviteIdParam, peopleContactUserIdParam, peopleContactBlockBody, peopleContactPageQuery, peopleOutgoingInviteSchema, peopleContactPersonSchema, peopleContactSchema, peopleIncomingInviteSchema, peopleBlockedUserSchema, PEOPLE_THREAD_MESSAGE_MAX_LENGTH, PEOPLE_THREAD_MESSAGES_PAGE_MAX, PEOPLE_THREAD_PAGE_MAX, PEOPLE_THREAD_PAGE_DEFAULT, PEOPLE_GROUP_NAME_MAX_LENGTH, PEOPLE_GROUP_AVATAR_URL_MAX_LENGTH, PEOPLE_THREAD_ATTACHMENT_MAX_BYTES, PEOPLE_THREAD_ATTACHMENT_NAME_MAX_LENGTH, PEOPLE_ATTACHMENT_STORAGE_PER_USER_BYTES, PEOPLE_THREAD_ATTACHMENT_MAX_MB, PEOPLE_THREAD_ATTACHMENT_URL_TTL_SECONDS, PEOPLE_THREAD_ATTACHMENT_URLS_MAX, peopleThreadIdParam, peopleThreadMessageIdParam, peopleThreadListQuery, peopleThreadMessagesQuery, peopleThreadAttachmentUploadSchema, peopleThreadSendBody, peopleThreadAttachmentUrlsBody, peopleThreadReadBody, peopleThreadSettingsBody, peopleGroupNameSchema, peopleGroupAvatarUrlSchema, peopleGroupCreateBody, peopleOrgDirectBody, peopleGroupUpdateBody, peopleGroupInviteBody, peopleOrgErasureBody, peopleGroupLeaveBody, peopleGroupInviteIdParam, peopleGroupIncomingInviteIdParam, peopleGroupMemberParam, peopleThreadKindSchema, peopleThreadMemberSchema, peopleThreadLastMessageSchema, peopleGroupRoleSchema, peopleGroupSummarySchema, peopleThreadSummarySchema, peopleThreadAttachmentSchema, peopleThreadMessageSchema, peopleGroupMemberSchema, peopleGroupSentInviteSchema, peopleGroupIncomingInviteSchema, PEOPLE_REPORT_DETAILS_MAX_LENGTH, peopleReportReasonSchema, reportDetailsSchema, reportFields, peopleReportBody, PEOPLE_MODERATION_NOTE_MAX_LENGTH, ADMIN_PEOPLE_REPORTS_PAGE_MAX, ADMIN_PEOPLE_REPORTS_PAGE_DEFAULT, peopleModerationActionSchema, moderationNoteSchema, adminPeopleReportListQuery, adminPeopleReportIdParam, adminPeopleMessageRemovalBody, adminPeopleSuspendBody, adminPeopleNoteBody, COMMUNITIES_PER_ORG_MAX, COMMUNITY_NAME_MAX_LENGTH, COMMUNITY_REGISTRY_CLOSED_REASON, COMMUNITY_ADMISSIONS, COMMUNITY_ACCESS_ADD_MAX, COMMUNITY_JOIN_SOURCE_MAX_LENGTH, COMMUNITY_JOIN_FLOW_TOKEN_MAX_LENGTH, COMMUNITY_ROOMS_MAX, COMMUNITY_ROOM_NAME_MAX_LENGTH, COMMUNITY_MESSAGE_MAX_LENGTH, COMMUNITY_MESSAGES_PAGE_SIZE, COMMUNITY_ATTACHMENT_URLS_MAX, COMMUNITY_POST_TITLE_MAX_LENGTH, COMMUNITY_POST_SEARCH_MAX_LENGTH, COMMUNITY_MEMBER_STATUSES, COMMUNITY_RULES_MAX_LENGTH, COMMUNITY_SLOW_MODE_MAX_SECONDS, COMMUNITY_COURSES_LABEL_MAX_LENGTH, COMMUNITY_LIVE_TICKET_PREFIX, COMMUNITY_STATS_DAYS, communityNameSchema, adminCreateCommunityBody, communityIdParam, communityJoinTokenSchema, communityJoinSourceSchema, communityJoinPreviewQuery, communityJoinBody, communityRoomKindSchema, communityRoomNameSchema, communityRoomIdParam, communityMessageIdParam, communityRoomCreateBody, communityRoomUpdateBody, communityMessagesQuery, communityMessageBodySchema, communityPostTitleSchema, communityAttachmentUploadSchema, communitySendBody, communityEditBody, communityPostIdParam, communityPostsQuery, communityAnswerBody, communityReadBody, communityAttachmentUrlsBody, communityPersonParam, communityOrgParam, communityPeopleQuery, communityCoursesLabelSchema, communityAdmissionSchema, communitySettingsBody, communityAccessEmailSchema, communityAccessAddBody, communityAccessQuery, communityAccessIdParam, communityBanBody, communityLockBody, communityPinBody, communityModLogQuery, communityReportsQuery, communityReportIdParam, communityLiveTicketSchema, communityLiveQuery, communityMuteBody, communityEmailUnsubscribeTokenSchema, COMMUNITY_EMAIL_UNSUBSCRIBE_PATH, communityEmailUnsubscribeQuery, COMMUNITY_COURSES_MAX, COMMUNITY_COURSE_MODULES_MAX, COMMUNITY_COURSE_LESSONS_MAX, COMMUNITY_LESSONS_MAX, COMMUNITY_COURSE_TITLE_MAX_LENGTH, COMMUNITY_COURSE_DESCRIPTION_MAX_LENGTH, COMMUNITY_LESSON_BODY_MAX_LENGTH, COMMUNITY_LESSON_LINKS_MAX, COMMUNITY_LESSON_URL_MAX_LENGTH, YOUTUBE_ID, YOUTUBE_HOSTS, YOUTU_BE, YOUTUBE_ID_PATH, communityCourseIdParam, communityCourseModuleIdParam, communityLessonIdParam, communityCourseTitleSchema, communityCourseDescriptionSchema, communityCoursePositionSchema, communityLessonVideoUrlSchema, communityLessonLinkSchema, communityLessonLinksSchema, communityLessonBodySchema, communityCourseCreateBody, communityCourseUpdateBody, communityModuleCreateBody, communityModuleUpdateBody, communityLessonCreateBody, communityLessonUpdateBody, COMMUNITY_LESSON_TREE_MAX_BYTES, COMMUNITY_LESSON_LINK_PROTOCOLS, COMMUNITY_LESSON_TREE_TOO_LARGE_REASON, COMMUNITY_LESSON_TREE_TOO_DEEP_REASON, COMMUNITY_LESSON_LINE_PREFIX_TOO_WIDE_REASON, LINK_SCHEME, adminSetGuideHubBody, GUIDE_HUB_INELIGIBLE_REASON;
9792
+ var connectionIdParam, connectorIdParam, listConnectionsQuery, deleteConnectionQuery, addConnectionBody, editConnectionBody, PRODUCTION_DIRECT_FIELDS, setProductionCredentialBody, registerWhatsappQuery, registerWhatsappBody, retryProvisioningQuery, resendDomainStatusQuery, initialValueCreateSchema, initialValueUpdateSchema, stateIdParam, listStatesQuery, stateNameSchema, createStateBody, updateStateBody, reorderStatesBody, variantAiModeSchema, experimentStatusSchema, overlayUpdateSchema, experimentIdParam, variantIdParam, listExperimentsQuery, listVariantsQuery, listOverridesQuery, deleteOverrideQuery, createExperimentBody, updateExperimentBody, setExperimentStatusBody, createVariantBody, updateVariantBody, upsertOverrideBody, orgTagIdParam, listOrgTagsQuery, ORG_TAG_NAME_REGEX, ORG_TAG_NAME_MAX_LENGTH, createOrgTagBody, updateOrgTagBody, orgCredentialIdParam, listOrgCredentialsQuery, createOrgCredentialBody, updateOrgCredentialBody, BASE_CREDENTIAL_MANAGED_BY, BASE_CREDENTIAL_NAME_MAX, baseCredentialNameSchema, createBaseCredentialLinkBody, baseCredentialLinkParams, baseCredentialLinkQuery, orgResourceIdParam, orgResourceFileIdParam, orgResourceFolderIdParam, hubOrgResourceParam, listOrgResourcesQuery, orgIdQuery, createOrgResourceBody, updateOrgResourceBody, createOrgResourceFolderBody, updateOrgResourceFolderBody, uploadOrgResourceFileBody, updateOrgResourceFileBody, uploadOrgSkillZipBody, linkOrgResourceBody, resourceIdParam, listResourcesQuery, createResourceBody, updateResourceBody, syncSkillsBody, resourceFileIdParam, listResourceFilesQuery, createResourceFileBody, updateResourceFileBody, uploadResourceFileBody, uploadSkillZipBody, resourceFolderIdParam, listResourceFoldersQuery, createResourceFolderBody, updateResourceFolderBody, agentResourceQuery, hubResourceQuery, linkAgentResourceBody, updateAgentResourceBody, unlinkAgentResourceQuery, navItemSchema, hubCountResetBody, navItemCountResetBody, typingBody, analyticsHubIdParam, analyticsVariableIdParam, updateVariablePinBody, updateAnalyticsViewBody, NUMERIC_FILTER_OPS, TEXT_FILTER_OPS, CATEGORICAL_FILTER_OPS, VARIABLE_FILTER_OPS, STRUCTURED_QUERY_OPS, STRUCTURED_QUERY_AGGREGATIONS, filterValueSchema, conversationsBody, analyticsConversationIdParam, messagesQuery, conversationDetailDataQuery, analyticsDataBody, structuredQueryBody, analyticsSqlBody, analyticsSqlTable, analyticsSqlSchemaQuery, getConversationsQuery, getMessagesQuery, appMessageSenderType, appMessageReceiverType, apiChannelMessage, apiChannelMessageBody, appMessageBody, appMessageResponse, CALL_STATUSES, callStatus, CALL_END_REASONS, callEndReason, CALL_TRANSPORTS, callTransport, CALL_PARTICIPANT_TYPES, callParticipantType, callInstant, MAX_SDP_OFFER_LENGTH, sdpDescription, sdpOffer, MAX_CALL_REQUEST_BODY_BYTES, hubScoped, callSummaryFields, callSummary, callIdParam, createCallBody, createCallResponse, callReadyBody, callHangupBody, callStatusQuery, MAX_REPORTED_DELEGATION_IDS, callDelegationId, callDelegationsBody, callResponse, MAX_CALL_RECORDING_GAPS, callRecordingGap, callRecordingNoteMetadata, evalCallInstant, EVAL_CALL_MIN_SECONDS, EVAL_CALL_MAX_SECONDS, EVAL_CALL_SPOKEN_LINE_MAX_CHARS, hubScoped2, createEvalCallBody, createEvalCallResponse, evalCallConversationQuery, evalCallRecordQuery, evalCallSpeaker, evalCallUtterance, evalCallTurn, evalCallRecording, evalCallRecordResponse, evalCallFinishResponse, updateUserBody, updateProfileBody, pathnameRegex, updatePreferencesBody, registerPushTokenBody, deletePushTokenQuery, recordAiDisclosureAcceptanceBody, activityQuery, deletionModeSchema, deletionRequestBody, CACHE_RECONCILE_MAX_IDS, CACHE_RECONCILE_MAX_HUBS, cacheReconcileScopeSchema, cachedConversationPageSchema, cachedHistoryThreadSchema, cachedPeopleThreadSchema, cacheReconcileBody, archiveHubIdParam, archiveConversationParams, archiveListQuery, archiveMessageObservabilityParams, conversationIdParam, conversationHubQuery, claimBody, releaseBody, transferBody, closeBody, additionalContextPayloadSchema, kanbanUpdateBody, annotateConversationBody, observabilityParams, observabilityListParams, deleteUserConversationsBody, deleteUserConversationsResponse, sendMessageBody, listConversationsQuery, flagSourceSchema, getConversationsResponse, getConversationDetailParams, getConversationDetailQuery, getConversationDetailResponse, listWhatsAppTemplatesQuery, sendWhatsAppTemplateBody, copilotSuggestBody, copilotSuggestResponse, CONSULT_THREAD_STATUSES, consultThreadStatus, CONSULT_THREAD_TITLE_MAX, consultThreadTitle, consultThreadSummary, listConsultThreadsQuery, listConsultThreadsResponse, createConsultThreadBody, createConsultThreadResponse, consultThreadIdParam, updateConsultThreadBody, updateConsultThreadResponse, CONSULT_AWAIT_TIMEOUT_MS, billingOrgIdParam, subscriptionItemParams, spendCapBody, growthPacksBody, portalSessionBody, checkoutSessionBody, updateBillingCurrencyBody, invoicesQuery, planKeySchema, billingStatusSchema, billingPlanTypeSchema, dataUsageCountersSchema, REKOR_ENTITLEMENT_CONTRACT_VERSION, entitlementProjectionSchema, rekorEntitlementRefreshMessageSchema, downloadBody, uploadQuery, SIGN_URL_MAX_EXPIRES_IN_SECONDS, signUrlBody, templateIdParam, listTemplatesQuery, deleteTemplateQuery, templateStatusQuery, createTemplateBody, updateTemplateBody, submitTemplateBody, testTemplateBody, CONTACT_ENVIRONMENTS, CONTACT_NAME_MAX, CONTACT_EMAIL_MAX, CONTACT_PHONE_INPUT_MAX, CONTACT_INSTAGRAM_SID_MAX, CONTACT_METADATA_MAX_BYTES, CONTACT_LABEL_MAX, CONTACT_LABELS_MAX, CONTACT_SCOPE_TAGS_MAX, CONTACT_PAGE_MAX, CONTACT_IMPORT_BATCH_MAX, CONTACT_SEARCH_MAX, CONTACT_LIST_NAME_MAX, CONTACT_LIST_NAME_REGEX, CONTACT_LIST_DESCRIPTION_MAX, CONTACT_LIST_FILTER_MAX, CONTACT_LIST_PINS_PER_REQUEST_MAX, SUPPRESSION_SCOPES, SUPPRESSION_ID_REGEX, contactName, contactPhone, contactEmail, contactInstagramSid, contactLabel, contactLabels, contactMetadata, scopeTagIds, contactVisibilitySchema, hasIdentity, IDENTITY_REQUIRED, contactBookOrgQuery, contactBookContactParam, contactBookListParam, contactBookHubParam, contactBookPageQuery, listContactBookContactsQuery, listHubContactBookContactsQuery, contactBookLinkCandidatesQuery, listContactBookListMembersQuery, contactRowFields, createContactBookContactBody, updateContactBookContactBody, contactImportRowSchema, importContactBookContactsBody, linkContactBookContactBody, listName, contactListFilterSchema, createContactBookListBody, updateContactBookListBody, updateContactBookListPinsBody, suppressionIdentitySchema, createContactBookSuppressionBody, contactBookSuppressionParam, listContactBookSuppressionsQuery, CONTACT_BOOK_EMAIL_UNSUBSCRIBE_PATH, contactBookEmailUnsubscribeTokenSchema, contactBookEmailUnsubscribeQuery, orgListReferenceSchema, hubListNameSchema, HUB_LIST_FILTER_REQUIRED, hubContactListFilterSchema, hubContactListIdParam, hubContactListHubQuery, description, createHubContactListBody, updateHubContactListBody, AUTOMATION_TRIGGER_TYPES, AUTOMATION_EVENT_TYPES, AUTOMATION_TARGET_TYPES, AUTOMATION_ACTION_TYPES, AUTOMATION_CHANNEL_TYPES, AUTOMATION_PURPOSES, AUTOMATION_NAME_MAX, AUTOMATION_DESCRIPTION_MAX, AUTOMATION_INSTRUCTIONS_MAX, AUTOMATION_TEXT_MAX, AUTOMATION_CRON_MAX, AUTOMATION_WEBHOOK_AUTHS, AUTOMATION_WEBHOOK_HEADERS, AUTOMATION_WEBHOOK_BODY_MAX_BYTES, AUTOMATION_WEBHOOK_HEADER_NAME_MAX, AUTOMATION_WEBHOOK_MOUNT, WEBHOOK_RESERVED_HEADERS, automationTriggerSchema, automationTargetSchema, automationActionSchema, automationGateSchema, automationName, automationDescription, automationIdParam, automationHubQuery, automationWebhookParams, AUTOMATION_RUNS_PAGE_MAX, listAutomationRunsQuery, createAutomationBody, updateAutomationBody, AUTOMATION_ALERT_CATEGORIES, AUTOMATION_BLOCKED_ALERT_CATEGORY, automationEventSubscriberParam, VERSION_PART, MOBILE_APP_VERSION_RE, mobileAppVersionSchema, MOBILE_PLATFORMS, mobilePlatformSchema, mobileVersionPolicyQuery, mobileVersionPolicySchema, mobileVersionPolicyResponse, adminOrgIdParam, adminOrgAdminIdParam, adminUserIdParam, PRICING_PLAN_ID_RE, adminPlanIdParam, adminOrganizationsQuery, adminUserSearchQuery, kanbanSlugMigrationQuery, adjustQuotaBody, updatePlanBody, addAdminUserBody, MAX_VOICE_CALL_MINUTE_OPS, voiceCallMinuteOps, AUTOMATION_GATE_EVALUATIONS_PER_OPERATION_BOUND, automationGateEvaluationsPerOperation, AUTOMATION_RUN_RETENTION_DAYS_MAX, automationRunRetentionDays, updatePlatformConfigBody, updateFreeOrgLimitBody, adminScopedTargetShape, adminScopedTargetBody, BRANCHING_ORPHAN_ENTITY_TYPES, BRANCHING_ORPHAN_MAX_TARGETS, adminRepairBranchingOrphansBody, adminRepairLegacyOrgGrantsBody, adminRepairCompedPlansBody, updatePricingPlanBody, dataExplorerSearchQuery, dataExplorerOrgIdParam, dataExplorerHubIdParam, dataExplorerConvIdParam, dataExplorerDoInstancesQuery, dataExplorerNsIdParam, dataExplorerKvKeysBody, dataExplorerKvKeyBody, uuidOrHexId, dataExplorerDeleteOrgParam, dataExplorerDeleteHubParam, dataExplorerDeleteConvParam, dataExplorerDeleteUserParam, dataExplorerDeleteQuery, dataExplorerKvDeleteBody, pitrDoNamespace, pitrBookmarkParam, pitrRestoreBody, healthSamplingTriggerBody, dataExplorerDebugDoType, DEBUG_READ_MAX_LIMIT, DEBUG_READ_DEFAULT_LIMIT, DEBUG_DO_HEX_PREFIX, debugDoEntityId, debugTableName, dataExplorerDebugTablesParam, dataExplorerDebugRowsParam, dataExplorerDebugRowsQuery, dataExplorerDebugAnalyticsTable, debugUuid, dataExplorerDebugAnalyticsRowsParam, dataExplorerDebugAnalyticsRowsQuery, debugHubConvParam, debugMessageIdQuery, sandboxEgressPolicy, SANDBOX_EXEC_MAX_CMD_LENGTH, SANDBOX_EXEC_MAX_ALLOWLIST, SANDBOX_EXEC_MAX_TIMEOUT_MS, adminSandboxExecBody, META_ENTITY_ID_PATTERN, metaEntityId, whatsappCallbackBody, authMeResponse, wsTicketResponse, sessionCheckResponse, logoutResponse, magicCodeSendBody, magicCodeSendResponse, magicCodeVerifyBody, magicCodeVerifyResponse, passwordLoginBody, stateOperationBody, conversationListResourcesQuery, conversationReadResourceQuery, listPendingSchedulesQuery, listHubAggregateSchedulesQuery, reportSourceSchema, intakeReportSourceSchema, reportClassificationSchema, reportStatusSchema, reportLocaleSchema, reportMessageAuthorRoleSchema, reportMessageSchema, sentryRefStatusSchema, createReportBody, editReportBody, reporterReportSummarySchema, reporterListResponseSchema, getReportResponseSchema, reporterTransitionResponseSchema, contestReportBody, reporterListQuery, listReportsQuery, GITHUB_ISSUE_URL_REGEX, githubIssueUrlSchema, transitionReportBody, groupReportsBody, holdReportBody, clickhouseReadyResponse, bootstrapQuery, MAX_NAME_LENGTH, MAX_VALUE_LENGTH, MAX_TAGS, MAX_TAG_LENGTH, MAX_SCOPE_HUBS, MAX_SCOPE_TAGS, vaultSecretScopeSchema, vaultCreateBody, vaultUpdateBody, MAX_NAME_LENGTH2, MAX_HUBS_PER_GRANT, MAX_HUB_TAGS_PER_GRANT, MAX_GRANTS, permissionEnum, grantScopeSchema, grantSchema, createTokenBody, tokenOrgIdParam, invitePreviewQuery, inviteRolePreviewResponse, inviteContactPreviewResponse, invitePreviewResponse, inviteUnsubscribeBody, jsonSchemaSchema, hubUserIdentity, stateValueEntry, getHubUserContextResponse, updateHubUserBody, updateHubUserResponse, unlockHubUserNameResponse, stateResetParams, stateResetResponse, hubAlertsParam, hubAlertSeverity, hubAlert, hubAlertsListResponse, noticeSeveritySchema, noticeStatusSchema, NOTICE_SCOPE_REGEX, noticeScopeSchema, noticeLinkSchema, createNoticeBody, updateNoticeBody, listNoticesQuery, noticeIdParamSchema, ADMIN_SKILL_NAME_REGEX, adminSkillNameParam, REKOR_ACTOR_TYPE_HEADER, REKOR_ACTOR_ID_HEADER, REKOR_ACTOR_LABEL_HEADER, REKOR_ACTOR_ORG_HEADER, REKOR_ACTOR_ADMIN_HEADER, REKOR_CLIENT_HEADER, REKOR_TOOL_ID_HEADER, REKOR_CLIENTS, rekorClientSchema, MAX_REKOR_TOOL_ID_LENGTH, rekorToolIdSchema, DATA_PROXY_MOUNT, DATA_PROXY_PREFIX, REKOR_V1_PREFIX, DATA_PROXY_ORG_QUERY_PARAM, MAX_PROVISIONING_BODY_BYTES, dataProxyQuery, rekorAttestation, REQUIRED_REKOR_ATTESTATION_HEADERS, BASE_DESTRUCTION_MOUNT, BASE_DESTRUCTION_PREFIX, BASE_DESTRUCTION_CONFIRM_PATH, baseDestructionConfirmBody, BASE_DESTRUCTION_GRACE_MS, BASE_DESTRUCTION_CONFIRM_TTL_MS, BASE_DESTRUCTION_ORG_QUERY_PARAM, baseDestructionQuery, baseDestructionParam, baseDestructionInitiateBody, baseDestructionStatus, baseDestructionRequest, baseDestructionListResponse, baseDestructionInitiateResponse, baseDestructionConfirmResponse, baseDestructionCancelResponse, rekorBaseChangeMessageSchema, PEOPLE_CONTACT_PAGE_MAX, PEOPLE_CONTACT_PAGE_DEFAULT, PEOPLE_CONTACT_EMAIL_MAX_LENGTH, peopleUserIdSchema, peopleInviteEmailSchema, peopleContactInviteBody, peopleContactInviteIdParam, peopleContactUserIdParam, peopleContactBlockBody, peopleContactPageQuery, peopleOutgoingInviteSchema, peopleContactPersonSchema, peopleContactSchema, peopleIncomingInviteSchema, peopleBlockedUserSchema, PEOPLE_THREAD_MESSAGE_MAX_LENGTH, PEOPLE_THREAD_MESSAGES_PAGE_MAX, PEOPLE_THREAD_PAGE_MAX, PEOPLE_THREAD_PAGE_DEFAULT, PEOPLE_GROUP_NAME_MAX_LENGTH, PEOPLE_GROUP_AVATAR_URL_MAX_LENGTH, PEOPLE_THREAD_ATTACHMENT_MAX_BYTES, PEOPLE_THREAD_ATTACHMENT_NAME_MAX_LENGTH, PEOPLE_ATTACHMENT_STORAGE_PER_USER_BYTES, PEOPLE_THREAD_ATTACHMENT_MAX_MB, PEOPLE_THREAD_ATTACHMENT_URL_TTL_SECONDS, PEOPLE_THREAD_ATTACHMENT_URLS_MAX, peopleThreadIdParam, peopleThreadMessageIdParam, peopleThreadListQuery, peopleThreadMessagesQuery, peopleThreadAttachmentUploadSchema, peopleThreadSendBody, peopleThreadAttachmentUrlsBody, peopleThreadReadBody, peopleThreadSettingsBody, peopleGroupNameSchema, peopleGroupAvatarUrlSchema, peopleGroupCreateBody, peopleOrgDirectBody, peopleGroupUpdateBody, peopleGroupInviteBody, peopleOrgErasureBody, peopleGroupLeaveBody, peopleGroupInviteIdParam, peopleGroupIncomingInviteIdParam, peopleGroupMemberParam, peopleThreadKindSchema, peopleThreadMemberSchema, peopleThreadLastMessageSchema, peopleGroupRoleSchema, peopleGroupSummarySchema, peopleThreadSummarySchema, peopleThreadAttachmentSchema, peopleThreadMessageSchema, peopleGroupMemberSchema, peopleGroupSentInviteSchema, peopleGroupIncomingInviteSchema, PEOPLE_REPORT_DETAILS_MAX_LENGTH, peopleReportReasonSchema, reportDetailsSchema, reportFields, peopleReportBody, PEOPLE_MODERATION_NOTE_MAX_LENGTH, ADMIN_PEOPLE_REPORTS_PAGE_MAX, ADMIN_PEOPLE_REPORTS_PAGE_DEFAULT, PEOPLE_SUSPENDED_REASON, peopleModerationActionSchema, moderationNoteSchema, adminPeopleReportListQuery, adminPeopleReportIdParam, adminPeopleMessageRemovalBody, adminPeopleSuspendBody, adminPeopleNoteBody, COMMUNITIES_PER_ORG_MAX, COMMUNITY_NAME_MAX_LENGTH, COMMUNITY_REGISTRY_CLOSED_REASON, COMMUNITY_MEMBERS_MAX, COMMUNITY_ADMISSIONS, COMMUNITY_ACCESS_MAX, COMMUNITY_ACCESS_ADD_MAX, COMMUNITY_ACCESS_FULL_REASON, COMMUNITY_JOIN_SOURCE_MAX_LENGTH, COMMUNITY_JOIN_FLOW_TOKEN_MAX_LENGTH, COMMUNITY_ROOMS_MAX, COMMUNITY_ROOM_NAME_MAX_LENGTH, COMMUNITY_MESSAGE_MAX_LENGTH, COMMUNITY_MESSAGES_PAGE_SIZE, COMMUNITY_ATTACHMENT_URLS_MAX, COMMUNITY_POST_TITLE_MAX_LENGTH, COMMUNITY_POST_SEARCH_MAX_LENGTH, COMMUNITY_MEMBER_STATUSES, COMMUNITY_RULES_MAX_LENGTH, COMMUNITY_SLOW_MODE_MAX_SECONDS, COMMUNITY_COURSES_LABEL_MAX_LENGTH, COMMUNITY_LIVE_TICKET_PREFIX, COMMUNITY_STATS_DAYS, communityNameSchema, adminCreateCommunityBody, communityIdParam, communityJoinTokenSchema, communityJoinSourceSchema, communityJoinPreviewQuery, communityJoinBody, communityRoomKindSchema, communityRoomNameSchema, communityRoomIdParam, communityMessageIdParam, communityRoomCreateBody, communityRoomUpdateBody, communityMessagesQuery, communityMessageBodySchema, communityPostTitleSchema, communityAttachmentUploadSchema, communitySendBody, communityEditBody, communityPostIdParam, communityPostsQuery, communityAnswerBody, communityReadBody, communityAttachmentUrlsBody, communityPersonParam, communityOrgParam, communityPeopleQuery, communityCoursesLabelSchema, communityAdmissionSchema, communitySettingsBody, communityAccessEmailSchema, communityAccessAddBody, communityAccessQuery, communityAccessIdParam, communityBanBody, communityLockBody, communityPinBody, communityModLogQuery, communityReportsQuery, communityReportIdParam, communityLiveTicketSchema, communityLiveQuery, communityMuteBody, communityEmailUnsubscribeTokenSchema, COMMUNITY_EMAIL_UNSUBSCRIBE_PATH, communityEmailUnsubscribeQuery, COMMUNITY_COURSES_MAX, COMMUNITY_COURSE_MODULES_MAX, COMMUNITY_COURSE_LESSONS_MAX, COMMUNITY_LESSONS_MAX, COMMUNITY_COURSE_TITLE_MAX_LENGTH, COMMUNITY_COURSE_DESCRIPTION_MAX_LENGTH, COMMUNITY_LESSON_BODY_MAX_LENGTH, COMMUNITY_LESSON_LINKS_MAX, COMMUNITY_LESSON_URL_MAX_LENGTH, YOUTUBE_ID, YOUTUBE_HOSTS, YOUTU_BE, YOUTUBE_ID_PATH, communityCourseIdParam, communityCourseModuleIdParam, communityLessonIdParam, communityCourseTitleSchema, communityCourseDescriptionSchema, communityCoursePositionSchema, communityLessonVideoUrlSchema, communityLessonLinkSchema, communityLessonLinksSchema, communityLessonBodySchema, communityCourseCreateBody, communityCourseUpdateBody, communityModuleCreateBody, communityModuleUpdateBody, communityLessonCreateBody, communityLessonUpdateBody, COMMUNITY_LESSON_TREE_MAX_BYTES, COMMUNITY_LESSON_LINK_PROTOCOLS, COMMUNITY_LESSON_TREE_TOO_LARGE_REASON, COMMUNITY_LESSON_TREE_TOO_DEEP_REASON, COMMUNITY_LESSON_LINE_PREFIX_TOO_WIDE_REASON, LINK_SCHEME, adminSetGuideHubBody, GUIDE_HUB_INELIGIBLE_REASON;
9793
9793
  var init_chunk_T3VB6VFG = __esm({
9794
9794
  "../../packages/core/dist/chunk-T3VB6VFG.js"() {
9795
9795
  "use strict";
@@ -12803,6 +12803,7 @@ var init_chunk_T3VB6VFG = __esm({
12803
12803
  PEOPLE_MODERATION_NOTE_MAX_LENGTH = 500;
12804
12804
  ADMIN_PEOPLE_REPORTS_PAGE_MAX = 100;
12805
12805
  ADMIN_PEOPLE_REPORTS_PAGE_DEFAULT = 50;
12806
+ PEOPLE_SUSPENDED_REASON = "suspended";
12806
12807
  peopleModerationActionSchema = external_exports.enum(["remove_message", "suspend", "unsuspend", "dismiss"]);
12807
12808
  moderationNoteSchema = optionalTrimmedText(PEOPLE_MODERATION_NOTE_MAX_LENGTH);
12808
12809
  adminPeopleReportListQuery = external_exports.object({
@@ -12819,8 +12820,11 @@ var init_chunk_T3VB6VFG = __esm({
12819
12820
  COMMUNITIES_PER_ORG_MAX = 10;
12820
12821
  COMMUNITY_NAME_MAX_LENGTH = 100;
12821
12822
  COMMUNITY_REGISTRY_CLOSED_REASON = "community_registry_closed";
12823
+ COMMUNITY_MEMBERS_MAX = 1e4;
12822
12824
  COMMUNITY_ADMISSIONS = ["link", "invite"];
12825
+ COMMUNITY_ACCESS_MAX = COMMUNITY_MEMBERS_MAX;
12823
12826
  COMMUNITY_ACCESS_ADD_MAX = 500;
12827
+ COMMUNITY_ACCESS_FULL_REASON = "community_access_full";
12824
12828
  COMMUNITY_JOIN_SOURCE_MAX_LENGTH = 32;
12825
12829
  COMMUNITY_JOIN_FLOW_TOKEN_MAX_LENGTH = 128;
12826
12830
  COMMUNITY_ROOMS_MAX = 20;
@@ -13503,6 +13507,21 @@ var init_api_client = __esm({
13503
13507
  async updateCommunitySettings(communityId, body) {
13504
13508
  return this.request("PATCH", `/api/communities/${encodeURIComponent(communityId)}/settings`, body);
13505
13509
  }
13510
+ // A community's access list (gh #5042, `wayai communities access`): one page of it, oldest first;
13511
+ // an add; the removal of one entry, which removes the members that entry admitted.
13512
+ async listCommunityAccess(communityId, cursor) {
13513
+ const qs = cursor === void 0 ? "" : `?${new URLSearchParams({ cursor })}`;
13514
+ return this.request("GET", `/api/communities/${encodeURIComponent(communityId)}/access${qs}`);
13515
+ }
13516
+ async addCommunityAccess(communityId, body) {
13517
+ return this.request("POST", `/api/communities/${encodeURIComponent(communityId)}/access`, body);
13518
+ }
13519
+ async removeCommunityAccess(communityId, accessId) {
13520
+ return this.request(
13521
+ "DELETE",
13522
+ `/api/communities/${encodeURIComponent(communityId)}/access/${encodeURIComponent(accessId)}`
13523
+ );
13524
+ }
13506
13525
  async listCommunityRooms(communityId) {
13507
13526
  return this.request("GET", `/api/communities/${encodeURIComponent(communityId)}/rooms`);
13508
13527
  }
@@ -15012,6 +15031,21 @@ var init_expected = __esm({
15012
15031
  }
15013
15032
  });
15014
15033
 
15034
+ // src/lib/terminal-output.ts
15035
+ import { stripVTControlCharacters } from "util";
15036
+ function sanitizeTerminalText(value) {
15037
+ const normalizedNewlines = value.replace(/\r\n?/g, "\n");
15038
+ return stripVTControlCharacters(normalizedNewlines).replace(
15039
+ /[\u0000-\u0009\u000b-\u001f\u007f-\u009f]/g,
15040
+ ""
15041
+ );
15042
+ }
15043
+ var init_terminal_output = __esm({
15044
+ "src/lib/terminal-output.ts"() {
15045
+ "use strict";
15046
+ }
15047
+ });
15048
+
15015
15049
  // src/lib/fs-safety.ts
15016
15050
  import * as fs from "fs";
15017
15051
  import * as path from "path";
@@ -15471,7 +15505,7 @@ function findEnclosingNewHubFolder(workspaceDir) {
15471
15505
  return null;
15472
15506
  }
15473
15507
  function resolvePushTarget(workspaceDir, existingHubs, newHubs, selector) {
15474
- if (selector) {
15508
+ if (selector !== void 0) {
15475
15509
  const existingMatch = existingHubs.find(
15476
15510
  (h) => h.hubId === selector || path3.basename(h.hubFolder) === selector
15477
15511
  );
@@ -15491,7 +15525,7 @@ function resolvePushTarget(workspaceDir, existingHubs, newHubs, selector) {
15491
15525
  return previewHubs.length === 1 ? { ok: true, target: { kind: "existing", hub: previewHubs[0] } } : { ok: true, target: { kind: "new", hub: newHubs[0] } };
15492
15526
  }
15493
15527
  function resolveNewHubForCreate(workspaceDir, existingHubs, newHubs, selector) {
15494
- if (selector) {
15528
+ if (selector !== void 0) {
15495
15529
  const newMatch = newHubs.find((h) => path3.basename(h.hubFolder) === selector);
15496
15530
  if (newMatch) return { ok: true, hub: newMatch };
15497
15531
  const existingMatch = existingHubs.find(
@@ -16065,6 +16099,38 @@ function shouldInterceptHelp(command2, args2, ownHelpCommands) {
16065
16099
  if (ownHelpCommands.has(command2)) return false;
16066
16100
  return wantsHelp(args2);
16067
16101
  }
16102
+ function isDryRunToken(arg) {
16103
+ return /^--dry-run(=\S*)?$/.test(arg);
16104
+ }
16105
+ function unreadDryRunRefusal(invocation, token, readsBare) {
16106
+ const only = readsBare ? " (only a bare `--dry-run`)" : "";
16107
+ return `\`${invocation}\` does not read \`${sanitizeTerminalText(token)}\`${only}, so it is refused rather than run without it.`;
16108
+ }
16109
+ function entryFlagRefusal(command2, args2, dataNamespaces) {
16110
+ if (command2 === void 0 || ["help", "--help", "-h", "--version", "-v"].includes(command2)) return null;
16111
+ if (dataNamespaces.has(command2)) return null;
16112
+ const words = [command2];
16113
+ for (const arg of args2.slice(0, 2)) {
16114
+ if (!/^[a-z][a-z-]*$/.test(arg)) break;
16115
+ words.push(arg);
16116
+ }
16117
+ const invocation = `wayai ${words.join(" ")}`;
16118
+ let parsed;
16119
+ for (let n = words.length; n > 0 && parsed === void 0; n--) {
16120
+ parsed = PARSED_BY_THE_COMMAND.get(words.slice(0, n).join(" "));
16121
+ }
16122
+ if (parsed === "all") return null;
16123
+ const dryRuns = args2.filter(isDryRunToken);
16124
+ const readsBare = parsed === "bare --dry-run";
16125
+ const refused = readsBare ? dryRuns.find((token) => token !== "--dry-run") : dryRuns[0];
16126
+ if (refused !== void 0) return unreadDryRunRefusal(invocation, refused, readsBare);
16127
+ if (parsed === "selectors") return null;
16128
+ for (const { flag, noun } of SELECTOR_FLAGS) {
16129
+ const empty = args2.some((arg, i) => arg === `${flag}=` || arg === flag && (args2[i + 1] ?? "") === "");
16130
+ if (empty) return `\`${invocation} ${flag}\` needs ${noun}, and none followed it.`;
16131
+ }
16132
+ return null;
16133
+ }
16068
16134
  function isNewerVersion(latest, current) {
16069
16135
  const strip = (v) => v.replace(/[-+].*$/, "");
16070
16136
  const l = strip(latest).split(".").map(Number);
@@ -16096,12 +16162,13 @@ function resolveSecretSource(source) {
16096
16162
  }
16097
16163
  return "prompt";
16098
16164
  }
16099
- var UUID_RE3, slugify2, OWN_HELP_COMMANDS;
16165
+ var UUID_RE3, slugify2, OWN_HELP_COMMANDS, PARSED_BY_THE_COMMAND, SELECTOR_FLAGS;
16100
16166
  var init_utils = __esm({
16101
16167
  "src/lib/utils.ts"() {
16102
16168
  "use strict";
16103
16169
  init_dist();
16104
16170
  init_expected();
16171
+ init_terminal_output();
16105
16172
  UUID_RE3 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
16106
16173
  slugify2 = slugifySkillName;
16107
16174
  OWN_HELP_COMMANDS = /* @__PURE__ */ new Set([
@@ -16112,6 +16179,23 @@ var init_utils = __esm({
16112
16179
  "alerts",
16113
16180
  "communities"
16114
16181
  ]);
16182
+ PARSED_BY_THE_COMMAND = /* @__PURE__ */ new Map([
16183
+ ["pull", "all"],
16184
+ ["push", "all"],
16185
+ ["communities", "all"],
16186
+ ["sync-mcp", "bare --dry-run"],
16187
+ ["admin hubs repair-team-orphans", "bare --dry-run"],
16188
+ ["admin hubs repair-branching-orphans", "bare --dry-run"],
16189
+ ["admin orgs repair-legacy-grants", "bare --dry-run"],
16190
+ ["admin harness mass-destroy", "bare --dry-run"],
16191
+ ["use", "selectors"],
16192
+ ["unbind", "selectors"],
16193
+ ["unlock", "selectors"]
16194
+ ]);
16195
+ SELECTOR_FLAGS = [
16196
+ { flag: "--hub", noun: "a hub" },
16197
+ { flag: "--org", noun: "an organization" }
16198
+ ];
16115
16199
  }
16116
16200
  });
16117
16201
 
@@ -19540,21 +19624,6 @@ var init_hub_materializer = __esm({
19540
19624
  }
19541
19625
  });
19542
19626
 
19543
- // src/lib/terminal-output.ts
19544
- import { stripVTControlCharacters } from "util";
19545
- function sanitizeTerminalText(value) {
19546
- const normalizedNewlines = value.replace(/\r\n?/g, "\n");
19547
- return stripVTControlCharacters(normalizedNewlines).replace(
19548
- /[\u0000-\u0009\u000b-\u001f\u007f-\u009f]/g,
19549
- ""
19550
- );
19551
- }
19552
- var init_terminal_output = __esm({
19553
- "src/lib/terminal-output.ts"() {
19554
- "use strict";
19555
- }
19556
- });
19557
-
19558
19627
  // src/lib/base-workspace.ts
19559
19628
  import * as fs15 from "fs";
19560
19629
  import * as path19 from "path";
@@ -19618,7 +19687,7 @@ function assertValidBaseSelector(selector, source = "base") {
19618
19687
  }
19619
19688
  function resolveBaseTarget(gitRoot, selector, cwd = process.cwd()) {
19620
19689
  const basesDir = resolveBasesDir(gitRoot);
19621
- if (selector) {
19690
+ if (selector !== void 0) {
19622
19691
  const folder = folderForSelector(basesDir, selector);
19623
19692
  if (!isUnder(basesDir, folder)) {
19624
19693
  throw expected(`Refusing to target ${folder}: it is outside ${basesDir}.`);
@@ -19818,7 +19887,7 @@ function routeToSubtree(options) {
19818
19887
  const cwd = options.cwd ?? process.cwd();
19819
19888
  const tokens2 = parseRoutingTokens(args2);
19820
19889
  const { hubFlag, baseFlag, communityFlag, positional, orgFlag } = tokens2;
19821
- if (orgFlag !== void 0) {
19890
+ if (orgFlag !== void 0 || args2.includes("--org")) {
19822
19891
  return {
19823
19892
  ok: false,
19824
19893
  refusal: [
@@ -19830,6 +19899,10 @@ function routeToSubtree(options) {
19830
19899
  ].join("\n")
19831
19900
  };
19832
19901
  }
19902
+ const valuedDryRun = args2.find((arg) => isDryRunToken(arg) && arg !== "--dry-run");
19903
+ if (valuedDryRun !== void 0) {
19904
+ return { ok: false, refusal: unreadDryRunRefusal(`wayai ${verb}`, valuedDryRun, true) };
19905
+ }
19833
19906
  if (tokens2.takenAsValue) {
19834
19907
  const { flag: flag2, by } = tokens2.takenAsValue;
19835
19908
  return {
@@ -19850,7 +19923,23 @@ function routeToSubtree(options) {
19850
19923
  if (flagged.length > 1) {
19851
19924
  return { ok: false, refusal: mixedInvocationRefusal(verb, flagged) };
19852
19925
  }
19926
+ if (positional === "") {
19927
+ return {
19928
+ ok: false,
19929
+ refusal: `\`wayai ${verb} ""\` names nothing, so it is refused rather than run on a folder it did not name.`
19930
+ };
19931
+ }
19853
19932
  const fromPositional = positional !== void 0 ? resolveSelectorSubtree(layout, positional, cwd) : void 0;
19933
+ if (positional !== void 0 && fromPositional && fromPositional.kind !== "both" && fromPositional.kind !== "unknown" && fromPositional.target === "") {
19934
+ const { kind } = fromPositional;
19935
+ const { target, value } = SUBTREE_FLAGS.find(({ subtree }) => subtree === kind);
19936
+ const dir = `${SUBDIR[kind]}/`;
19937
+ return {
19938
+ ok: false,
19939
+ refusal: `\`wayai ${verb} ${sanitizeTerminalText(positional)}\` names ${dir}, not ${target} in it, so it is refused rather than run on a folder it did not name.
19940
+ wayai ${verb} ${dir}${value}`
19941
+ };
19942
+ }
19854
19943
  if (fromPositional?.kind === "both") {
19855
19944
  return {
19856
19945
  ok: false,
@@ -19914,6 +20003,7 @@ var init_subtree_routing = __esm({
19914
20003
  "use strict";
19915
20004
  init_layout();
19916
20005
  init_terminal_output();
20006
+ init_utils();
19917
20007
  init_workspace_manifest();
19918
20008
  init_workspace();
19919
20009
  init_base_workspace();
@@ -21067,7 +21157,8 @@ function settingsContent(settings) {
21067
21157
  return {
21068
21158
  rules: normalizeRules(settings.rules),
21069
21159
  slow_mode_seconds: settings.slow_mode_seconds,
21070
- courses_label: (settings.courses_label ?? "").trim()
21160
+ courses_label: (settings.courses_label ?? "").trim(),
21161
+ admission: settings.admission ?? DEFAULT_ADMISSION
21071
21162
  };
21072
21163
  }
21073
21164
  function roomContent(room) {
@@ -21136,13 +21227,21 @@ function localName(name, id, taken, fallback) {
21136
21227
  const withPrefix = `${slug}--${id.slice(0, 8)}`;
21137
21228
  return taken.has(withPrefix) ? `${slug}--${id}` : withPrefix;
21138
21229
  }
21139
- var REV_VERSION, settingsRev, joinLinkRev, roomRev, courseRev, moduleRev, lessonRev;
21230
+ var REV_VERSION, DEFAULT_ADMISSION, settingsRev, joinLinkRev, roomRev, courseRev, moduleRev, lessonRev;
21140
21231
  var init_model = __esm({
21141
21232
  "src/communities/model.ts"() {
21142
21233
  "use strict";
21143
21234
  init_dist();
21144
21235
  REV_VERSION = "v1";
21145
- settingsRev = (communityId, c) => rev(["settings", communityId, c.rules, c.slow_mode_seconds, c.courses_label]);
21236
+ DEFAULT_ADMISSION = "link";
21237
+ settingsRev = (communityId, c) => rev([
21238
+ "settings",
21239
+ communityId,
21240
+ c.rules,
21241
+ c.slow_mode_seconds,
21242
+ c.courses_label,
21243
+ ...c.admission === DEFAULT_ADMISSION ? [] : [c.admission]
21244
+ ]);
21146
21245
  joinLinkRev = (communityId, c) => rev(["join_link", communityId, c.enabled]);
21147
21246
  roomRev = (roomId, c) => rev(["room", roomId, c.name, c.archived]);
21148
21247
  courseRev = (courseId, c) => rev(["course", courseId, c.title, c.description, c.published]);
@@ -21550,10 +21649,11 @@ function readCommunityFolder(folder) {
21550
21649
  const settingsRev2 = settings ? optionalString(settings, "rev", `${COMMUNITY_FILE} settings`, problems2) : void 0;
21551
21650
  const slowMode = settings?.slow_mode_seconds;
21552
21651
  const coursesLabel = settings?.courses_label ?? "";
21652
+ const admission = settings?.admission ?? DEFAULT_ADMISSION;
21553
21653
  if (settings && typeof slowMode !== "number") problems2.push(`${COMMUNITY_FILE} settings: slow_mode_seconds must be a number`);
21554
21654
  if (typeof coursesLabel !== "string") problems2.push(`${COMMUNITY_FILE} settings: courses_label must be text`);
21555
21655
  if (settings && typeof slowMode === "number" && typeof coursesLabel === "string") {
21556
- const parsed = communitySettingsBody.safeParse({ rules, slow_mode_seconds: slowMode, courses_label: coursesLabel });
21656
+ const parsed = communitySettingsBody.safeParse({ rules, slow_mode_seconds: slowMode, courses_label: coursesLabel, admission });
21557
21657
  if (!parsed.success) problems2.push(`settings: ${contractProblem(parsed.error)}`);
21558
21658
  }
21559
21659
  if (typeof doc.join_link_enabled !== "boolean") problems2.push(`${COMMUNITY_FILE}: join_link_enabled must be true or false`);
@@ -21572,7 +21672,8 @@ ${problems2.map((p) => ` - ${p}`).join("\n")}`);
21572
21672
  settings: {
21573
21673
  ...settingsRev2 === void 0 ? {} : { rev: settingsRev2 },
21574
21674
  slow_mode_seconds: slowMode,
21575
- courses_label: coursesLabel
21675
+ courses_label: coursesLabel,
21676
+ admission
21576
21677
  },
21577
21678
  rules,
21578
21679
  join_link_enabled: doc.join_link_enabled,
@@ -21675,7 +21776,8 @@ function renderCommunityYaml(files) {
21675
21776
  settings: {
21676
21777
  ...files.settings.rev ? { rev: files.settings.rev } : {},
21677
21778
  slow_mode_seconds: files.settings.slow_mode_seconds,
21678
- courses_label: files.settings.courses_label
21779
+ courses_label: files.settings.courses_label,
21780
+ admission: files.settings.admission
21679
21781
  },
21680
21782
  join_link_enabled: files.join_link_enabled,
21681
21783
  ...files.join_link_rev ? { join_link_rev: files.join_link_rev } : {},
@@ -21733,7 +21835,7 @@ var init_files = __esm({
21733
21835
  init_model();
21734
21836
  init_course_files();
21735
21837
  TOP_KEYS = ["community_id", "name", "settings", "join_link_enabled", "join_link_rev", "rooms", "courses", "synced"];
21736
- SETTINGS_KEYS = ["rev", "slow_mode_seconds", "courses_label"];
21838
+ SETTINGS_KEYS = ["rev", "slow_mode_seconds", "courses_label", "admission"];
21737
21839
  ROOM_KEYS = ["key", "id", "rev", "name", "kind", "archived"];
21738
21840
  }
21739
21841
  });
@@ -23171,9 +23273,13 @@ function settingsChanges(from, to) {
23171
23273
  const out = [];
23172
23274
  if (from.slow_mode_seconds !== to.slow_mode_seconds) out.push(`slow_mode_seconds ${from.slow_mode_seconds} \u2192 ${to.slow_mode_seconds}`);
23173
23275
  if (from.courses_label !== to.courses_label) out.push(`courses_label ${show(from.courses_label)} \u2192 ${show(to.courses_label)}`);
23276
+ if (from.admission !== to.admission) out.push(`admission ${from.admission} \u2192 ${to.admission}`);
23174
23277
  if (from.rules !== to.rules) out.push("rules (rules.md)");
23175
23278
  return out;
23176
23279
  }
23280
+ function admissionChange(to) {
23281
+ return to === "invite" ? "From now on the link admits only the organization's owners and admins and the emails on the access list (wayai communities access). Current members stay, including anyone who joined with a shared link; any other member who leaves needs their email on the list to join again." : "From now on anyone with the join link can join. The access list is kept.";
23282
+ }
23177
23283
  function roomChanges(from, to) {
23178
23284
  const out = [];
23179
23285
  if (from.name !== to.name) out.push(`name ${show(from.name)} \u2192 ${show(to.name)}`);
@@ -23209,7 +23315,8 @@ function settingsPatch(files, server) {
23209
23315
  // Raw: the text as the file holds it; the server trims it and reads '' as none.
23210
23316
  ...file.rules !== server.rules ? { rules: files.rules } : {},
23211
23317
  ...file.slow_mode_seconds !== server.slow_mode_seconds ? { slow_mode_seconds: files.settings.slow_mode_seconds } : {},
23212
- ...file.courses_label !== server.courses_label ? { courses_label: files.settings.courses_label } : {}
23318
+ ...file.courses_label !== server.courses_label ? { courses_label: files.settings.courses_label } : {},
23319
+ ...file.admission !== server.admission ? { admission: file.admission } : {}
23213
23320
  };
23214
23321
  }
23215
23322
  function roomPatch(entry, room) {
@@ -23229,10 +23336,12 @@ function takeRoom(entry, room) {
23229
23336
  entry.kind = room.kind;
23230
23337
  }
23231
23338
  function takeSettings(files, settings) {
23339
+ const { content, rev: rev2 } = serverSettings(files.community_id, settings);
23232
23340
  files.settings = {
23233
- rev: serverSettings(files.community_id, settings).rev,
23341
+ rev: rev2,
23234
23342
  slow_mode_seconds: settings.slow_mode_seconds,
23235
- courses_label: settings.courses_label ?? ""
23343
+ courses_label: settings.courses_label ?? "",
23344
+ admission: content.admission
23236
23345
  };
23237
23346
  files.rules = settings.rules ?? "";
23238
23347
  }
@@ -23346,6 +23455,7 @@ function pushListing(plan, courses) {
23346
23455
  const { settings, joinLink } = plan;
23347
23456
  if (settings.state === "local") {
23348
23457
  listing.changes.push(`~ settings: ${settingsChanges(settings.server, settings.file).join("; ")}`);
23458
+ if (settings.server.admission !== settings.file.admission) listing.changes.push(` ${admissionChange(settings.file.admission)}`);
23349
23459
  if (settings.server.rules !== settings.file.rules) {
23350
23460
  listing.changes.push(...lineDiff(settings.server.rules, settings.file.rules).map((line) => ` ${line}`));
23351
23461
  }
@@ -23531,7 +23641,7 @@ function filesFromServer(server) {
23531
23641
  const files = {
23532
23642
  community_id: server.community.community_id,
23533
23643
  name: server.community.name,
23534
- settings: { slow_mode_seconds: 0, courses_label: "" },
23644
+ settings: { slow_mode_seconds: 0, courses_label: "", admission: DEFAULT_ADMISSION },
23535
23645
  rules: "",
23536
23646
  join_link_enabled: false,
23537
23647
  rooms: [],
@@ -24063,7 +24173,7 @@ async function pushSingleHub(client, hubId, hubFolder, autoConfirm, organization
24063
24173
  return true;
24064
24174
  }
24065
24175
  function selectExistingHub(workspaceDir, allHubs, selector, wsLabel) {
24066
- if (selector) {
24176
+ if (selector !== void 0) {
24067
24177
  const match = allHubs.find(
24068
24178
  (h) => h.hubId === selector || path28.basename(h.hubFolder) === selector
24069
24179
  );
@@ -24248,7 +24358,7 @@ function resolveHubTarget(workspaceDir, selector) {
24248
24358
  const gitRoot = findGitRoot();
24249
24359
  const wsLabel = hubsDirLabel(gitRoot);
24250
24360
  const allHubs = scanWorkspaceHubs(workspaceDir);
24251
- if (selector) {
24361
+ if (selector !== void 0) {
24252
24362
  const match = allHubs.find(
24253
24363
  (h) => h.hubId === selector || path29.basename(h.hubFolder) === selector
24254
24364
  );
@@ -24471,7 +24581,8 @@ var init_pull = __esm({
24471
24581
  // src/commands/create.ts
24472
24582
  var create_exports = {};
24473
24583
  __export(create_exports, {
24474
- createCommand: () => createCommand
24584
+ createCommand: () => createCommand,
24585
+ parseArgs: () => parseArgs8
24475
24586
  });
24476
24587
  import * as path30 from "path";
24477
24588
  import * as fs22 from "fs";
@@ -24483,7 +24594,7 @@ function parseArgs8(args2) {
24483
24594
  const arg = args2[i];
24484
24595
  if (arg === "--yes" || arg === "-y") {
24485
24596
  autoConfirm = true;
24486
- } else if (arg === "--label" && args2[i + 1]) {
24597
+ } else if (arg === "--label") {
24487
24598
  label = args2[++i];
24488
24599
  } else if (!arg.startsWith("-") && folderSelector === void 0) {
24489
24600
  folderSelector = arg;
@@ -24633,6 +24744,7 @@ var init_diff = __esm({
24633
24744
  // src/commands/replicate.ts
24634
24745
  var replicate_exports = {};
24635
24746
  __export(replicate_exports, {
24747
+ parseArgs: () => parseArgs10,
24636
24748
  replicateCommand: () => replicateCommand
24637
24749
  });
24638
24750
  import * as fs23 from "fs";
@@ -24642,7 +24754,7 @@ function parseArgs10(args2) {
24642
24754
  let hubSelector;
24643
24755
  for (let i = 0; i < args2.length; i++) {
24644
24756
  const arg = args2[i];
24645
- if (arg === "--label" && args2[i + 1]) {
24757
+ if (arg === "--label") {
24646
24758
  label = args2[++i];
24647
24759
  } else if (arg === "--hub" && args2[i + 1]) {
24648
24760
  hubSelector = args2[++i];
@@ -31374,8 +31486,12 @@ async function communitiesCommand(args2) {
31374
31486
  if (sub === "join-link" && !JOIN_LINK_ACTIONS.includes(action)) {
31375
31487
  throw usageError("join-link takes get, rotate or off.");
31376
31488
  }
31489
+ if (sub === "access" && !ACCESS_ACTIONS.includes(action)) {
31490
+ throw usageError("access takes list, add or remove.");
31491
+ }
31377
31492
  const changesLink = sub === "join-link" && action !== "get";
31378
- if (yes && !changesLink) throw usageError("-y applies only to `join-link rotate` and `join-link off`.");
31493
+ const asks = changesLink || sub === "access" && action === "remove";
31494
+ if (yes && !asks) throw usageError("-y applies only to `join-link rotate`, `join-link off` and `access remove`.");
31379
31495
  switch (sub) {
31380
31496
  case "list":
31381
31497
  if (rest.length > 0) throw usageError(`Unexpected argument ${JSON.stringify(rest[0])}.`);
@@ -31393,6 +31509,21 @@ async function communitiesCommand(args2) {
31393
31509
  if (selector === void 0 || extra.length > 0) throw usageError("stats takes one <community>.");
31394
31510
  return runStats(targetOf(selector, org), json);
31395
31511
  }
31512
+ case "access": {
31513
+ const [, selector, ...emails] = rest;
31514
+ if (selector === void 0) throw usageError(`access ${action} takes a <community>.`);
31515
+ if (action === "list" && emails.length > 0) throw usageError("access list takes one <community>.");
31516
+ if (action === "add" && emails.length === 0) throw usageError("access add takes a <community> and one or more emails.");
31517
+ if (action === "remove" && emails.length !== 1) throw usageError("access remove takes a <community> and one email.");
31518
+ const valid = accessEmails(emails);
31519
+ if (action === "remove" && !yes && !isInteractive()) {
31520
+ throw usageError("access remove asks before it removes anyone; pass -y when not running in a terminal.");
31521
+ }
31522
+ const target = targetOf(selector, org);
31523
+ if (action === "list") return runAccessList(target, json);
31524
+ if (action === "add") return runAccessAdd(target, valid, json);
31525
+ return runAccessRemove(target, valid[0], { json, yes });
31526
+ }
31396
31527
  }
31397
31528
  }
31398
31529
  async function runList(orgId, json) {
@@ -31419,17 +31550,24 @@ async function runJoinLink(action, target, { json, yes }) {
31419
31550
  printLink(data2, label, json);
31420
31551
  return;
31421
31552
  }
31422
- console.error(
31423
- action === "rotate" ? `This replaces the join link of ${label} with a new one and turns it on.` : `This turns off the join link of ${label}.`
31553
+ await warnThenAsk(
31554
+ [
31555
+ action === "rotate" ? `This replaces the join link of ${label} with a new one and turns it on.` : `This turns off the join link of ${label}.`,
31556
+ "Every link shared before stops working."
31557
+ ],
31558
+ yes,
31559
+ "Aborted: the join link is unchanged."
31424
31560
  );
31425
- console.error("Every link shared before stops working.");
31426
- if (!yes && !await confirm("Proceed?")) throw expected("Aborted: the join link is unchanged.");
31427
31561
  const { data } = await callCommunities(
31428
31562
  action === "rotate" ? api.replaceCommunityJoinLink(id) : api.disableCommunityJoinLink(id),
31429
31563
  notFound
31430
31564
  );
31431
31565
  printLink(data, label, json);
31432
31566
  }
31567
+ async function warnThenAsk(warning, yes, aborted) {
31568
+ for (const line of warning) console.error(line);
31569
+ if (!yes && !await confirm("Proceed?")) throw expected(aborted);
31570
+ }
31433
31571
  function printLink(link, label, json) {
31434
31572
  if (json) {
31435
31573
  console.log(JSON.stringify(link, null, 2));
@@ -31486,11 +31624,107 @@ function printStats(stats, label) {
31486
31624
  }
31487
31625
  }
31488
31626
  }
31489
- var USAGE2, SUBCOMMANDS, JOIN_LINK_ACTIONS;
31627
+ function accessEmails(raw) {
31628
+ const emails = /* @__PURE__ */ new Set();
31629
+ const invalid = [];
31630
+ for (const value of raw) {
31631
+ const parsed = communityAccessEmailSchema.safeParse(value);
31632
+ if (parsed.success) emails.add(parsed.data);
31633
+ else invalid.push(JSON.stringify(sanitizeTerminalText(value)));
31634
+ }
31635
+ if (invalid.length > 0) {
31636
+ throw expected(`Not ${invalid.length === 1 ? "an email" : "emails"}: ${invalid.join(", ")}. Nothing was sent.`);
31637
+ }
31638
+ if (emails.size > COMMUNITY_ACCESS_ADD_MAX) {
31639
+ throw expected(`An add takes at most ${COMMUNITY_ACCESS_ADD_MAX} emails, and ${emails.size} were given. Nothing was sent.`);
31640
+ }
31641
+ return [...emails];
31642
+ }
31643
+ async function callAccess(request, notFound, label) {
31644
+ try {
31645
+ return await callCommunities(request, notFound);
31646
+ } catch (err) {
31647
+ if (err instanceof ApiError && err.status === 409) {
31648
+ const reason = extractApiErrorReason(err);
31649
+ if (reason === COMMUNITY_ACCESS_FULL_REASON) {
31650
+ throw expected(`Nothing was added: the access list of ${label} would hold more than ${COMMUNITY_ACCESS_MAX} emails.`);
31651
+ }
31652
+ if (reason === PEOPLE_SUSPENDED_REASON) {
31653
+ throw expected("WayAI has suspended this account, so it cannot change a community's access list.");
31654
+ }
31655
+ }
31656
+ throw err;
31657
+ }
31658
+ }
31659
+ async function* accessPages(api, id, notFound) {
31660
+ let cursor;
31661
+ do {
31662
+ const { data } = await callCommunities(api.listCommunityAccess(id, cursor), notFound);
31663
+ yield data.entries;
31664
+ cursor = data.next_cursor ?? void 0;
31665
+ } while (cursor !== void 0);
31666
+ }
31667
+ async function runAccessList(target, json) {
31668
+ const api = await communitiesClient();
31669
+ const { id, label } = await resolveCommunity(api, target);
31670
+ const entries = [];
31671
+ for await (const page of accessPages(api, id, communityNotFound(label))) entries.push(...page);
31672
+ if (json) {
31673
+ console.log(JSON.stringify(entries, null, 2));
31674
+ return;
31675
+ }
31676
+ if (entries.length === 0) {
31677
+ console.log(`The access list of ${label} is empty.`);
31678
+ return;
31679
+ }
31680
+ console.log(`The access list of ${label}: ${entries.length} email(s), oldest first
31681
+ `);
31682
+ printRows(entries.map((entry) => ({ email: entry.email, added: entry.created_at })));
31683
+ }
31684
+ async function runAccessAdd(target, emails, json) {
31685
+ const api = await communitiesClient();
31686
+ const { id, label } = await resolveCommunity(api, target);
31687
+ const { data } = await callAccess(api.addCommunityAccess(id, { emails }), communityNotFound(label), label);
31688
+ if (json) {
31689
+ console.log(JSON.stringify(data, null, 2));
31690
+ return;
31691
+ }
31692
+ const { added, already_listed: already } = data;
31693
+ const listed2 = already === 0 ? "" : `; ${already} ${already === 1 ? "was" : "were"} already on it`;
31694
+ console.log(`Added ${added.length} email(s) to the access list of ${label}${listed2}.`);
31695
+ }
31696
+ async function runAccessRemove(target, email, { json, yes }) {
31697
+ const api = await communitiesClient();
31698
+ const { id, label } = await resolveCommunity(api, target);
31699
+ let entry;
31700
+ for await (const page of accessPages(api, id, communityNotFound(label))) {
31701
+ entry = page.find((e) => e.email === email);
31702
+ if (entry) break;
31703
+ }
31704
+ if (!entry) throw expected(`${email} is not on the access list of ${label}. Nothing was removed.`);
31705
+ await warnThenAsk(
31706
+ [`This takes ${email} off the access list of ${label}.`, "Anyone this email let in is removed from the community now."],
31707
+ yes,
31708
+ "Aborted: the access list is unchanged."
31709
+ );
31710
+ await callAccess(
31711
+ api.removeCommunityAccess(id, entry.access_id),
31712
+ `${email} is no longer on the access list of ${label}, or you are not an owner or admin of its organization. Nothing was removed.`,
31713
+ label
31714
+ );
31715
+ if (json) {
31716
+ console.log(JSON.stringify(entry, null, 2));
31717
+ return;
31718
+ }
31719
+ console.log(`Removed ${email} from the access list of ${label}, and from the community anyone it let in.`);
31720
+ }
31721
+ var USAGE2, SUBCOMMANDS, JOIN_LINK_ACTIONS, ACCESS_ACTIONS;
31490
31722
  var init_communities = __esm({
31491
31723
  "src/commands/communities.ts"() {
31492
31724
  "use strict";
31493
31725
  init_contracts();
31726
+ init_api_client();
31727
+ init_errors2();
31494
31728
  init_expected();
31495
31729
  init_repo_config();
31496
31730
  init_terminal_output();
@@ -31507,6 +31741,9 @@ Usage:
31507
31741
  wayai communities join-link rotate <community> [--org <org_id>] [-y] [--json]
31508
31742
  wayai communities join-link off <community> [--org <org_id>] [-y] [--json]
31509
31743
  wayai communities stats <community> [--org <org_id>] [--json]
31744
+ wayai communities access list <community> [--org <org_id>] [--json]
31745
+ wayai communities access add <community> <email>... [--org <org_id>] [--json]
31746
+ wayai communities access remove <community> <email> [--org <org_id>] [-y] [--json]
31510
31747
 
31511
31748
  <community> is a community id, or its exact name within the organization.
31512
31749
  The organization is --org, else this repo's (wayai-ws/wayai.yaml).
@@ -31515,15 +31752,24 @@ join-link get Print the join link, or that it is off
31515
31752
  join-link rotate Replace the link with a new one and turn it on
31516
31753
  join-link off Turn the link off
31517
31754
  stats Members, joins by source, messages and course completions
31755
+ access list Print the emails on the access list, oldest first
31756
+ access add Add emails to it, at most ${COMMUNITY_ACCESS_ADD_MAX} at a time
31757
+ access remove Take an email off it, and remove from the community anyone it let in
31518
31758
 
31519
- rotate and off make every link shared before stop working. Both ask first;
31520
- -y skips the question, and is required when not run in a terminal.
31759
+ The access list is who the join link admits once the community is invite-only
31760
+ (settings.admission: invite in community.yaml, or the web console). Emails
31761
+ match exactly, once trimmed and lowercased.
31762
+
31763
+ rotate and off make every link shared before stop working, and access remove
31764
+ removes members. All three ask first; -y skips the question, and is required
31765
+ when not run in a terminal.
31521
31766
 
31522
31767
  These commands need a browser sign-in (\`wayai login\`). An API token
31523
31768
  (\`wayai login --token\`, or WAYAI_TOKEN) is refused.
31524
31769
  `.trim();
31525
- SUBCOMMANDS = ["list", "join-link", "stats"];
31770
+ SUBCOMMANDS = ["list", "join-link", "stats", "access"];
31526
31771
  JOIN_LINK_ACTIONS = ["get", "rotate", "off"];
31772
+ ACCESS_ACTIONS = ["list", "add", "remove"];
31527
31773
  }
31528
31774
  });
31529
31775
 
@@ -37085,6 +37331,11 @@ async function main() {
37085
37331
  await printHelp3();
37086
37332
  return;
37087
37333
  }
37334
+ const flagRefusal = entryFlagRefusal(command, args, new Set(DATA_NAMESPACES));
37335
+ if (flagRefusal) {
37336
+ console.error(flagRefusal);
37337
+ process.exit(1);
37338
+ }
37088
37339
  if (command && !wantsHelp(args)) {
37089
37340
  const { findGitRoot: findGitRoot2 } = await Promise.resolve().then(() => (init_workspace(), workspace_exports));
37090
37341
  const { healSkillLinkForCommand: healSkillLinkForCommand2 } = await Promise.resolve().then(() => (init_skill_symlink(), skill_symlink_exports));
@@ -37348,7 +37599,7 @@ Commands:
37348
37599
  sync-skills Sync skills to Anthropic/OpenAI provider connections
37349
37600
  sync-mcp Re-discover an MCP connection's tools (refresh stale schemas)
37350
37601
  list List organizations and hubs
37351
- communities An organization's communities: list, join link (get/rotate/off), stats \u2014 \`wayai communities --help\`
37602
+ communities An organization's communities: list, join link (get/rotate/off), stats, access list (list/add/remove) \u2014 \`wayai communities --help\`
37352
37603
  report create Report a platform bug (submits to the triage queue)
37353
37604
  report edit Amend your own pending report (title/description/error/steps/context)
37354
37605
  update Update CLI to the latest version