primcli 3.0.0-preview.8 → 3.0.0-preview.9
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/{api-command-TUwewvqZ.js → api-command-DugUWmZH.js} +679 -112
- package/dist/{machine-session-DNnNhhFr.js → machine-session-Cre9Mt_2.js} +4 -4
- package/dist/{notify-session-CeIflLIX.js → notify-session-DHqBICIk.js} +2 -2
- package/dist/oclif/auto-signal-worker.js +3 -3
- package/dist/oclif/auto-signals.js +1 -1
- package/dist/oclif/index.js +930 -296
- package/dist/oclif/receiver-heal.js +2 -2
- package/dist/{repeats-Dj_o6c-X-DNbrLjEF.js → repeats-Dj_o6c-X-DqcHvqvW.js} +50 -8
- package/dist/{scoped-chat-Dd3P8Q-m.js → scoped-chat-BpUAgX4g.js} +1 -1
- package/dist/{signal-command-DZQemE9I.js → signal-command-B66YR0-A.js} +4 -4
- package/package.json +4 -1
package/dist/oclif/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { $ as readEmailInteraction, A as explainPendingMailNotFound, At as cliInvocation, Bt as formatAlreadySentNotice, C as promptLine$2, Ct as sendOutcomeExitCode, D as formatBrowserLoginInstructions, Dt as successfulSendOutcome, E as canOfferCopyHotkey, Et as serializeErrorPayload, F as latestOwnOutbound, Ft as loadSkillLine, G as clearConsumedPendingMail, Gt as classificationFactLines, H as wakeRecipientField, Ht as emptyEmailListHint, I as readThreadContext, It as currentMailSessionKey, J as readPendingMail, Jt as noFactsMessage, K as clearReadPendingMail, Kt as classificationOf, L as sentInThread, Lt as detectAgentRuntime, M as describeWake, N as displayAddress, Nt as generatedAgentName, O as listenForCopyHotkey, Ot as thrownErrorExitCode, P as formatMailWakeLine, Pt as identitySuggestions, Q as interactionNextActions, Qt as ConnectedAgentKeyRequiredError, R as serverMuted, Rt as detectRuntimeSession, S as approveThenRerunHint, St as sendIdentityFields, T as withApproval, Tt as sentHistoryWindowStart, U as wakeRelationship, Ut as mailReach, V as wakeReadCommand, Vt as withFlagSuggestion, W as claimPendingMail, Wt as readCallerMailFor, X as removePendingMail, Xt as ATTACHMENT_WAIT_MAX_MS, Y as recordPendingMail, Yt as ATTACHMENT_WAIT_FLAG_DESCRIPTION, Z as interactionHumanLine, Zt as withAttachmentWait, _ as takesStepUp, _n as setKnownCommands, _t as formatPriorRepliesWarning, a as createOperationCommand, an as selectedOrgFromEnv, at as SEND_OUTCOME_HELP, b as STEP_UP_HEADER$1, bt as priorRepliesThatWentOut, c as formatErrorPayload, cn as credentialsFromUserLogin, ct as buildFollowUpCommand, d as isGrantRefusal, dn as revokeUserLogin, dt as classifySendError, en as createAuthenticatedCliApiClient, et as replyExpectation, f as parameterFlagName, fn as roleKeyLabel, ft as deriveSendIdempotencyKey, g as surfaceUnauthorizedHint, gn as sanitizeForTerminal, gt as formatPriorRepliesCheckSkipped, h as runWithTiming, hn as routeWarningLines, ht as formatDeletedEarlierSendNotice, i as TIME_FLAG_DESCRIPTION, in as resolveCliApiRequestConfig, it as MAX_SEND_WAIT_TIMEOUT_MS, j as bareAddress, jt as connectNextSteps, k as openBrowser, l as hasControlCharacter$1, ln as fetchCliOrgs, lt as buildThrownSendFailureEnvelope, m as refusalDetails, mn as switchCurrentOrg, mt as followUpCommandPrefix, n as API_ERROR_CODES, nn as refreshStoredCliCredentials, o as extractErrorCode, on as CliOrgRefusedError, ot as apiResultHttpStatus, p as readTextFileFlag, pn as roleKeyText, pt as excludeSignalReplies, q as pendingMailPath, qt as isEmailId, r as OPERATION_PATH_FLAGS, rn as refuseOrgSelectionForProfile, rt as IDEMPOTENCY_KEY_FLAG_DESCRIPTION, s as extractErrorPayload, sn as RESTRICTED_ROLE_NOTE, st as assertValidIdempotencyKey, t as API_BASE_URL_FLAG_DESCRIPTION, tn as createCliApiClient, tt as replyInteractionWarning, u as headerFlagName, un as isBuiltInRoleKey, ut as checkPriorReplies, v as writeErrorWithHints, vn as operationManifest, vt as formatSendFailureSummary, w as terminalApprovalIo, wt as sendWaitClampNotice, x as STEP_UP_TOKEN_FLAG_DESCRIPTION, xt as reportSendCommandResult, y as BROWSER_FLAG_DESCRIPTION, yt as formatSendRecordFailureSummary, z as serverRelationship, zt as runtimeSessionVariableList } from "../api-command-
|
|
2
|
-
import { $ as parseFromHeader, $n as startAgentClaim, $t as getSendFrom, A as lateMailReread, An as listWakeSchedules, At as downloadEmailAttachmentArchiveMember, B as ensureSearchReportsReplyState, Bn as resendAgentSignupVerification, Bt as getCreditBalance, C as waitOutRetryAfter, Cn as listRepeatingSends, Ct as createWakeSchedule, D as encodeReceivedAtSearchCursor, Dn as listSentEmails, Dt as deleteRoute, E as cursorFromAcceptedRows, En as listSentAttachmentArchiveMembers, Et as deleteMemory, F as AWAITING_VALUES, Ft as getAccessMode, G as queryUsesAwaiting, Gn as searchEmails, Gt as getFunctionTestRunTrace, H as formatRepliesCell, Hn as rotateKey, Ht as getEmail, I as REPLY_STATE_UNSUPPORTED_CODE, In as redeemCreditCode, It as getAccount, Jn as sendEmail, Jt as getMemory, Kn as searchMemories, Kt as getInboxStatus, L as ReplyStateUnsupportedError, Ln as removeDefaultNetworkMember, Lt as getAgentContactPolicy, M as sinceFromFlags, Mn as pullWebhookEvent, N as sleep$3, Nt as downloadSentAttachmentArchiveMember, O as fetchEmailSearchPage, On as listWakeAuthorizations, Ot as deleteWakeAuthorization, P as AWAITING_FLAG_DESCRIPTION, Pt as downloadSentAttachmentByFilename, Q as parseWebhookEvent, Qn as simulateRoute, Qt as getRepeatingSend, R as assertAwaitingFilterRows, Rn as reorderRoutes, S as transientFailure, Sn as listOrganizationPeople, St as createWakeAuthorization, T as collectNewAcceptedEmails, Tn as listRoutes, U as hasReplyState, Un as runWakeSchedule, Ut as getFunction, V as formatAwaitingCell, Vn as revokeCredential, Vt as getDefaultNetworkAgent, W as isAwaitingRejectedError, Wt as getFunctionRouting, X as isEmailReceivedEvent, Xn as setFunctionSecret, Xt as getOutboundStatus, Yn as setFunctionRoute, Yt as getOrgRoutingTopology, Zn as setMemory, Zt as getOwnGrant, _ as describeApiFailure, _n as listFunctionLogs, _t as completeWebhookEvent, a as REPEAT_IDLE_MAX_MINUTES, an as listActivityObjects, ar as updateDefaultNetworkMember, at as automatedRejectedError, b as retryTransient, bn as listKeys, bt as createKey, cn as listAgentNetworks, cr as updateRepeatingSend, d as parseRepeatTick, dn as listDefaultNetworkMembers, dr as updateWakeSchedule, dt as addDefaultNetworkMember, en as getSentEmail, er as startAgentSignup, et as AUTOMATED_FILTER_UNSUPPORTED_CODE, f as preparePresenceAliveEmail, fn as listDomains, fr as verifyAgentClaim, ft as cancelSentEmail, g as WaitDeadlineReached, gn as listEndpoints, gt as cliLogout, hn as listEmails, ht as checkSendability, i as REPEAT_EVERY_MAX_MINUTES, in as leaveOrganization, ir as unsetFunctionRoute, it as assertAutomatedVerdict, j as quoteDslValue, jn as pollCliLogin, jt as downloadEmailAttachmentByFilename, k as filtersFromFlags, kn as listWakeDispatches, kt as deleteWakeSchedule, l as parseInteractionEnvelope, lr as updateRoute, lt as hasAutomatedVerdict, m as repeatStopCommand, mn as listEmailRuleResults, mr as whoami, mt as checkDefaultNetworkContactAdmission, nn as getWakeSchedule, nr as stopRepeatFromEmail, nt as AUTOMATED_VALUES, o as REPEAT_MAX_SENDS_MAX, or as updateFunction, p as prepareSignalEmail, pn as listEmailAttachmentArchiveMembers, pr as verifyAgentSignup, pt as cancelSentEmailByIdempotencyKey, qn as semanticSearch, qt as getKey, rr as testFunction, rt as AutomatedFilterUnsupportedError, s as buildRepeatStopBody, sn as listAgentContacts, sr as updateKey, tn as getThread, tr as startCliLogin, tt as AUTOMATED_FLAG_DESCRIPTION, u as parsePresenceEnvelope, un as listDefaultNetworkAgents, ur as updateWakeAuthorization, ut as isAutomatedRejectedError, vn as listFunctions, vt as createEndpoint, w as SINCE_VALUE_HELP, wn as listRoles, x as retryingOperation, xn as listMailboxAccess, xt as createRoute, y as pauseForTransientFailure, yn as listGroups, yt as createFunction, z as awaitingRejectedError, zn as replyToEmail, zt as getConversation } from "../repeats-Dj_o6c-X-
|
|
3
|
-
import { S as readBundledConnectSkill, _ as NotificationOutcomeUnknownError, a as NotificationRetryError, b as installedConnectSkillFile, c as readConversationStatusContent, d as SESSION_UUID$1, g as NativeSessionNotLoadedError, h as NativeSessionError, i as notificationReceiptPage, l as createListenHandler, m as NativeSessionDisconnectedError, n as notificationSenders, o as isRoutineNotificationContent, p as defaultSessionSocket, r as openSessionNotifications, s as notificationPartReader, t as notificationScope, u as readableDelivery, v as connectSkillTarget, x as installedVersion, y as installConnectSkill } from "../notify-session-
|
|
1
|
+
import { $ as readEmailInteraction, A as explainPendingMailNotFound, At as cliInvocation, Bt as formatAlreadySentNotice, C as promptLine$2, Ct as sendOutcomeExitCode, D as formatBrowserLoginInstructions, Dt as successfulSendOutcome, E as canOfferCopyHotkey, Et as serializeErrorPayload, F as latestOwnOutbound, Ft as loadSkillLine, G as clearConsumedPendingMail, Gt as classificationFactLines, H as wakeRecipientField, Ht as emptyEmailListHint, I as readThreadContext, It as currentMailSessionKey, J as readPendingMail, Jt as noFactsMessage, K as clearReadPendingMail, Kt as classificationOf, L as sentInThread, Lt as detectAgentRuntime, M as describeWake, N as displayAddress, Nt as generatedAgentName, O as listenForCopyHotkey, Ot as thrownErrorExitCode, P as formatMailWakeLine, Pt as identitySuggestions, Q as interactionNextActions, Qt as ConnectedAgentKeyRequiredError, R as serverMuted, Rt as detectRuntimeSession, S as approveThenRerunHint, St as sendIdentityFields, T as withApproval, Tt as sentHistoryWindowStart, U as wakeRelationship, Ut as mailReach, V as wakeReadCommand, Vt as withFlagSuggestion, W as claimPendingMail, Wt as readCallerMailFor, X as removePendingMail, Xt as ATTACHMENT_WAIT_MAX_MS, Y as recordPendingMail, Yt as ATTACHMENT_WAIT_FLAG_DESCRIPTION, Z as interactionHumanLine, Zt as withAttachmentWait, _ as takesStepUp, _n as setKnownCommands, _t as formatPriorRepliesWarning, a as createOperationCommand, an as selectedOrgFromEnv, at as SEND_OUTCOME_HELP, b as STEP_UP_HEADER$1, bt as priorRepliesThatWentOut, c as formatErrorPayload, cn as credentialsFromUserLogin, ct as buildFollowUpCommand, d as isGrantRefusal, dn as revokeUserLogin, dt as classifySendError, en as createAuthenticatedCliApiClient, et as replyExpectation, f as parameterFlagName, fn as roleKeyLabel, ft as deriveSendIdempotencyKey, g as surfaceUnauthorizedHint, gn as sanitizeForTerminal, gt as formatPriorRepliesCheckSkipped, h as runWithTiming, hn as routeWarningLines, ht as formatDeletedEarlierSendNotice, i as TIME_FLAG_DESCRIPTION, in as resolveCliApiRequestConfig, it as MAX_SEND_WAIT_TIMEOUT_MS, j as bareAddress, jt as connectNextSteps, k as openBrowser, l as hasControlCharacter$1, ln as fetchCliOrgs, lt as buildThrownSendFailureEnvelope, m as refusalDetails, mn as switchCurrentOrg, mt as followUpCommandPrefix, n as API_ERROR_CODES, nn as refreshStoredCliCredentials, o as extractErrorCode, on as CliOrgRefusedError, ot as apiResultHttpStatus, p as readTextFileFlag, pn as roleKeyText, pt as excludeSignalReplies, q as pendingMailPath, qt as isEmailId, r as OPERATION_PATH_FLAGS, rn as refuseOrgSelectionForProfile, rt as IDEMPOTENCY_KEY_FLAG_DESCRIPTION, s as extractErrorPayload, sn as RESTRICTED_ROLE_NOTE, st as assertValidIdempotencyKey, t as API_BASE_URL_FLAG_DESCRIPTION, tn as createCliApiClient, tt as replyInteractionWarning, u as headerFlagName, un as isBuiltInRoleKey, ut as checkPriorReplies, v as writeErrorWithHints, vn as operationManifest, vt as formatSendFailureSummary, w as terminalApprovalIo, wt as sendWaitClampNotice, x as STEP_UP_TOKEN_FLAG_DESCRIPTION, xt as reportSendCommandResult, y as BROWSER_FLAG_DESCRIPTION, yt as formatSendRecordFailureSummary, z as serverRelationship, zt as runtimeSessionVariableList } from "../api-command-DugUWmZH.js";
|
|
2
|
+
import { $ as parseFromHeader, $n as startAgentClaim, $t as getSendFrom, A as lateMailReread, An as listWakeSchedules, At as downloadEmailAttachmentArchiveMember, B as ensureSearchReportsReplyState, Bn as resendAgentSignupVerification, Bt as getCreditBalance, C as waitOutRetryAfter, Cn as listRepeatingSends, Ct as createWakeSchedule, D as encodeReceivedAtSearchCursor, Dn as listSentEmails, Dt as deleteRoute, E as cursorFromAcceptedRows, En as listSentAttachmentArchiveMembers, Et as deleteMemory, F as AWAITING_VALUES, Ft as getAccessMode, G as queryUsesAwaiting, Gn as searchEmails, Gt as getFunctionTestRunTrace, H as formatRepliesCell, Hn as rotateKey, Ht as getEmail, I as REPLY_STATE_UNSUPPORTED_CODE, In as redeemCreditCode, It as getAccount, Jn as sendEmail, Jt as getMemory, Kn as searchMemories, Kt as getInboxStatus, L as ReplyStateUnsupportedError, Ln as removeDefaultNetworkMember, Lt as getAgentContactPolicy, M as sinceFromFlags, Mn as pullWebhookEvent, N as sleep$3, Nt as downloadSentAttachmentArchiveMember, O as fetchEmailSearchPage, On as listWakeAuthorizations, Ot as deleteWakeAuthorization, P as AWAITING_FLAG_DESCRIPTION, Pt as downloadSentAttachmentByFilename, Q as parseWebhookEvent, Qn as simulateRoute, Qt as getRepeatingSend, R as assertAwaitingFilterRows, Rn as reorderRoutes, S as transientFailure, Sn as listOrganizationPeople, St as createWakeAuthorization, T as collectNewAcceptedEmails, Tn as listRoutes, U as hasReplyState, Un as runWakeSchedule, Ut as getFunction, V as formatAwaitingCell, Vn as revokeCredential, Vt as getDefaultNetworkAgent, W as isAwaitingRejectedError, Wt as getFunctionRouting, X as isEmailReceivedEvent, Xn as setFunctionSecret, Xt as getOutboundStatus, Yn as setFunctionRoute, Yt as getOrgRoutingTopology, Zn as setMemory, Zt as getOwnGrant, _ as describeApiFailure, _n as listFunctionLogs, _t as completeWebhookEvent, a as REPEAT_IDLE_MAX_MINUTES, an as listActivityObjects, ar as updateDefaultNetworkMember, at as automatedRejectedError, b as retryTransient, bn as listKeys, bt as createKey, cn as listAgentNetworks, cr as updateRepeatingSend, d as parseRepeatTick, dn as listDefaultNetworkMembers, dr as updateWakeSchedule, dt as addDefaultNetworkMember, en as getSentEmail, er as startAgentSignup, et as AUTOMATED_FILTER_UNSUPPORTED_CODE, f as preparePresenceAliveEmail, fn as listDomains, fr as verifyAgentClaim, ft as cancelSentEmail, g as WaitDeadlineReached, gn as listEndpoints, gt as cliLogout, hn as listEmails, ht as checkSendability, i as REPEAT_EVERY_MAX_MINUTES, in as leaveOrganization, ir as unsetFunctionRoute, it as assertAutomatedVerdict, j as quoteDslValue, jn as pollCliLogin, jt as downloadEmailAttachmentByFilename, k as filtersFromFlags, kn as listWakeDispatches, kt as deleteWakeSchedule, l as parseInteractionEnvelope, lr as updateRoute, lt as hasAutomatedVerdict, m as repeatStopCommand, mn as listEmailRuleResults, mr as whoami, mt as checkDefaultNetworkContactAdmission, nn as getWakeSchedule, nr as stopRepeatFromEmail, nt as AUTOMATED_VALUES, o as REPEAT_MAX_SENDS_MAX, or as updateFunction, p as prepareSignalEmail, pn as listEmailAttachmentArchiveMembers, pr as verifyAgentSignup, pt as cancelSentEmailByIdempotencyKey, qn as semanticSearch, qt as getKey, rr as testFunction, rt as AutomatedFilterUnsupportedError, s as buildRepeatStopBody, sn as listAgentContacts, sr as updateKey, tn as getThread, tr as startCliLogin, tt as AUTOMATED_FLAG_DESCRIPTION, u as parsePresenceEnvelope, un as listDefaultNetworkAgents, ur as updateWakeAuthorization, ut as isAutomatedRejectedError, vn as listFunctions, vt as createEndpoint, w as SINCE_VALUE_HELP, wn as listRoles, x as retryingOperation, xn as listMailboxAccess, xt as createRoute, y as pauseForTransientFailure, yn as listGroups, yt as createFunction, z as awaitingRejectedError, zn as replyToEmail, zt as getConversation } from "../repeats-Dj_o6c-X-DqcHvqvW.js";
|
|
3
|
+
import { S as readBundledConnectSkill, _ as NotificationOutcomeUnknownError, a as NotificationRetryError, b as installedConnectSkillFile, c as readConversationStatusContent, d as SESSION_UUID$1, g as NativeSessionNotLoadedError, h as NativeSessionError, i as notificationReceiptPage, l as createListenHandler, m as NativeSessionDisconnectedError, n as notificationSenders, o as isRoutineNotificationContent, p as defaultSessionSocket, r as openSessionNotifications, s as notificationPartReader, t as notificationScope, u as readableDelivery, v as connectSkillTarget, x as installedVersion, y as installConnectSkill } from "../notify-session-DHqBICIk.js";
|
|
4
4
|
import { A as AGENT_ADDRESS_ENV, C as saveCliCredentials, D as loadActiveChatState, E as deleteChatState, F as agentProfilesDirectory, H as requireDefaultLoginProfile, M as AgentConnectionSetupError, N as agentProfileDirectory, O as loadChatConversationByLocalId, P as agentProfileName, R as loadConnectedAgentProfile, S as resolveCliAuth, T as chatStatePath, W as PrimitiveApiClient, _ as deleteCliCredentials, a as normalizeCliEnvironmentName, b as loadCliCredentials, c as resolveConfigEnvironment, g as credentialsPath, h as credentialsLockPath, i as loadCliConfig, j as AGENT_PROFILE_ENV, k as saveActiveChatState, l as saveCliConfig, m as cliAccessTokenExpiresAt, n as deleteCliConfig, o as redactCliEnvironment, p as acquireCliCredentialsLock, r as emptyCliConfig, s as removeCliEnvironment, u as upsertCliEnvironment, v as deleteCliCredentialsLock, w as saveSignupCredentials, y as detectPrimitiveKeyEnvMisname } from "../cli-config-Ms_0vNjq.js";
|
|
5
5
|
import { C as resolveListenSubscription, S as normalizeListenOrigin, _ as acquireListenLock, a as mailLockBusy, c as mailTime, d as readMailJson, f as removeMailFile, g as ListenStateError, h as writeMailJson, i as mailId, l as privateMailDirectory, m as withMailLock, o as mailObject, u as privateMailPermissions, y as listenIdentity } from "../shared-mail-files-BAQSGxxz.js";
|
|
6
|
-
import { $ as saveConnectionName, A as ContactPolicyReadRetryError, B as AddressNotesApiError, C as RECEIVER_MODES, Ct as upsertManagedBlock, D as registrationSummary, Dt as refreshOwnerMemberAddressPeriodically, E as failedSessionRegistration, Et as addSessionReceiver, F as canonicalContactSelector, G as contactAgentAddress, H as runAddressNotesRequest, I as AgentDisconnectError, J as agentInvitationHash, K as runContactRequest, L as claimOverRevokedSetup, M as NetworkAdmissionPendingError, N as createNotificationContactPolicy, O as registrationSummaryLine, Ot as withOwnerMemberAddress, P as evaluateContactPolicy, Q as refusalAfterReplacement, R as clearRevokedAddresses, S as runAgentConnect, St as readManagedFile, T as verificationReplySubmitted, Tt as readHookLauncherWarning, U as ContactsApiError, V as addressNoteTarget, W as contactAddress, X as readAgentInvitation, Y as connectAgent, Z as receiverStatusCommand, _ as enrollmentResumes, _t as samePath, a as endSession, at as boundSessionProfiles, b as invitationProfileName, bt as inspectManagedBlock, c as pendingSessionDisconnects, ct as describeSessionHookChange, d as registerSession, dt as ephemeralCliReason, et as savedReceiver, f as retryPendingDisconnects, ft as findOnPath, g as enrollAgent, gt as repairClaudeHooks, h as staleSessionAgents, ht as readClaudeSettings, i as connectedProfilesForSession, it as recordHookMailCheck, j as NETWORK_ADMISSION_PENDING_RETRY_MS, k as waitForRegistrations, l as psProcessInfo, lt as describeSessionHookItem, m as runDetached, mt as inspectClaudeHooks, n as OMP_MAIN, nt as releaseRegistrationsForProfile, o as headlessClaudeRun, ot as claudeConfigDir, p as revokeStaleSessionAgents, pt as hasMachineSessionHooks, q as agentConnectionStatus, r as agentConnectionState, rt as installClaudeWakeHook, st as currentCliLocation, t as HOOK_END_GRACE_MS, tt as MACHINE_RUNTIMES, u as readClaudeHookInput, ut as ensureHookLauncher, v as connectWarnings, vt as writeClaudeSettings, w as externalReceivingState, wt as writeManagedFile, x as pollCheckCommand, xt as jsonIndentation, y as defaultAgentProfileName, yt as MachineFileError, z as disconnectAgent } from "../machine-session-
|
|
7
|
-
import { a as readBeforeDeadline, c as readPresenceProjection, i as readApiBeforeDeadline, n as isPlainChatReply, o as scopedChatSenderTrust, r as isScopedChatReply, s as presenceDisposition, t as isConnectedChatCredential } from "../scoped-chat-
|
|
6
|
+
import { $ as saveConnectionName, A as ContactPolicyReadRetryError, B as AddressNotesApiError, C as RECEIVER_MODES, Ct as upsertManagedBlock, D as registrationSummary, Dt as refreshOwnerMemberAddressPeriodically, E as failedSessionRegistration, Et as addSessionReceiver, F as canonicalContactSelector, G as contactAgentAddress, H as runAddressNotesRequest, I as AgentDisconnectError, J as agentInvitationHash, K as runContactRequest, L as claimOverRevokedSetup, M as NetworkAdmissionPendingError, N as createNotificationContactPolicy, O as registrationSummaryLine, Ot as withOwnerMemberAddress, P as evaluateContactPolicy, Q as refusalAfterReplacement, R as clearRevokedAddresses, S as runAgentConnect, St as readManagedFile, T as verificationReplySubmitted, Tt as readHookLauncherWarning, U as ContactsApiError, V as addressNoteTarget, W as contactAddress, X as readAgentInvitation, Y as connectAgent, Z as receiverStatusCommand, _ as enrollmentResumes, _t as samePath, a as endSession, at as boundSessionProfiles, b as invitationProfileName, bt as inspectManagedBlock, c as pendingSessionDisconnects, ct as describeSessionHookChange, d as registerSession, dt as ephemeralCliReason, et as savedReceiver, f as retryPendingDisconnects, ft as findOnPath, g as enrollAgent, gt as repairClaudeHooks, h as staleSessionAgents, ht as readClaudeSettings, i as connectedProfilesForSession, it as recordHookMailCheck, j as NETWORK_ADMISSION_PENDING_RETRY_MS, k as waitForRegistrations, l as psProcessInfo, lt as describeSessionHookItem, m as runDetached, mt as inspectClaudeHooks, n as OMP_MAIN, nt as releaseRegistrationsForProfile, o as headlessClaudeRun, ot as claudeConfigDir, p as revokeStaleSessionAgents, pt as hasMachineSessionHooks, q as agentConnectionStatus, r as agentConnectionState, rt as installClaudeWakeHook, st as currentCliLocation, t as HOOK_END_GRACE_MS, tt as MACHINE_RUNTIMES, u as readClaudeHookInput, ut as ensureHookLauncher, v as connectWarnings, vt as writeClaudeSettings, w as externalReceivingState, wt as writeManagedFile, x as pollCheckCommand, xt as jsonIndentation, y as defaultAgentProfileName, yt as MachineFileError, z as disconnectAgent } from "../machine-session-Cre9Mt_2.js";
|
|
7
|
+
import { a as readBeforeDeadline, c as readPresenceProjection, i as readApiBeforeDeadline, n as isPlainChatReply, o as scopedChatSenderTrust, r as isScopedChatReply, s as presenceDisposition, t as isConnectedChatCredential } from "../scoped-chat-BpUAgX4g.js";
|
|
8
8
|
import { autoSignalEligible, dispatchAutoRead, dispatchAutoWorking, haltAutoWorking, isSentSignal, readWorkingLease, restoreAutoWorking } from "./auto-signals.js";
|
|
9
|
-
import { a as ensureSharedMailSubscription, c as isConnectedAgentKey, d as reserveSharedMailSubscription, f as followEmailConversation, g as EventReceiverError, h as EventConnection, i as sharedMailScope, l as createSharedMailWaiter, m as otherParticipants, n as reconcileChatSend, p as readConversationFollow, r as openSharedMailReceiver, s as AGENT_CONNECTION_REQUIRED_MESSAGE, t as sendSignal, u as openSharedMailStore } from "../signal-command-
|
|
9
|
+
import { a as ensureSharedMailSubscription, c as isConnectedAgentKey, d as reserveSharedMailSubscription, f as followEmailConversation, g as EventReceiverError, h as EventConnection, i as sharedMailScope, l as createSharedMailWaiter, m as otherParticipants, n as reconcileChatSend, p as readConversationFollow, r as openSharedMailReceiver, s as AGENT_CONNECTION_REQUIRED_MESSAGE, t as sendSignal, u as openSharedMailStore } from "../signal-command-B66YR0-A.js";
|
|
10
10
|
import { a as thrownErrorBody, i as runStreamingJson, n as guardJsonOutputCommands, r as jsonOutputRequested, t as JSON_OUTPUT_FLAG } from "../json-output-ch756TXV.js";
|
|
11
11
|
import { a as backgroundListenStatus, c as runBackgroundListen, d as stopBackgroundListen, f as verifyBackgroundListenTarget, o as backgroundListenToken, r as backgroundListenConfiguration, u as startBackgroundListen } from "../listen-background-DyBYca28.js";
|
|
12
12
|
import { ORG_SELECTION_ENV } from "./global-org-flag.js";
|
|
@@ -219,6 +219,11 @@ const openapiDocument = {
|
|
|
219
219
|
"description": "Rules a member writes in plain English to pick out received mail. The organization needs the email rules feature, and the caller must be a member (their own session, or an OAuth or CLI token that is not narrowed) with mail:read.",
|
|
220
220
|
"x-openapi-spec": "https://api.primitive.dev/v1/openapi/tags/email-rules"
|
|
221
221
|
},
|
|
222
|
+
{
|
|
223
|
+
"name": "Email Rule Oversight",
|
|
224
|
+
"description": "The email rules that reach your own mailboxes, whoever wrote them, read-only. The organization needs the email rules feature, and the caller must be a member with mail:read on their own dashboard session or the Primitive CLI, not narrowed.",
|
|
225
|
+
"x-openapi-spec": "https://api.primitive.dev/v1/openapi/tags/email-rule-oversight"
|
|
226
|
+
},
|
|
222
227
|
{
|
|
223
228
|
"name": "Changes",
|
|
224
229
|
"description": "One replayable long-poll of what changed (ids and kinds) across mail, sent mail, read state, the agent directory and access, so a client can keep its snapshots current without polling every list.",
|
|
@@ -1495,7 +1500,7 @@ const openapiDocument = {
|
|
|
1495
1500
|
},
|
|
1496
1501
|
"security": [{ "BearerAuth": [] }],
|
|
1497
1502
|
"x-primitive-permission": ["account:manage"],
|
|
1498
|
-
"description": "Update the
|
|
1503
|
+
"description": "Update the organization's spam threshold (spam_threshold) and whether an email's content is discarded once a webhook confirms receipt (discard_content_on_webhook_confirmed), the opt-in POST /emails/{id}/discard-content needs."
|
|
1499
1504
|
}
|
|
1500
1505
|
},
|
|
1501
1506
|
"/account/storage": { "get": {
|
|
@@ -21978,7 +21983,7 @@ const openapiDocument = {
|
|
|
21978
21983
|
"/email-rules/compile": { "post": {
|
|
21979
21984
|
"operationId": "compileEmailRule",
|
|
21980
21985
|
"summary": "Compile a rule description",
|
|
21981
|
-
"description": "Turns a plain-English description of which received emails to match into a rule tree over the published column contract, with a plain-English explanation of what it matches, the assumptions made, and warnings for anything the columns cannot express. Where the columns fall short the rule may carry up to five yes/no questions, asked about an email only after its conditions match. Nothing is saved. A rule with no questions has its conditions counted, read only, over the caller's recent classified mail (what a test of it covers by default): breadth is that count, and a warning says when it matches nearly all of it. The SQL the rule renders to is returned only when include_sql is true. kind do_not_share compiles a do-not-share rule for recall: conditions only as narrow as the description says, the judgement of what it describes put into questions, and with nothing a column decides for certain, conditions that hold for every email. Needs mail:read, a member's own credential with their full access (not an API key, agent key or narrowed token), and the email rules feature.",
|
|
21986
|
+
"description": "Turns a plain-English description of which received emails to match into a rule tree over the published column contract, with a plain-English explanation of what it matches, the assumptions made, and warnings for anything the columns cannot express. Where the columns fall short the rule may carry up to five yes/no questions, asked about an email only after its conditions match; they read its subject, its new text and its attachments' file names, never what is inside an attachment, and warnings say when a question mentions attachments. Nothing is saved. A rule with no questions has its conditions counted, read only, over the caller's recent classified mail (what a test of it covers by default): breadth is that count, and a warning says when it matches nearly all of it. The SQL the rule renders to is returned only when include_sql is true. kind do_not_share compiles a do-not-share rule for recall: conditions only as narrow as the description says, the judgement of what it describes put into questions, and with nothing a column decides for certain, conditions that hold for every email. Needs mail:read, a member's own credential with their full access (not an API key, agent key or narrowed token), and the email rules feature.",
|
|
21982
21987
|
"tags": ["Email Rules"],
|
|
21983
21988
|
"security": [{ "BearerAuth": [] }],
|
|
21984
21989
|
"requestBody": {
|
|
@@ -22180,8 +22185,8 @@ const openapiDocument = {
|
|
|
22180
22185
|
} },
|
|
22181
22186
|
"/email-rules/look-alikes": { "post": {
|
|
22182
22187
|
"operationId": "generateLookAlikes",
|
|
22183
|
-
"summary": "Write look-alike emails a rule should not match",
|
|
22184
|
-
"description": "Writes made-up emails that come close to what a grant rule describes
|
|
22188
|
+
"summary": "Write look-alike emails a rule should or should not match",
|
|
22189
|
+
"description": "Writes made-up emails that come close to what a grant rule describes, and reports what the rule decides for each, as test-sample would. Most should not match (expected no_match): business near misses from its senders and topic (kind other: an all-clear, a reply with nothing new, a related document, another subject) and private mail (a personal medical bill, pay for named people, a personal purchase, personal banking or tax). By default a third, rounded down, are near cases it should match (expected match, kind other). failed means the rule decided one against expected. Nothing is stored and no mail is read. Keep them, with their expected, with add_expectation_samples, or for a request with the accept's expectation_samples. Limited to 20 an hour per member. Needs mail:read, a member's own credential with their full access (not an API key, agent key or narrowed token), and the email rules feature.",
|
|
22185
22190
|
"tags": ["Email Rules"],
|
|
22186
22191
|
"security": [{ "BearerAuth": [] }],
|
|
22187
22192
|
"requestBody": {
|
|
@@ -22190,7 +22195,7 @@ const openapiDocument = {
|
|
|
22190
22195
|
},
|
|
22191
22196
|
"responses": {
|
|
22192
22197
|
"200": {
|
|
22193
|
-
"description": "Write look-alike emails a rule should not match",
|
|
22198
|
+
"description": "Write look-alike emails a rule should or should not match",
|
|
22194
22199
|
"content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SuccessEnvelope" }, {
|
|
22195
22200
|
"type": "object",
|
|
22196
22201
|
"required": ["data"],
|
|
@@ -22673,7 +22678,7 @@ const openapiDocument = {
|
|
|
22673
22678
|
}
|
|
22674
22679
|
},
|
|
22675
22680
|
"403": {
|
|
22676
|
-
"description": "feature_not_enabled: the email rules feature is not enabled for this organization yet. Permission refusals answer forbidden or grant_forbidden instead.",
|
|
22681
|
+
"description": "feature_not_enabled: the email rules feature is not enabled for this organization yet. Permission refusals answer forbidden or grant_forbidden instead. forbidden with details.reason covering_view_only (your dashboard session or the Primitive CLI only): you may read this rule only because it covers your mailbox; details.covering_view is where (getEmailRuleCoveringMe).",
|
|
22677
22682
|
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
22678
22683
|
},
|
|
22679
22684
|
"404": {
|
|
@@ -22782,7 +22787,7 @@ const openapiDocument = {
|
|
|
22782
22787
|
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
22783
22788
|
},
|
|
22784
22789
|
"409": {
|
|
22785
|
-
"description": "email_rule_conflict: the rule changed (details.reason version_moved with current_version, revision_moved with current_revision, expectations_moved or rule_changed); read it again and retry. email_rule_scope_locked: the rule is shared. email_rule_author_unresolvable: the rule could not run as you over the chosen scope. expectations_failed or expectations_undecided
|
|
22790
|
+
"description": "email_rule_conflict: the rule changed (details.reason version_moved with current_version, revision_moved with current_revision, expectations_moved or rule_changed); read it again and retry. email_rule_scope_locked: the rule is shared. email_rule_author_unresolvable: the rule could not run as you over the chosen scope. expectations_failed, expectations_unreadable (details.unreadable) or expectations_undecided, with if_expectations_pass: nothing was saved; details carries current_version, state and expectations_check.",
|
|
22786
22791
|
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
22787
22792
|
},
|
|
22788
22793
|
"429": {
|
|
@@ -23052,7 +23057,7 @@ const openapiDocument = {
|
|
|
23052
23057
|
"/emails/{id}/rule-results": { "get": {
|
|
23053
23058
|
"operationId": "listEmailRuleResults",
|
|
23054
23059
|
"summary": "List every rule's result on an email",
|
|
23055
|
-
"description": "
|
|
23060
|
+
"description": "What each rule you can see decided about this email (matched, not matched, or not run), in the words of the deciding version. A do_not_share rule that matched it blocks sharing while active; earlier shares stay. Only a caller who can read the email gets an answer. classification is every fact the classifier read, as rule conditions read it. At most 50 rules are listed, results first; not_listed counts the rest. Another member's rule that decided on your own mail is listed read_only (dashboard and CLI only); hidden counts deciding rules you cannot see. Needs mail:read, a member's own credential with their full access (not an API key, agent key or narrowed token), and the email rules feature.",
|
|
23056
23061
|
"tags": ["Email Rules"],
|
|
23057
23062
|
"security": [{ "BearerAuth": [] }],
|
|
23058
23063
|
"parameters": [{
|
|
@@ -24615,7 +24620,7 @@ const openapiDocument = {
|
|
|
24615
24620
|
"delete": {
|
|
24616
24621
|
"operationId": "endEmailRuleShare",
|
|
24617
24622
|
"summary": "End a rule share",
|
|
24618
|
-
"description": "Stops sharing. Either person on the share can do this, or an owner or admin who manages members. The share is kept, marked as ended. This needs no mail access and does not depend on the email rules feature. An owner or admin not on the share must use a dashboard session. Otherwise use your own session, or an OAuth or CLI token that acts with your full access: API keys and agent keys are refused.",
|
|
24623
|
+
"description": "Stops sharing; the rule itself is left unchanged, as the answer's note says. Either person on the share can do this, or an owner or admin who manages members. The share is kept, marked as ended. This needs no mail access and does not depend on the email rules feature. An owner or admin not on the share must use a dashboard session. Otherwise use your own session, or an OAuth or CLI token that acts with your full access: API keys and agent keys are refused.",
|
|
24619
24624
|
"tags": ["Email Rules"],
|
|
24620
24625
|
"security": [{ "BearerAuth": [] }],
|
|
24621
24626
|
"parameters": [{
|
|
@@ -24823,136 +24828,43 @@ const openapiDocument = {
|
|
|
24823
24828
|
},
|
|
24824
24829
|
"x-primitive-permission": ["mail:read"]
|
|
24825
24830
|
} },
|
|
24826
|
-
"/
|
|
24827
|
-
"operationId": "
|
|
24828
|
-
"summary": "
|
|
24829
|
-
"description": "
|
|
24830
|
-
"tags": ["
|
|
24831
|
+
"/email-rules/covering-me": { "get": {
|
|
24832
|
+
"operationId": "listEmailRulesCoveringMe",
|
|
24833
|
+
"summary": "List the rules over your mail",
|
|
24834
|
+
"description": "Every email rule that covers one of your own mailboxes now, yours included, newest first, in any state. A rule covers you when the scope it runs with now reaches one of your own mailboxes (your member mailbox, or a personal agent's address): one whose author reads all your mail (author scope, for an author who reads the organization's mail or holds an access entry for your mailbox), or one that names your mailbox or its domain (selected). Another member's own_mailboxes rule never covers you. You see its name, wording, current tree, state, kind and author, and which of your own mailboxes it reaches. Its wording and tree are shown as written, so they can name other addresses (a condition on who an email is from or to). You do not see the other inboxes and domains its scope names, its saved expectations, or the keys, shares and webhooks that use it. A page can hold fewer rules than limit, or none, and still carry a cursor (one request reads a bounded number of rules): keep reading until meta.cursor is null. Needs mail:read, a member's own credential with their full access (not an API key, agent key or narrowed token), and the email rules feature. Only on your own dashboard session or the Primitive CLI.",
|
|
24835
|
+
"tags": ["Email Rule Oversight"],
|
|
24831
24836
|
"security": [{ "BearerAuth": [] }],
|
|
24832
24837
|
"parameters": [{
|
|
24833
|
-
"name": "
|
|
24834
|
-
"in": "
|
|
24835
|
-
"required":
|
|
24836
|
-
"description": "
|
|
24838
|
+
"name": "limit",
|
|
24839
|
+
"in": "query",
|
|
24840
|
+
"required": false,
|
|
24841
|
+
"description": "Rules per page, from 1 to 100; defaults to 50.",
|
|
24837
24842
|
"schema": {
|
|
24838
|
-
"
|
|
24839
|
-
"
|
|
24840
|
-
|
|
24841
|
-
|
|
24842
|
-
"responses": {
|
|
24843
|
-
"200": {
|
|
24844
|
-
"description": "Get a domain's Agent Authorization status",
|
|
24845
|
-
"content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SuccessEnvelope" }, {
|
|
24846
|
-
"type": "object",
|
|
24847
|
-
"required": ["data"],
|
|
24848
|
-
"properties": { "data": { "$ref": "#/components/schemas/GetDomainAgentAuthorizationResult" } }
|
|
24849
|
-
}] } } },
|
|
24850
|
-
"headers": {
|
|
24851
|
-
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit" },
|
|
24852
|
-
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining" },
|
|
24853
|
-
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset" },
|
|
24854
|
-
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy" }
|
|
24855
|
-
}
|
|
24856
|
-
},
|
|
24857
|
-
"400": {
|
|
24858
|
-
"description": "validation_error: the id is not a domain id.",
|
|
24859
|
-
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
24860
|
-
},
|
|
24861
|
-
"401": {
|
|
24862
|
-
"description": "Invalid or missing API key",
|
|
24863
|
-
"content": { "application/json": {
|
|
24864
|
-
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
24865
|
-
"example": {
|
|
24866
|
-
"success": false,
|
|
24867
|
-
"error": {
|
|
24868
|
-
"code": "unauthorized",
|
|
24869
|
-
"message": "Invalid or missing API key"
|
|
24870
|
-
}
|
|
24871
|
-
}
|
|
24872
|
-
} },
|
|
24873
|
-
"headers": {
|
|
24874
|
-
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit-unauthenticated" },
|
|
24875
|
-
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining-unauthenticated" },
|
|
24876
|
-
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset-unauthenticated" },
|
|
24877
|
-
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy-unauthenticated" }
|
|
24878
|
-
}
|
|
24879
|
-
},
|
|
24880
|
-
"403": {
|
|
24881
|
-
"description": "Authenticated caller lacks permission for the operation",
|
|
24882
|
-
"content": { "application/json": {
|
|
24883
|
-
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
24884
|
-
"example": {
|
|
24885
|
-
"success": false,
|
|
24886
|
-
"error": {
|
|
24887
|
-
"code": "forbidden",
|
|
24888
|
-
"message": "Insufficient permissions"
|
|
24889
|
-
}
|
|
24890
|
-
}
|
|
24891
|
-
} }
|
|
24892
|
-
},
|
|
24893
|
-
"404": {
|
|
24894
|
-
"description": "Resource not found",
|
|
24895
|
-
"content": { "application/json": {
|
|
24896
|
-
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
24897
|
-
"example": {
|
|
24898
|
-
"success": false,
|
|
24899
|
-
"error": {
|
|
24900
|
-
"code": "not_found",
|
|
24901
|
-
"message": "Resource not found"
|
|
24902
|
-
}
|
|
24903
|
-
}
|
|
24904
|
-
} }
|
|
24905
|
-
},
|
|
24906
|
-
"429": {
|
|
24907
|
-
"description": "Rate limit exceeded. The `ratelimit-*` headers describe the limiter that rejected this request, with its own limit and window, not the API budget that successful responses report. A limiter that reports only a wait sends `Retry-After` alone.",
|
|
24908
|
-
"headers": {
|
|
24909
|
-
"Retry-After": {
|
|
24910
|
-
"schema": { "type": "integer" },
|
|
24911
|
-
"description": "Seconds to wait before retrying"
|
|
24912
|
-
},
|
|
24913
|
-
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit-429" },
|
|
24914
|
-
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining-429" },
|
|
24915
|
-
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset" },
|
|
24916
|
-
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy-429" }
|
|
24917
|
-
},
|
|
24918
|
-
"content": { "application/json": {
|
|
24919
|
-
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
24920
|
-
"example": {
|
|
24921
|
-
"success": false,
|
|
24922
|
-
"error": {
|
|
24923
|
-
"code": "rate_limit_exceeded",
|
|
24924
|
-
"message": "Rate limit exceeded"
|
|
24925
|
-
}
|
|
24926
|
-
}
|
|
24927
|
-
} }
|
|
24843
|
+
"default": 50,
|
|
24844
|
+
"type": "integer",
|
|
24845
|
+
"minimum": 1,
|
|
24846
|
+
"maximum": 100
|
|
24928
24847
|
}
|
|
24929
|
-
},
|
|
24930
|
-
|
|
24931
|
-
|
|
24932
|
-
|
|
24933
|
-
|
|
24934
|
-
"summary": "Check a vanity inbox name",
|
|
24935
|
-
"description": "Whether a name can be claimed for the managed inbox (name.primitive.email): available, taken, reserved (a protected word) or invalid (5 to 30 lowercase letters and digits, starting with a letter). Any plan may check; claiming needs Power. Rate limited per organization together with claims. Needs domains:read.",
|
|
24936
|
-
"tags": ["Domains"],
|
|
24937
|
-
"security": [{ "BearerAuth": [] }],
|
|
24938
|
-
"parameters": [{
|
|
24939
|
-
"name": "name",
|
|
24940
|
-
"in": "path",
|
|
24941
|
-
"required": true,
|
|
24942
|
-
"description": "The name to check, without the domain.",
|
|
24848
|
+
}, {
|
|
24849
|
+
"name": "cursor",
|
|
24850
|
+
"in": "query",
|
|
24851
|
+
"required": false,
|
|
24852
|
+
"description": "meta.cursor from the preceding page. Omit for the first page.",
|
|
24943
24853
|
"schema": {
|
|
24944
24854
|
"type": "string",
|
|
24945
|
-
"
|
|
24946
|
-
"maxLength": 64
|
|
24855
|
+
"maxLength": 200
|
|
24947
24856
|
}
|
|
24948
24857
|
}],
|
|
24949
24858
|
"responses": {
|
|
24950
24859
|
"200": {
|
|
24951
|
-
"description": "
|
|
24860
|
+
"description": "List the rules over your mail",
|
|
24952
24861
|
"content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SuccessEnvelope" }, {
|
|
24953
24862
|
"type": "object",
|
|
24954
|
-
"required": ["data"],
|
|
24955
|
-
"properties": {
|
|
24863
|
+
"required": ["data", "meta"],
|
|
24864
|
+
"properties": {
|
|
24865
|
+
"data": { "$ref": "#/components/schemas/ListEmailRulesCoveringMeResult" },
|
|
24866
|
+
"meta": { "$ref": "#/components/schemas/CursorPageMeta" }
|
|
24867
|
+
}
|
|
24956
24868
|
}] } } },
|
|
24957
24869
|
"headers": {
|
|
24958
24870
|
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit" },
|
|
@@ -24962,7 +24874,7 @@ const openapiDocument = {
|
|
|
24962
24874
|
}
|
|
24963
24875
|
},
|
|
24964
24876
|
"400": {
|
|
24965
|
-
"description": "
|
|
24877
|
+
"description": "invalid_cursor: a cursor this list did not give you (each is sealed to you and your organization); pass meta.cursor unchanged.",
|
|
24966
24878
|
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
24967
24879
|
},
|
|
24968
24880
|
"401": {
|
|
@@ -24985,127 +24897,528 @@ const openapiDocument = {
|
|
|
24985
24897
|
}
|
|
24986
24898
|
},
|
|
24987
24899
|
"403": {
|
|
24988
|
-
"description": "
|
|
24989
|
-
"content": { "application/json": {
|
|
24990
|
-
|
|
24991
|
-
|
|
24992
|
-
|
|
24993
|
-
|
|
24994
|
-
|
|
24995
|
-
|
|
24996
|
-
|
|
24997
|
-
}
|
|
24998
|
-
|
|
24999
|
-
|
|
25000
|
-
|
|
25001
|
-
|
|
25002
|
-
|
|
25003
|
-
|
|
25004
|
-
"
|
|
25005
|
-
|
|
25006
|
-
"
|
|
25007
|
-
|
|
25008
|
-
"
|
|
25009
|
-
|
|
25010
|
-
|
|
25011
|
-
|
|
25012
|
-
|
|
25013
|
-
|
|
25014
|
-
|
|
25015
|
-
|
|
25016
|
-
|
|
25017
|
-
|
|
25018
|
-
|
|
25019
|
-
|
|
25020
|
-
|
|
25021
|
-
|
|
25022
|
-
|
|
25023
|
-
|
|
25024
|
-
|
|
25025
|
-
|
|
25026
|
-
|
|
25027
|
-
|
|
25028
|
-
|
|
25029
|
-
|
|
25030
|
-
|
|
25031
|
-
|
|
25032
|
-
|
|
25033
|
-
|
|
25034
|
-
|
|
25035
|
-
|
|
25036
|
-
|
|
25037
|
-
|
|
25038
|
-
|
|
25039
|
-
|
|
25040
|
-
|
|
25041
|
-
|
|
25042
|
-
|
|
25043
|
-
|
|
25044
|
-
|
|
25045
|
-
|
|
25046
|
-
|
|
25047
|
-
|
|
25048
|
-
|
|
25049
|
-
|
|
25050
|
-
|
|
25051
|
-
|
|
25052
|
-
|
|
25053
|
-
|
|
25054
|
-
|
|
25055
|
-
|
|
25056
|
-
|
|
25057
|
-
|
|
25058
|
-
|
|
25059
|
-
|
|
25060
|
-
"
|
|
25061
|
-
"
|
|
25062
|
-
"
|
|
25063
|
-
|
|
25064
|
-
|
|
25065
|
-
|
|
25066
|
-
|
|
25067
|
-
|
|
25068
|
-
|
|
25069
|
-
} }
|
|
25070
|
-
},
|
|
25071
|
-
"
|
|
25072
|
-
"description": "
|
|
25073
|
-
"content": { "application/json": {
|
|
25074
|
-
|
|
25075
|
-
|
|
25076
|
-
|
|
25077
|
-
|
|
25078
|
-
|
|
25079
|
-
|
|
25080
|
-
|
|
25081
|
-
}
|
|
25082
|
-
|
|
25083
|
-
|
|
25084
|
-
"ratelimit-
|
|
25085
|
-
"ratelimit-
|
|
25086
|
-
|
|
25087
|
-
|
|
25088
|
-
|
|
25089
|
-
|
|
25090
|
-
|
|
25091
|
-
|
|
25092
|
-
|
|
25093
|
-
|
|
25094
|
-
|
|
25095
|
-
|
|
25096
|
-
|
|
25097
|
-
|
|
25098
|
-
|
|
25099
|
-
|
|
25100
|
-
|
|
25101
|
-
|
|
25102
|
-
|
|
25103
|
-
|
|
25104
|
-
|
|
25105
|
-
|
|
25106
|
-
|
|
25107
|
-
|
|
25108
|
-
|
|
24900
|
+
"description": "feature_not_enabled: the email rules feature is not enabled for this organization yet. Permission refusals answer forbidden or grant_forbidden instead; details.reason first_party_required means this credential is not your dashboard session or the Primitive CLI.",
|
|
24901
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
24902
|
+
},
|
|
24903
|
+
"429": {
|
|
24904
|
+
"description": "Rate limit exceeded. The `ratelimit-*` headers describe the limiter that rejected this request, with its own limit and window, not the API budget that successful responses report. A limiter that reports only a wait sends `Retry-After` alone.",
|
|
24905
|
+
"headers": {
|
|
24906
|
+
"Retry-After": {
|
|
24907
|
+
"schema": { "type": "integer" },
|
|
24908
|
+
"description": "Seconds to wait before retrying"
|
|
24909
|
+
},
|
|
24910
|
+
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit-429" },
|
|
24911
|
+
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining-429" },
|
|
24912
|
+
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset" },
|
|
24913
|
+
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy-429" }
|
|
24914
|
+
},
|
|
24915
|
+
"content": { "application/json": {
|
|
24916
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
24917
|
+
"example": {
|
|
24918
|
+
"success": false,
|
|
24919
|
+
"error": {
|
|
24920
|
+
"code": "rate_limit_exceeded",
|
|
24921
|
+
"message": "Rate limit exceeded"
|
|
24922
|
+
}
|
|
24923
|
+
}
|
|
24924
|
+
} }
|
|
24925
|
+
}
|
|
24926
|
+
},
|
|
24927
|
+
"x-primitive-permission": ["mail:read"]
|
|
24928
|
+
} },
|
|
24929
|
+
"/email-rules/covering-me/{id}": { "get": {
|
|
24930
|
+
"operationId": "getEmailRuleCoveringMe",
|
|
24931
|
+
"summary": "Get a rule over your mail",
|
|
24932
|
+
"description": "One rule that covers one of your own mailboxes, read-only, with its current version; or one that no longer does but decided on mail at your own mailbox (covers_now false), shown as the version that last decided on your mail, without its current name. You see its name, wording, current tree, state, kind and author, and which of your own mailboxes it reaches. Its wording and tree are shown as written, so they can name other addresses (a condition on who an email is from or to). You do not see the other inboxes and domains its scope names, its saved expectations, or the keys, shares and webhooks that use it. Needs mail:read, a member's own credential with their full access (not an API key, agent key or narrowed token), and the email rules feature. Only on your own dashboard session or the Primitive CLI.",
|
|
24933
|
+
"tags": ["Email Rule Oversight"],
|
|
24934
|
+
"security": [{ "BearerAuth": [] }],
|
|
24935
|
+
"parameters": [{
|
|
24936
|
+
"name": "id",
|
|
24937
|
+
"in": "path",
|
|
24938
|
+
"required": true,
|
|
24939
|
+
"description": "The rule id.",
|
|
24940
|
+
"schema": {
|
|
24941
|
+
"type": "string",
|
|
24942
|
+
"format": "uuid"
|
|
24943
|
+
}
|
|
24944
|
+
}],
|
|
24945
|
+
"responses": {
|
|
24946
|
+
"200": {
|
|
24947
|
+
"description": "Get a rule over your mail",
|
|
24948
|
+
"content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SuccessEnvelope" }, {
|
|
24949
|
+
"type": "object",
|
|
24950
|
+
"required": ["data"],
|
|
24951
|
+
"properties": { "data": { "$ref": "#/components/schemas/GetEmailRuleCoveringMeResult" } }
|
|
24952
|
+
}] } } },
|
|
24953
|
+
"headers": {
|
|
24954
|
+
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit" },
|
|
24955
|
+
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining" },
|
|
24956
|
+
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset" },
|
|
24957
|
+
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy" }
|
|
24958
|
+
}
|
|
24959
|
+
},
|
|
24960
|
+
"401": {
|
|
24961
|
+
"description": "Invalid or missing API key",
|
|
24962
|
+
"content": { "application/json": {
|
|
24963
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
24964
|
+
"example": {
|
|
24965
|
+
"success": false,
|
|
24966
|
+
"error": {
|
|
24967
|
+
"code": "unauthorized",
|
|
24968
|
+
"message": "Invalid or missing API key"
|
|
24969
|
+
}
|
|
24970
|
+
}
|
|
24971
|
+
} },
|
|
24972
|
+
"headers": {
|
|
24973
|
+
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit-unauthenticated" },
|
|
24974
|
+
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining-unauthenticated" },
|
|
24975
|
+
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset-unauthenticated" },
|
|
24976
|
+
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy-unauthenticated" }
|
|
24977
|
+
}
|
|
24978
|
+
},
|
|
24979
|
+
"403": {
|
|
24980
|
+
"description": "feature_not_enabled: the email rules feature is not enabled for this organization yet. Permission refusals answer forbidden or grant_forbidden instead; details.reason first_party_required means this credential is not your dashboard session or the Primitive CLI.",
|
|
24981
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
24982
|
+
},
|
|
24983
|
+
"404": {
|
|
24984
|
+
"description": "not_found: no rule with this id covers your mailboxes or decided on your mail.",
|
|
24985
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
24986
|
+
},
|
|
24987
|
+
"429": {
|
|
24988
|
+
"description": "Rate limit exceeded. The `ratelimit-*` headers describe the limiter that rejected this request, with its own limit and window, not the API budget that successful responses report. A limiter that reports only a wait sends `Retry-After` alone.",
|
|
24989
|
+
"headers": {
|
|
24990
|
+
"Retry-After": {
|
|
24991
|
+
"schema": { "type": "integer" },
|
|
24992
|
+
"description": "Seconds to wait before retrying"
|
|
24993
|
+
},
|
|
24994
|
+
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit-429" },
|
|
24995
|
+
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining-429" },
|
|
24996
|
+
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset" },
|
|
24997
|
+
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy-429" }
|
|
24998
|
+
},
|
|
24999
|
+
"content": { "application/json": {
|
|
25000
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
25001
|
+
"example": {
|
|
25002
|
+
"success": false,
|
|
25003
|
+
"error": {
|
|
25004
|
+
"code": "rate_limit_exceeded",
|
|
25005
|
+
"message": "Rate limit exceeded"
|
|
25006
|
+
}
|
|
25007
|
+
}
|
|
25008
|
+
} }
|
|
25009
|
+
}
|
|
25010
|
+
},
|
|
25011
|
+
"x-primitive-permission": ["mail:read"]
|
|
25012
|
+
} },
|
|
25013
|
+
"/email-rules/covering-me/{id}/decisions": { "get": {
|
|
25014
|
+
"operationId": "listEmailRuleDecisionsOnMyMail",
|
|
25015
|
+
"summary": "List what a rule decided about your mail",
|
|
25016
|
+
"description": "What a rule that covers your mailboxes, or decided on your mail, decided about mail at your own mailboxes, newest first: never about anyone else's mail. Each decision is in the words of the version that made it, which can be earlier than the current one: the questions it asked about that email (question_answers) and the columns its conditions read (parts). Needs mail:read, a member's own credential with their full access (not an API key, agent key or narrowed token), and the email rules feature. Only on your own dashboard session or the Primitive CLI.",
|
|
25017
|
+
"tags": ["Email Rule Oversight"],
|
|
25018
|
+
"security": [{ "BearerAuth": [] }],
|
|
25019
|
+
"parameters": [
|
|
25020
|
+
{
|
|
25021
|
+
"name": "id",
|
|
25022
|
+
"in": "path",
|
|
25023
|
+
"required": true,
|
|
25024
|
+
"description": "The rule id.",
|
|
25025
|
+
"schema": {
|
|
25026
|
+
"type": "string",
|
|
25027
|
+
"format": "uuid"
|
|
25028
|
+
}
|
|
25029
|
+
},
|
|
25030
|
+
{
|
|
25031
|
+
"name": "limit",
|
|
25032
|
+
"in": "query",
|
|
25033
|
+
"required": false,
|
|
25034
|
+
"description": "Decisions per page, from 1 to 100; defaults to 50.",
|
|
25035
|
+
"schema": {
|
|
25036
|
+
"default": 50,
|
|
25037
|
+
"type": "integer",
|
|
25038
|
+
"minimum": 1,
|
|
25039
|
+
"maximum": 100
|
|
25040
|
+
}
|
|
25041
|
+
},
|
|
25042
|
+
{
|
|
25043
|
+
"name": "cursor",
|
|
25044
|
+
"in": "query",
|
|
25045
|
+
"required": false,
|
|
25046
|
+
"description": "meta.cursor from the preceding page. Omit for the first page.",
|
|
25047
|
+
"schema": {
|
|
25048
|
+
"type": "string",
|
|
25049
|
+
"maxLength": 200
|
|
25050
|
+
}
|
|
25051
|
+
},
|
|
25052
|
+
{
|
|
25053
|
+
"name": "matched",
|
|
25054
|
+
"in": "query",
|
|
25055
|
+
"required": false,
|
|
25056
|
+
"description": "true for matches only, false for the rest.",
|
|
25057
|
+
"schema": {
|
|
25058
|
+
"description": "Only decisions that matched (true) or did not (false).",
|
|
25059
|
+
"type": "string",
|
|
25060
|
+
"enum": ["true", "false"]
|
|
25061
|
+
}
|
|
25062
|
+
}
|
|
25063
|
+
],
|
|
25064
|
+
"responses": {
|
|
25065
|
+
"200": {
|
|
25066
|
+
"description": "List what a rule decided about your mail",
|
|
25067
|
+
"content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SuccessEnvelope" }, {
|
|
25068
|
+
"type": "object",
|
|
25069
|
+
"required": ["data", "meta"],
|
|
25070
|
+
"properties": {
|
|
25071
|
+
"data": { "$ref": "#/components/schemas/ListEmailRuleDecisionsOnMyMailResult" },
|
|
25072
|
+
"meta": { "$ref": "#/components/schemas/CursorPageMeta" }
|
|
25073
|
+
}
|
|
25074
|
+
}] } } },
|
|
25075
|
+
"headers": {
|
|
25076
|
+
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit" },
|
|
25077
|
+
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining" },
|
|
25078
|
+
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset" },
|
|
25079
|
+
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy" }
|
|
25080
|
+
}
|
|
25081
|
+
},
|
|
25082
|
+
"400": {
|
|
25083
|
+
"description": "validation_error: a cursor not returned in meta.cursor.",
|
|
25084
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
25085
|
+
},
|
|
25086
|
+
"401": {
|
|
25087
|
+
"description": "Invalid or missing API key",
|
|
25088
|
+
"content": { "application/json": {
|
|
25089
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
25090
|
+
"example": {
|
|
25091
|
+
"success": false,
|
|
25092
|
+
"error": {
|
|
25093
|
+
"code": "unauthorized",
|
|
25094
|
+
"message": "Invalid or missing API key"
|
|
25095
|
+
}
|
|
25096
|
+
}
|
|
25097
|
+
} },
|
|
25098
|
+
"headers": {
|
|
25099
|
+
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit-unauthenticated" },
|
|
25100
|
+
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining-unauthenticated" },
|
|
25101
|
+
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset-unauthenticated" },
|
|
25102
|
+
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy-unauthenticated" }
|
|
25103
|
+
}
|
|
25104
|
+
},
|
|
25105
|
+
"403": {
|
|
25106
|
+
"description": "feature_not_enabled: the email rules feature is not enabled for this organization yet. Permission refusals answer forbidden or grant_forbidden instead; details.reason first_party_required means this credential is not your dashboard session or the Primitive CLI. grant_forbidden with details.reason mail_depth: your access to mail shows headers only, and what a rule decided is read from what emails say.",
|
|
25107
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
25108
|
+
},
|
|
25109
|
+
"404": {
|
|
25110
|
+
"description": "not_found: no rule with this id covers your mailboxes or decided on your mail.",
|
|
25111
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
25112
|
+
},
|
|
25113
|
+
"429": {
|
|
25114
|
+
"description": "Rate limit exceeded. The `ratelimit-*` headers describe the limiter that rejected this request, with its own limit and window, not the API budget that successful responses report. A limiter that reports only a wait sends `Retry-After` alone.",
|
|
25115
|
+
"headers": {
|
|
25116
|
+
"Retry-After": {
|
|
25117
|
+
"schema": { "type": "integer" },
|
|
25118
|
+
"description": "Seconds to wait before retrying"
|
|
25119
|
+
},
|
|
25120
|
+
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit-429" },
|
|
25121
|
+
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining-429" },
|
|
25122
|
+
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset" },
|
|
25123
|
+
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy-429" }
|
|
25124
|
+
},
|
|
25125
|
+
"content": { "application/json": {
|
|
25126
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
25127
|
+
"example": {
|
|
25128
|
+
"success": false,
|
|
25129
|
+
"error": {
|
|
25130
|
+
"code": "rate_limit_exceeded",
|
|
25131
|
+
"message": "Rate limit exceeded"
|
|
25132
|
+
}
|
|
25133
|
+
}
|
|
25134
|
+
} }
|
|
25135
|
+
}
|
|
25136
|
+
},
|
|
25137
|
+
"x-primitive-permission": ["mail:read"]
|
|
25138
|
+
} },
|
|
25139
|
+
"/domains/{id}/agent-authorization": { "get": {
|
|
25140
|
+
"operationId": "getDomainAgentAuthorization",
|
|
25141
|
+
"summary": "Get a domain's Agent Authorization status",
|
|
25142
|
+
"description": "Whether the domain publishes an Agent Authorization (`_agents`) TXT record that lets agents on Primitive email it, read from DNS with the same engine the send path uses (an answer may be up to five minutes old): published (a record authorizes them), published_unauthorized (a record exists but does not), not_set_up (no record, the default) or inconclusive (the lookup could not tell; retry). The domain is one of the organization's, verified or pending; a credential confined to some mailboxes sees only the domains its scope covers. Needs domains:read.",
|
|
25143
|
+
"tags": ["Domains"],
|
|
25144
|
+
"security": [{ "BearerAuth": [] }],
|
|
25145
|
+
"parameters": [{
|
|
25146
|
+
"name": "id",
|
|
25147
|
+
"in": "path",
|
|
25148
|
+
"required": true,
|
|
25149
|
+
"description": "The domain id from listDomains.",
|
|
25150
|
+
"schema": {
|
|
25151
|
+
"type": "string",
|
|
25152
|
+
"format": "uuid"
|
|
25153
|
+
}
|
|
25154
|
+
}],
|
|
25155
|
+
"responses": {
|
|
25156
|
+
"200": {
|
|
25157
|
+
"description": "Get a domain's Agent Authorization status",
|
|
25158
|
+
"content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SuccessEnvelope" }, {
|
|
25159
|
+
"type": "object",
|
|
25160
|
+
"required": ["data"],
|
|
25161
|
+
"properties": { "data": { "$ref": "#/components/schemas/GetDomainAgentAuthorizationResult" } }
|
|
25162
|
+
}] } } },
|
|
25163
|
+
"headers": {
|
|
25164
|
+
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit" },
|
|
25165
|
+
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining" },
|
|
25166
|
+
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset" },
|
|
25167
|
+
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy" }
|
|
25168
|
+
}
|
|
25169
|
+
},
|
|
25170
|
+
"400": {
|
|
25171
|
+
"description": "validation_error: the id is not a domain id.",
|
|
25172
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
25173
|
+
},
|
|
25174
|
+
"401": {
|
|
25175
|
+
"description": "Invalid or missing API key",
|
|
25176
|
+
"content": { "application/json": {
|
|
25177
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
25178
|
+
"example": {
|
|
25179
|
+
"success": false,
|
|
25180
|
+
"error": {
|
|
25181
|
+
"code": "unauthorized",
|
|
25182
|
+
"message": "Invalid or missing API key"
|
|
25183
|
+
}
|
|
25184
|
+
}
|
|
25185
|
+
} },
|
|
25186
|
+
"headers": {
|
|
25187
|
+
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit-unauthenticated" },
|
|
25188
|
+
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining-unauthenticated" },
|
|
25189
|
+
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset-unauthenticated" },
|
|
25190
|
+
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy-unauthenticated" }
|
|
25191
|
+
}
|
|
25192
|
+
},
|
|
25193
|
+
"403": {
|
|
25194
|
+
"description": "Authenticated caller lacks permission for the operation",
|
|
25195
|
+
"content": { "application/json": {
|
|
25196
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
25197
|
+
"example": {
|
|
25198
|
+
"success": false,
|
|
25199
|
+
"error": {
|
|
25200
|
+
"code": "forbidden",
|
|
25201
|
+
"message": "Insufficient permissions"
|
|
25202
|
+
}
|
|
25203
|
+
}
|
|
25204
|
+
} }
|
|
25205
|
+
},
|
|
25206
|
+
"404": {
|
|
25207
|
+
"description": "Resource not found",
|
|
25208
|
+
"content": { "application/json": {
|
|
25209
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
25210
|
+
"example": {
|
|
25211
|
+
"success": false,
|
|
25212
|
+
"error": {
|
|
25213
|
+
"code": "not_found",
|
|
25214
|
+
"message": "Resource not found"
|
|
25215
|
+
}
|
|
25216
|
+
}
|
|
25217
|
+
} }
|
|
25218
|
+
},
|
|
25219
|
+
"429": {
|
|
25220
|
+
"description": "Rate limit exceeded. The `ratelimit-*` headers describe the limiter that rejected this request, with its own limit and window, not the API budget that successful responses report. A limiter that reports only a wait sends `Retry-After` alone.",
|
|
25221
|
+
"headers": {
|
|
25222
|
+
"Retry-After": {
|
|
25223
|
+
"schema": { "type": "integer" },
|
|
25224
|
+
"description": "Seconds to wait before retrying"
|
|
25225
|
+
},
|
|
25226
|
+
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit-429" },
|
|
25227
|
+
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining-429" },
|
|
25228
|
+
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset" },
|
|
25229
|
+
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy-429" }
|
|
25230
|
+
},
|
|
25231
|
+
"content": { "application/json": {
|
|
25232
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
25233
|
+
"example": {
|
|
25234
|
+
"success": false,
|
|
25235
|
+
"error": {
|
|
25236
|
+
"code": "rate_limit_exceeded",
|
|
25237
|
+
"message": "Rate limit exceeded"
|
|
25238
|
+
}
|
|
25239
|
+
}
|
|
25240
|
+
} }
|
|
25241
|
+
}
|
|
25242
|
+
},
|
|
25243
|
+
"x-primitive-permission": ["domains:read"]
|
|
25244
|
+
} },
|
|
25245
|
+
"/managed-inbox/vanity/{name}": { "get": {
|
|
25246
|
+
"operationId": "checkVanityInboxName",
|
|
25247
|
+
"summary": "Check a vanity inbox name",
|
|
25248
|
+
"description": "Whether a name can be claimed for the managed inbox (name.primitive.email): available, taken, reserved (a protected word) or invalid (5 to 30 lowercase letters and digits, starting with a letter). Any plan may check; claiming needs Power. Rate limited per organization together with claims. Needs domains:read.",
|
|
25249
|
+
"tags": ["Domains"],
|
|
25250
|
+
"security": [{ "BearerAuth": [] }],
|
|
25251
|
+
"parameters": [{
|
|
25252
|
+
"name": "name",
|
|
25253
|
+
"in": "path",
|
|
25254
|
+
"required": true,
|
|
25255
|
+
"description": "The name to check, without the domain.",
|
|
25256
|
+
"schema": {
|
|
25257
|
+
"type": "string",
|
|
25258
|
+
"minLength": 1,
|
|
25259
|
+
"maxLength": 64
|
|
25260
|
+
}
|
|
25261
|
+
}],
|
|
25262
|
+
"responses": {
|
|
25263
|
+
"200": {
|
|
25264
|
+
"description": "Check a vanity inbox name",
|
|
25265
|
+
"content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SuccessEnvelope" }, {
|
|
25266
|
+
"type": "object",
|
|
25267
|
+
"required": ["data"],
|
|
25268
|
+
"properties": { "data": { "$ref": "#/components/schemas/CheckVanityInboxNameResult" } }
|
|
25269
|
+
}] } } },
|
|
25270
|
+
"headers": {
|
|
25271
|
+
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit" },
|
|
25272
|
+
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining" },
|
|
25273
|
+
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset" },
|
|
25274
|
+
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy" }
|
|
25275
|
+
}
|
|
25276
|
+
},
|
|
25277
|
+
"400": {
|
|
25278
|
+
"description": "validation_error: the name parameter is missing or too long.",
|
|
25279
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
25280
|
+
},
|
|
25281
|
+
"401": {
|
|
25282
|
+
"description": "Invalid or missing API key",
|
|
25283
|
+
"content": { "application/json": {
|
|
25284
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
25285
|
+
"example": {
|
|
25286
|
+
"success": false,
|
|
25287
|
+
"error": {
|
|
25288
|
+
"code": "unauthorized",
|
|
25289
|
+
"message": "Invalid or missing API key"
|
|
25290
|
+
}
|
|
25291
|
+
}
|
|
25292
|
+
} },
|
|
25293
|
+
"headers": {
|
|
25294
|
+
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit-unauthenticated" },
|
|
25295
|
+
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining-unauthenticated" },
|
|
25296
|
+
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset-unauthenticated" },
|
|
25297
|
+
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy-unauthenticated" }
|
|
25298
|
+
}
|
|
25299
|
+
},
|
|
25300
|
+
"403": {
|
|
25301
|
+
"description": "Authenticated caller lacks permission for the operation",
|
|
25302
|
+
"content": { "application/json": {
|
|
25303
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
25304
|
+
"example": {
|
|
25305
|
+
"success": false,
|
|
25306
|
+
"error": {
|
|
25307
|
+
"code": "forbidden",
|
|
25308
|
+
"message": "Insufficient permissions"
|
|
25309
|
+
}
|
|
25310
|
+
}
|
|
25311
|
+
} }
|
|
25312
|
+
},
|
|
25313
|
+
"404": {
|
|
25314
|
+
"description": "Resource not found",
|
|
25315
|
+
"content": { "application/json": {
|
|
25316
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
25317
|
+
"example": {
|
|
25318
|
+
"success": false,
|
|
25319
|
+
"error": {
|
|
25320
|
+
"code": "not_found",
|
|
25321
|
+
"message": "Resource not found"
|
|
25322
|
+
}
|
|
25323
|
+
}
|
|
25324
|
+
} }
|
|
25325
|
+
},
|
|
25326
|
+
"429": {
|
|
25327
|
+
"description": "Rate limit exceeded. The `ratelimit-*` headers describe the limiter that rejected this request, with its own limit and window, not the API budget that successful responses report. A limiter that reports only a wait sends `Retry-After` alone.",
|
|
25328
|
+
"headers": {
|
|
25329
|
+
"Retry-After": {
|
|
25330
|
+
"schema": { "type": "integer" },
|
|
25331
|
+
"description": "Seconds to wait before retrying"
|
|
25332
|
+
},
|
|
25333
|
+
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit-429" },
|
|
25334
|
+
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining-429" },
|
|
25335
|
+
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset" },
|
|
25336
|
+
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy-429" }
|
|
25337
|
+
},
|
|
25338
|
+
"content": { "application/json": {
|
|
25339
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
25340
|
+
"example": {
|
|
25341
|
+
"success": false,
|
|
25342
|
+
"error": {
|
|
25343
|
+
"code": "rate_limit_exceeded",
|
|
25344
|
+
"message": "Rate limit exceeded"
|
|
25345
|
+
}
|
|
25346
|
+
}
|
|
25347
|
+
} }
|
|
25348
|
+
}
|
|
25349
|
+
},
|
|
25350
|
+
"x-primitive-permission": ["domains:read"]
|
|
25351
|
+
} },
|
|
25352
|
+
"/managed-inbox/vanity": { "post": {
|
|
25353
|
+
"operationId": "claimVanityInboxName",
|
|
25354
|
+
"summary": "Claim a vanity inbox name",
|
|
25355
|
+
"description": "Make the name the organization's current managed inbox. The previous inbox stops being current but keeps receiving mail. Needs the Power plan and domains:manage, which a credential confined to some mailboxes never holds. Sending records are published in the same request when they can be. outbound_ready false means they could not be yet: mail to the new name still arrives, but sending from it is refused until they are published.",
|
|
25356
|
+
"tags": ["Domains"],
|
|
25357
|
+
"security": [{ "BearerAuth": [] }],
|
|
25358
|
+
"requestBody": {
|
|
25359
|
+
"required": true,
|
|
25360
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ClaimVanityInboxNameRequest" } } }
|
|
25361
|
+
},
|
|
25362
|
+
"responses": {
|
|
25363
|
+
"201": {
|
|
25364
|
+
"description": "Claim a vanity inbox name",
|
|
25365
|
+
"content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SuccessEnvelope" }, {
|
|
25366
|
+
"type": "object",
|
|
25367
|
+
"required": ["data"],
|
|
25368
|
+
"properties": { "data": { "$ref": "#/components/schemas/ClaimVanityInboxNameResult" } }
|
|
25369
|
+
}] } } }
|
|
25370
|
+
},
|
|
25371
|
+
"400": {
|
|
25372
|
+
"description": "Invalid request parameters",
|
|
25373
|
+
"content": { "application/json": {
|
|
25374
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
25375
|
+
"example": {
|
|
25376
|
+
"success": false,
|
|
25377
|
+
"error": {
|
|
25378
|
+
"code": "validation_error",
|
|
25379
|
+
"message": "Invalid domain format"
|
|
25380
|
+
}
|
|
25381
|
+
}
|
|
25382
|
+
} }
|
|
25383
|
+
},
|
|
25384
|
+
"401": {
|
|
25385
|
+
"description": "Invalid or missing API key",
|
|
25386
|
+
"content": { "application/json": {
|
|
25387
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
25388
|
+
"example": {
|
|
25389
|
+
"success": false,
|
|
25390
|
+
"error": {
|
|
25391
|
+
"code": "unauthorized",
|
|
25392
|
+
"message": "Invalid or missing API key"
|
|
25393
|
+
}
|
|
25394
|
+
}
|
|
25395
|
+
} },
|
|
25396
|
+
"headers": {
|
|
25397
|
+
"ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit-unauthenticated" },
|
|
25398
|
+
"ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining-unauthenticated" },
|
|
25399
|
+
"ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset-unauthenticated" },
|
|
25400
|
+
"ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy-unauthenticated" }
|
|
25401
|
+
}
|
|
25402
|
+
},
|
|
25403
|
+
"402": {
|
|
25404
|
+
"description": "plan_required: renaming the inbox needs the Power plan.",
|
|
25405
|
+
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
25406
|
+
},
|
|
25407
|
+
"403": {
|
|
25408
|
+
"description": "Authenticated caller lacks permission for the operation",
|
|
25409
|
+
"content": { "application/json": {
|
|
25410
|
+
"schema": { "$ref": "#/components/schemas/ErrorResponse" },
|
|
25411
|
+
"example": {
|
|
25412
|
+
"success": false,
|
|
25413
|
+
"error": {
|
|
25414
|
+
"code": "forbidden",
|
|
25415
|
+
"message": "Insufficient permissions"
|
|
25416
|
+
}
|
|
25417
|
+
}
|
|
25418
|
+
} }
|
|
25419
|
+
},
|
|
25420
|
+
"409": {
|
|
25421
|
+
"description": "conflict: the name is already taken, or another change to the organization's inbox committed meanwhile (retry).",
|
|
25109
25422
|
"content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
|
|
25110
25423
|
},
|
|
25111
25424
|
"429": {
|
|
@@ -35415,7 +35728,7 @@ const openapiDocument = {
|
|
|
35415
35728
|
"get": {
|
|
35416
35729
|
"operationId": "listRoles",
|
|
35417
35730
|
"summary": "List roles",
|
|
35418
|
-
"description": "Every role in the organization (built-in, template copies and custom roles), with how many members and groups hold each, the templates not yet copied, and whether roles can be assigned now. `unassigned` describes role restricted on a member with no role_id, which is not a role and is never in `roles`.
|
|
35731
|
+
"description": "Every role in the organization (built-in, template copies and custom roles), with how many members and groups hold each, the templates not yet copied, and whether roles can be assigned now. `unassigned` describes role restricted on a member with no role_id, which is not a role and is never in `roles`. Needs members:read (owners, admins, members and roles that grant it); API keys are refused.",
|
|
35419
35732
|
"tags": ["Roles and members"],
|
|
35420
35733
|
"security": [{ "BearerAuth": [] }],
|
|
35421
35734
|
"responses": {
|
|
@@ -36216,7 +36529,7 @@ const openapiDocument = {
|
|
|
36216
36529
|
"get": {
|
|
36217
36530
|
"operationId": "getAccessMode",
|
|
36218
36531
|
"summary": "Get the mailbox access mode",
|
|
36219
|
-
"description": "Whole-org or delegated mailbox access. Holders of roles:assign also get the preview of a switch (every item that needs a decision, each with the decision_options it takes, worded for what the switch does) and the decisions made, plus notices: member and group domain entries that delegated mode keeps off personal mailboxes, each with how many it leaves out. Notices are informational, never decided, and never hold the switch (notices_truncated past 500, notices_unavailable when they could not be read). In whole-org mode it also lists narrowed_agents: every live agent connection the switch narrows to an own-address key (personal agents of members, and shared agents), informational in the same way (narrowed_agents_truncated past 500, narrowed_agents_unavailable when they could not be read).
|
|
36532
|
+
"description": "Whole-org or delegated mailbox access. Holders of roles:assign also get the preview of a switch (every item that needs a decision, each with the decision_options it takes, worded for what the switch does) and the decisions made, plus notices: member and group domain entries that delegated mode keeps off personal mailboxes, each with how many it leaves out. Notices are informational, never decided, and never hold the switch (notices_truncated past 500, notices_unavailable when they could not be read). In whole-org mode it also lists narrowed_agents: every live agent connection the switch narrows to an own-address key (personal agents of members, and shared agents), informational in the same way (narrowed_agents_truncated past 500, narrowed_agents_unavailable when they could not be read). Needs members:read (owners, admins, members and roles that grant it); API keys are refused.",
|
|
36220
36533
|
"tags": ["Roles and members"],
|
|
36221
36534
|
"security": [{ "BearerAuth": [] }],
|
|
36222
36535
|
"responses": {
|
|
@@ -39410,6 +39723,7 @@ const openapiDocument = {
|
|
|
39410
39723
|
"entitlement",
|
|
39411
39724
|
"expectations_failed",
|
|
39412
39725
|
"expectations_undecided",
|
|
39726
|
+
"expectations_unreadable",
|
|
39413
39727
|
"expired",
|
|
39414
39728
|
"feature_not_enabled",
|
|
39415
39729
|
"fresh_send_not_authorized",
|
|
@@ -42871,12 +43185,12 @@ const openapiDocument = {
|
|
|
42871
43185
|
},
|
|
42872
43186
|
"hold": {
|
|
42873
43187
|
"type": "object",
|
|
42874
|
-
"description": "Only on a
|
|
43188
|
+
"description": "Only on a scheduled send that is not going out yet; status stays scheduled. credential_reuse_hold: its OAuth grant was revoked after refresh token reuse, so it waits until released (POST /sent-emails/{id}/release) or canceled; canceled after 7 days. sending_ip_warmup_cap: your dedicated sending address is at today's warm-up limit or paused, so it goes out on its own within the hour after the limit resets at 00:00 UTC (fails with sending_ip_warmup_cap after 7 such holds); no release needed. On sent-email reads and conversation messages.",
|
|
42875
43189
|
"required": ["reason", "since"],
|
|
42876
43190
|
"properties": {
|
|
42877
43191
|
"reason": {
|
|
42878
43192
|
"type": "string",
|
|
42879
|
-
"description": "Open: credential_reuse_hold."
|
|
43193
|
+
"description": "Open: credential_reuse_hold, sending_ip_warmup_cap."
|
|
42880
43194
|
},
|
|
42881
43195
|
"since": {
|
|
42882
43196
|
"type": ["string", "null"],
|
|
@@ -43466,12 +43780,12 @@ const openapiDocument = {
|
|
|
43466
43780
|
},
|
|
43467
43781
|
"hold": {
|
|
43468
43782
|
"type": "object",
|
|
43469
|
-
"description": "Only on a
|
|
43783
|
+
"description": "Only on a scheduled send that is not going out yet; status stays scheduled. credential_reuse_hold: its OAuth grant was revoked after refresh token reuse, so it waits until released (POST /sent-emails/{id}/release) or canceled; canceled after 7 days. sending_ip_warmup_cap: your dedicated sending address is at today's warm-up limit or paused, so it goes out on its own within the hour after the limit resets at 00:00 UTC (fails with sending_ip_warmup_cap after 7 such holds); no release needed. On sent-email reads and conversation messages.",
|
|
43470
43784
|
"required": ["reason", "since"],
|
|
43471
43785
|
"properties": {
|
|
43472
43786
|
"reason": {
|
|
43473
43787
|
"type": "string",
|
|
43474
|
-
"description": "Open: credential_reuse_hold."
|
|
43788
|
+
"description": "Open: credential_reuse_hold, sending_ip_warmup_cap."
|
|
43475
43789
|
},
|
|
43476
43790
|
"since": {
|
|
43477
43791
|
"type": ["string", "null"],
|
|
@@ -43915,12 +44229,12 @@ const openapiDocument = {
|
|
|
43915
44229
|
},
|
|
43916
44230
|
"hold": {
|
|
43917
44231
|
"type": "object",
|
|
43918
|
-
"description": "Only on a
|
|
44232
|
+
"description": "Only on a scheduled send that is not going out yet; status stays scheduled. credential_reuse_hold: its OAuth grant was revoked after refresh token reuse, so it waits until released (POST /sent-emails/{id}/release) or canceled; canceled after 7 days. sending_ip_warmup_cap: your dedicated sending address is at today's warm-up limit or paused, so it goes out on its own within the hour after the limit resets at 00:00 UTC (fails with sending_ip_warmup_cap after 7 such holds); no release needed. On sent-email reads and conversation messages.",
|
|
43919
44233
|
"required": ["reason", "since"],
|
|
43920
44234
|
"properties": {
|
|
43921
44235
|
"reason": {
|
|
43922
44236
|
"type": "string",
|
|
43923
|
-
"description": "Open: credential_reuse_hold."
|
|
44237
|
+
"description": "Open: credential_reuse_hold, sending_ip_warmup_cap."
|
|
43924
44238
|
},
|
|
43925
44239
|
"since": {
|
|
43926
44240
|
"type": ["string", "null"],
|
|
@@ -46271,7 +46585,10 @@ const openapiDocument = {
|
|
|
46271
46585
|
"type": "string",
|
|
46272
46586
|
"format": "uuid"
|
|
46273
46587
|
},
|
|
46274
|
-
"endpoint_url": {
|
|
46588
|
+
"endpoint_url": {
|
|
46589
|
+
"type": "string",
|
|
46590
|
+
"description": "Where it was sent: a webhook's scheme and host, followed by \"/... (path and query hidden)\" when its URL has more (GET /endpoints/{id} has the whole URL), function://<id> for a Function, or pull: for a pull subscription."
|
|
46591
|
+
},
|
|
46275
46592
|
"status": {
|
|
46276
46593
|
"type": "string",
|
|
46277
46594
|
"enum": [
|
|
@@ -46324,7 +46641,7 @@ const openapiDocument = {
|
|
|
46324
46641
|
},
|
|
46325
46642
|
"response_body": {
|
|
46326
46643
|
"type": ["string", "null"],
|
|
46327
|
-
"description": "The first 2 KB of the body the endpoint answered this attempt with, so a handler that answers 200 and ignores a delivery can be seen doing so. It is whatever came back, which may echo what was sent. Null when no answer came back, and cleared when the message's content is discarded or the sent email is deleted. Withheld from a caller who cannot read message content, since an answer can echo what was sent."
|
|
46644
|
+
"description": "The first 2 KB of the body the endpoint answered this attempt with, so a handler that answers 200 and ignores a delivery can be seen doing so. It is whatever came back, which may echo what was sent. Null when no answer came back, and cleared when the message's content is discarded or the sent email is deleted. Withheld from a caller who cannot read message content, since an answer can echo what was sent. Null for a redirect (3xx), whose body repeats its Location; otherwise the webhook URL's path and query are hidden wherever it repeats them."
|
|
46328
46645
|
},
|
|
46329
46646
|
"latest_attempt": {
|
|
46330
46647
|
"type": "boolean",
|
|
@@ -49534,7 +49851,7 @@ const openapiDocument = {
|
|
|
49534
49851
|
"questions": {
|
|
49535
49852
|
"type": "array",
|
|
49536
49853
|
"items": { "type": "string" },
|
|
49537
|
-
"description": "Yes/no questions asked once the conditions match;
|
|
49854
|
+
"description": "Yes/no questions asked once the conditions match, over the email's text and attachment names, never attachment contents. A grant rule needs every one yes; a do_not_share rule matches on any yes."
|
|
49538
49855
|
}
|
|
49539
49856
|
},
|
|
49540
49857
|
"required": [
|
|
@@ -49738,7 +50055,7 @@ const openapiDocument = {
|
|
|
49738
50055
|
"description": "A condition {column, op, value?, min_confidence?} (see GET /email-rules/vocabulary) or {all: [...]}, {any: [...]}, {not: ...}."
|
|
49739
50056
|
},
|
|
49740
50057
|
"questions": {
|
|
49741
|
-
"description": "Yes/no questions asked once the conditions match;
|
|
50058
|
+
"description": "Yes/no questions asked once the conditions match, over the email's text and attachment names, never attachment contents. A grant rule needs every one yes; a do_not_share rule matches on any yes. Left out, none.",
|
|
49742
50059
|
"type": "array",
|
|
49743
50060
|
"items": { "type": "string" }
|
|
49744
50061
|
}
|
|
@@ -50092,7 +50409,7 @@ const openapiDocument = {
|
|
|
50092
50409
|
"skipped",
|
|
50093
50410
|
"not_found"
|
|
50094
50411
|
],
|
|
50095
|
-
"description": "near_miss: Not matched, but nearly: its questions did not
|
|
50412
|
+
"description": "near_miss: Not matched, but nearly: its conditions held and its questions did not match it, or it needs several parts and exactly one failed while at least one part that held is not an exclusion (a top-level not, or is_false). skipped: an email you can see that cannot be tested; skipped_reason says why. not_found: no such email, or not one the rule can read (or not settled, or awaiting sender authentication)."
|
|
50096
50413
|
},
|
|
50097
50414
|
"received_at": {
|
|
50098
50415
|
"type": "string",
|
|
@@ -50408,9 +50725,14 @@ const openapiDocument = {
|
|
|
50408
50725
|
"other"
|
|
50409
50726
|
]
|
|
50410
50727
|
},
|
|
50728
|
+
"expected": {
|
|
50729
|
+
"type": "string",
|
|
50730
|
+
"enum": ["match", "no_match"],
|
|
50731
|
+
"description": "match: a near case the rule should match; no_match: one it should not."
|
|
50732
|
+
},
|
|
50411
50733
|
"why": {
|
|
50412
50734
|
"type": "string",
|
|
50413
|
-
"description": "Why the rule should not match it."
|
|
50735
|
+
"description": "Why the rule should, or should not, match it."
|
|
50414
50736
|
},
|
|
50415
50737
|
"email": {
|
|
50416
50738
|
"type": "object",
|
|
@@ -50468,7 +50790,7 @@ const openapiDocument = {
|
|
|
50468
50790
|
"failed",
|
|
50469
50791
|
"undecided"
|
|
50470
50792
|
],
|
|
50471
|
-
"description": "failed: the rule
|
|
50793
|
+
"description": "failed: the rule decided it against expected (shared one it should not, or missed one it should match). undecided: the rule reads a spam score, which it cannot carry, whatever it decided; or not matched on something it could not decide (not classified, a fact or answer missing, or not reached in time)."
|
|
50472
50794
|
},
|
|
50473
50795
|
"question_answers": {
|
|
50474
50796
|
"type": "array",
|
|
@@ -50490,6 +50812,7 @@ const openapiDocument = {
|
|
|
50490
50812
|
},
|
|
50491
50813
|
"required": [
|
|
50492
50814
|
"kind",
|
|
50815
|
+
"expected",
|
|
50493
50816
|
"why",
|
|
50494
50817
|
"email",
|
|
50495
50818
|
"outcome",
|
|
@@ -50542,7 +50865,7 @@ const openapiDocument = {
|
|
|
50542
50865
|
"maximum": 8
|
|
50543
50866
|
},
|
|
50544
50867
|
"kinds": {
|
|
50545
|
-
"description": "Which kinds, taken in turn
|
|
50868
|
+
"description": "Which kinds, taken in turn, all expected no_match; other is a business near miss. Left out, a default mix.",
|
|
50546
50869
|
"minItems": 1,
|
|
50547
50870
|
"maxItems": 5,
|
|
50548
50871
|
"type": "array",
|
|
@@ -50558,7 +50881,7 @@ const openapiDocument = {
|
|
|
50558
50881
|
}
|
|
50559
50882
|
},
|
|
50560
50883
|
"to": {
|
|
50561
|
-
"description": "The mailbox they arrive in; by default the rule author's (a request's target's) sign-in address when you may see it, else yours.",
|
|
50884
|
+
"description": "The mailbox they arrive in; by default the first address (alphabetically) a selected scope names that a made-up email can be sent to, preferring one the author still reads; else the rule author's (a request's target's) sign-in address when you may see it, else yours.",
|
|
50562
50885
|
"type": "string",
|
|
50563
50886
|
"maxLength": 254,
|
|
50564
50887
|
"format": "email",
|
|
@@ -50611,7 +50934,7 @@ const openapiDocument = {
|
|
|
50611
50934
|
"dropped": {
|
|
50612
50935
|
"type": "integer",
|
|
50613
50936
|
"minimum": 0,
|
|
50614
|
-
"description": "Asked for but not returned: not written, outside the sample bounds, or of a kind not asked for."
|
|
50937
|
+
"description": "Asked for but not returned: not written, outside the sample bounds, or of a kind and expected not asked for."
|
|
50615
50938
|
}
|
|
50616
50939
|
},
|
|
50617
50940
|
"required": [
|
|
@@ -50783,7 +51106,7 @@ const openapiDocument = {
|
|
|
50783
51106
|
"near_miss",
|
|
50784
51107
|
"no_match"
|
|
50785
51108
|
],
|
|
50786
|
-
"description": "near_miss: Not matched, but nearly: its questions did not
|
|
51109
|
+
"description": "near_miss: Not matched, but nearly: its conditions held and its questions did not match it, or it needs several parts and exactly one failed while at least one part that held is not an exclusion (a top-level not, or is_false)."
|
|
50787
51110
|
},
|
|
50788
51111
|
"parts": {
|
|
50789
51112
|
"type": "array",
|
|
@@ -50925,7 +51248,7 @@ const openapiDocument = {
|
|
|
50925
51248
|
"enum": ["grant", "do_not_share"]
|
|
50926
51249
|
},
|
|
50927
51250
|
"protection_note": {
|
|
50928
|
-
"description": "On a do_not_share rule only: it protects nothing yet (not active),
|
|
51251
|
+
"description": "On a do_not_share rule only: it protects nothing yet (not active), a classifier fact narrows it, or its several questions are alternatives.",
|
|
50929
51252
|
"type": "string"
|
|
50930
51253
|
},
|
|
50931
51254
|
"evaluation_scope": {
|
|
@@ -51348,7 +51671,7 @@ const openapiDocument = {
|
|
|
51348
51671
|
"enum": ["grant", "do_not_share"]
|
|
51349
51672
|
},
|
|
51350
51673
|
"protection_note": {
|
|
51351
|
-
"description": "On a do_not_share rule only: it protects nothing yet (not active),
|
|
51674
|
+
"description": "On a do_not_share rule only: it protects nothing yet (not active), a classifier fact narrows it, or its several questions are alternatives.",
|
|
51352
51675
|
"type": "string"
|
|
51353
51676
|
},
|
|
51354
51677
|
"evaluation_scope": {
|
|
@@ -51446,7 +51769,7 @@ const openapiDocument = {
|
|
|
51446
51769
|
"enum": ["grant", "do_not_share"]
|
|
51447
51770
|
},
|
|
51448
51771
|
"protection_note": {
|
|
51449
|
-
"description": "On a do_not_share rule only: it protects nothing yet (not active),
|
|
51772
|
+
"description": "On a do_not_share rule only: it protects nothing yet (not active), a classifier fact narrows it, or its several questions are alternatives.",
|
|
51450
51773
|
"type": "string"
|
|
51451
51774
|
},
|
|
51452
51775
|
"evaluation_scope": {
|
|
@@ -51657,7 +51980,7 @@ const openapiDocument = {
|
|
|
51657
51980
|
"maximum": 2147483647
|
|
51658
51981
|
},
|
|
51659
51982
|
"if_expectations_pass": {
|
|
51660
|
-
"description": "true: judge the rule as this write leaves it (new tree, restored version, new scope, or the version it activates) against the expectations it leaves, as POST /email-rules/test would, before saving; it can take as long as a test. Failed: 409 expectations_failed; undecided: 409 expectations_undecided (
|
|
51983
|
+
"description": "true: judge the rule as this write leaves it (new tree, restored version, new scope, or the version it activates) against the expectations it leaves, as POST /email-rules/test would, before saving; it can take as long as a test. Failed: 409 expectations_failed; on emails the rule cannot read: 409 expectations_unreadable; undecided: 409 expectations_undecided (each with details.expectations_check); none to judge: 400 no_expectations. Refused writes save nothing; a pass saves unless the rule moved meanwhile (409 email_rule_conflict). Only writes that save a version or activate the rule are judged.",
|
|
51661
51984
|
"type": "boolean"
|
|
51662
51985
|
},
|
|
51663
51986
|
"restore_version": {
|
|
@@ -51757,7 +52080,7 @@ const openapiDocument = {
|
|
|
51757
52080
|
"matched": { "type": "boolean" },
|
|
51758
52081
|
"near_miss": {
|
|
51759
52082
|
"type": "boolean",
|
|
51760
|
-
"description": "Not matched, but nearly: its questions did not
|
|
52083
|
+
"description": "Not matched, but nearly: its conditions held and its questions did not match it, or it needs several parts and exactly one failed while at least one part that held is not an exclusion (a top-level not, or is_false). Decisions recorded under the earlier definition counted an exclusion too."
|
|
51761
52084
|
},
|
|
51762
52085
|
"parts": {
|
|
51763
52086
|
"type": "array",
|
|
@@ -51815,6 +52138,28 @@ const openapiDocument = {
|
|
|
51815
52138
|
]
|
|
51816
52139
|
}
|
|
51817
52140
|
},
|
|
52141
|
+
"EmailRuleCoveringAuthor": {
|
|
52142
|
+
"type": "object",
|
|
52143
|
+
"properties": {
|
|
52144
|
+
"user_id": {
|
|
52145
|
+
"type": "string",
|
|
52146
|
+
"format": "uuid"
|
|
52147
|
+
},
|
|
52148
|
+
"name": {
|
|
52149
|
+
"description": "Their name; null when they have none set.",
|
|
52150
|
+
"type": ["string", "null"]
|
|
52151
|
+
},
|
|
52152
|
+
"email": {
|
|
52153
|
+
"description": "Sign-in email; null unless you can list member emails or this is you.",
|
|
52154
|
+
"type": ["string", "null"]
|
|
52155
|
+
}
|
|
52156
|
+
},
|
|
52157
|
+
"required": [
|
|
52158
|
+
"user_id",
|
|
52159
|
+
"name",
|
|
52160
|
+
"email"
|
|
52161
|
+
]
|
|
52162
|
+
},
|
|
51818
52163
|
"ListEmailRuleResultsResult": {
|
|
51819
52164
|
"type": "object",
|
|
51820
52165
|
"properties": {
|
|
@@ -51857,7 +52202,7 @@ const openapiDocument = {
|
|
|
51857
52202
|
"type": "string",
|
|
51858
52203
|
"format": "uuid"
|
|
51859
52204
|
},
|
|
51860
|
-
"name": { "type": "string" },
|
|
52205
|
+
"name": { "type": ["string", "null"] },
|
|
51861
52206
|
"state": {
|
|
51862
52207
|
"type": "string",
|
|
51863
52208
|
"enum": [
|
|
@@ -51881,7 +52226,7 @@ const openapiDocument = {
|
|
|
51881
52226
|
},
|
|
51882
52227
|
"matched": { "type": "boolean" },
|
|
51883
52228
|
"near_miss": {
|
|
51884
|
-
"description": "Not matched, but nearly: its questions did not
|
|
52229
|
+
"description": "Not matched, but nearly: its conditions held and its questions did not match it, or it needs several parts and exactly one failed while at least one part that held is not an exclusion (a top-level not, or is_false). False when detail_withheld is true. Decisions recorded under the earlier definition counted an exclusion too.",
|
|
51885
52230
|
"type": "boolean"
|
|
51886
52231
|
},
|
|
51887
52232
|
"parts": {
|
|
@@ -51972,6 +52317,15 @@ const openapiDocument = {
|
|
|
51972
52317
|
"description": "On a do-not-share rule whose author is no longer a member of the organization: it blocks nothing now, whatever it decided. Absent otherwise.",
|
|
51973
52318
|
"type": "boolean",
|
|
51974
52319
|
"const": true
|
|
52320
|
+
},
|
|
52321
|
+
"read_only": {
|
|
52322
|
+
"description": "Another member's rule that decided on your own mail; dashboard and CLI only. name is null once it no longer covers you.",
|
|
52323
|
+
"type": "boolean",
|
|
52324
|
+
"const": true
|
|
52325
|
+
},
|
|
52326
|
+
"author": {
|
|
52327
|
+
"description": "With read_only: who wrote it.",
|
|
52328
|
+
"$ref": "#/components/schemas/EmailRuleCoveringAuthor"
|
|
51975
52329
|
}
|
|
51976
52330
|
},
|
|
51977
52331
|
"required": [
|
|
@@ -51982,12 +52336,17 @@ const openapiDocument = {
|
|
|
51982
52336
|
"not_run_reason"
|
|
51983
52337
|
]
|
|
51984
52338
|
},
|
|
51985
|
-
"description": "
|
|
52339
|
+
"description": "Rules you can see, and read_only ones: matched first, then not matched, then not run; newest first within each."
|
|
51986
52340
|
},
|
|
51987
52341
|
"hidden": {
|
|
51988
52342
|
"type": "integer",
|
|
51989
52343
|
"minimum": 0,
|
|
51990
|
-
"description": "
|
|
52344
|
+
"description": "Rules that decided on this email that you cannot see."
|
|
52345
|
+
},
|
|
52346
|
+
"not_listed": {
|
|
52347
|
+
"description": "Rules you can see past the 50 listed.",
|
|
52348
|
+
"type": "integer",
|
|
52349
|
+
"minimum": 0
|
|
51991
52350
|
},
|
|
51992
52351
|
"classification": {
|
|
51993
52352
|
"type": ["object", "null"],
|
|
@@ -52595,7 +52954,7 @@ const openapiDocument = {
|
|
|
52595
52954
|
"enum": ["grant", "do_not_share"]
|
|
52596
52955
|
},
|
|
52597
52956
|
"protection_note": {
|
|
52598
|
-
"description": "On a do_not_share rule only: it protects nothing yet (not active),
|
|
52957
|
+
"description": "On a do_not_share rule only: it protects nothing yet (not active), a classifier fact narrows it, or its several questions are alternatives.",
|
|
52599
52958
|
"type": "string"
|
|
52600
52959
|
},
|
|
52601
52960
|
"evaluation_scope": {
|
|
@@ -53180,8 +53539,274 @@ const openapiDocument = {
|
|
|
53180
53539
|
},
|
|
53181
53540
|
"EndEmailRuleShareResult": {
|
|
53182
53541
|
"type": "object",
|
|
53183
|
-
"properties": {
|
|
53184
|
-
|
|
53542
|
+
"properties": {
|
|
53543
|
+
"ended": { "type": "boolean" },
|
|
53544
|
+
"rule_id": { "type": "string" },
|
|
53545
|
+
"note": { "type": "string" }
|
|
53546
|
+
},
|
|
53547
|
+
"required": ["ended"],
|
|
53548
|
+
"additionalProperties": {}
|
|
53549
|
+
},
|
|
53550
|
+
"EmailRuleCoveringMe": {
|
|
53551
|
+
"type": "object",
|
|
53552
|
+
"properties": {
|
|
53553
|
+
"id": {
|
|
53554
|
+
"type": "string",
|
|
53555
|
+
"format": "uuid"
|
|
53556
|
+
},
|
|
53557
|
+
"name": { "type": "string" },
|
|
53558
|
+
"state": {
|
|
53559
|
+
"type": "string",
|
|
53560
|
+
"enum": [
|
|
53561
|
+
"draft",
|
|
53562
|
+
"observe",
|
|
53563
|
+
"active"
|
|
53564
|
+
],
|
|
53565
|
+
"description": "draft: it decides nothing. observe: it decides and records, and shares nothing. active: it decides and, for a grant rule, shares what it matches."
|
|
53566
|
+
},
|
|
53567
|
+
"kind": {
|
|
53568
|
+
"type": "string",
|
|
53569
|
+
"enum": ["grant", "do_not_share"],
|
|
53570
|
+
"description": "grant: what it matches can be shared. do_not_share: it blocks sharing what it matches."
|
|
53571
|
+
},
|
|
53572
|
+
"author": {
|
|
53573
|
+
"description": "Who wrote it.",
|
|
53574
|
+
"$ref": "#/components/schemas/EmailRuleCoveringAuthor"
|
|
53575
|
+
},
|
|
53576
|
+
"is_author": {
|
|
53577
|
+
"type": "boolean",
|
|
53578
|
+
"description": "Whether you wrote it."
|
|
53579
|
+
},
|
|
53580
|
+
"covers": { "$ref": "#/components/schemas/EmailRuleCoverage" },
|
|
53581
|
+
"current_version": {
|
|
53582
|
+
"type": ["integer", "null"],
|
|
53583
|
+
"exclusiveMinimum": 0
|
|
53584
|
+
},
|
|
53585
|
+
"created_at": {
|
|
53586
|
+
"type": "string",
|
|
53587
|
+
"format": "date-time"
|
|
53588
|
+
}
|
|
53589
|
+
},
|
|
53590
|
+
"required": [
|
|
53591
|
+
"id",
|
|
53592
|
+
"name",
|
|
53593
|
+
"state",
|
|
53594
|
+
"kind",
|
|
53595
|
+
"author",
|
|
53596
|
+
"is_author",
|
|
53597
|
+
"covers",
|
|
53598
|
+
"current_version",
|
|
53599
|
+
"created_at"
|
|
53600
|
+
]
|
|
53601
|
+
},
|
|
53602
|
+
"EmailRuleCoverage": {
|
|
53603
|
+
"type": "object",
|
|
53604
|
+
"properties": {
|
|
53605
|
+
"addresses": {
|
|
53606
|
+
"type": "array",
|
|
53607
|
+
"items": { "type": "string" },
|
|
53608
|
+
"description": "Your own mailboxes (your member mailbox and your personal agents' addresses) it reaches now, lowercase."
|
|
53609
|
+
},
|
|
53610
|
+
"via": {
|
|
53611
|
+
"type": "string",
|
|
53612
|
+
"enum": [
|
|
53613
|
+
"author_reach",
|
|
53614
|
+
"selected",
|
|
53615
|
+
"own_mailboxes"
|
|
53616
|
+
],
|
|
53617
|
+
"description": "author_reach: it runs over everything its author can read, which includes these. selected: it names these mailboxes or their domain. own_mailboxes: it is your own rule over your own mail."
|
|
53618
|
+
}
|
|
53619
|
+
},
|
|
53620
|
+
"required": ["addresses", "via"]
|
|
53621
|
+
},
|
|
53622
|
+
"ListEmailRulesCoveringMeResult": {
|
|
53623
|
+
"type": "array",
|
|
53624
|
+
"items": { "$ref": "#/components/schemas/EmailRuleCoveringMe" }
|
|
53625
|
+
},
|
|
53626
|
+
"EmailRuleCoveringMeRead": {
|
|
53627
|
+
"type": "object",
|
|
53628
|
+
"properties": {
|
|
53629
|
+
"id": {
|
|
53630
|
+
"type": "string",
|
|
53631
|
+
"format": "uuid"
|
|
53632
|
+
},
|
|
53633
|
+
"name": {
|
|
53634
|
+
"description": "Null when covers_now is false: its name now may describe something else.",
|
|
53635
|
+
"type": ["string", "null"]
|
|
53636
|
+
},
|
|
53637
|
+
"state": {
|
|
53638
|
+
"type": "string",
|
|
53639
|
+
"enum": [
|
|
53640
|
+
"draft",
|
|
53641
|
+
"observe",
|
|
53642
|
+
"active"
|
|
53643
|
+
],
|
|
53644
|
+
"description": "draft: it decides nothing. observe: it decides and records, and shares nothing. active: it decides and, for a grant rule, shares what it matches."
|
|
53645
|
+
},
|
|
53646
|
+
"kind": {
|
|
53647
|
+
"type": "string",
|
|
53648
|
+
"enum": ["grant", "do_not_share"],
|
|
53649
|
+
"description": "grant: what it matches can be shared. do_not_share: it blocks sharing what it matches."
|
|
53650
|
+
},
|
|
53651
|
+
"author": {
|
|
53652
|
+
"description": "Who wrote it.",
|
|
53653
|
+
"$ref": "#/components/schemas/EmailRuleCoveringAuthor"
|
|
53654
|
+
},
|
|
53655
|
+
"is_author": {
|
|
53656
|
+
"type": "boolean",
|
|
53657
|
+
"description": "Whether you wrote it."
|
|
53658
|
+
},
|
|
53659
|
+
"covers": {
|
|
53660
|
+
"description": "Null when it no longer covers your mailboxes and you see it because it decided on your mail.",
|
|
53661
|
+
"anyOf": [{ "$ref": "#/components/schemas/EmailRuleCoverage" }, { "type": "null" }]
|
|
53662
|
+
},
|
|
53663
|
+
"current_version": {
|
|
53664
|
+
"type": ["integer", "null"],
|
|
53665
|
+
"exclusiveMinimum": 0,
|
|
53666
|
+
"description": "Null when covers_now is false."
|
|
53667
|
+
},
|
|
53668
|
+
"created_at": {
|
|
53669
|
+
"type": "string",
|
|
53670
|
+
"format": "date-time"
|
|
53671
|
+
},
|
|
53672
|
+
"covers_now": {
|
|
53673
|
+
"type": "boolean",
|
|
53674
|
+
"description": "Whether it covers one of your own mailboxes now. False for a rule you see only because it decided on mail at your own mailbox before."
|
|
53675
|
+
},
|
|
53676
|
+
"current": {
|
|
53677
|
+
"description": "Its current version: what it asks of each email. When covers_now is false, the newest version that decided on your mail instead.",
|
|
53678
|
+
"anyOf": [{ "$ref": "#/components/schemas/EmailRuleCoveringMeVersion" }, { "type": "null" }]
|
|
53679
|
+
},
|
|
53680
|
+
"note": {
|
|
53681
|
+
"description": "Present when covers_now is false: what is withheld, and why.",
|
|
53682
|
+
"type": "string"
|
|
53683
|
+
}
|
|
53684
|
+
},
|
|
53685
|
+
"required": [
|
|
53686
|
+
"id",
|
|
53687
|
+
"name",
|
|
53688
|
+
"state",
|
|
53689
|
+
"kind",
|
|
53690
|
+
"author",
|
|
53691
|
+
"is_author",
|
|
53692
|
+
"covers",
|
|
53693
|
+
"current_version",
|
|
53694
|
+
"created_at",
|
|
53695
|
+
"covers_now",
|
|
53696
|
+
"current"
|
|
53697
|
+
]
|
|
53698
|
+
},
|
|
53699
|
+
"EmailRuleCoveringMeVersion": {
|
|
53700
|
+
"type": "object",
|
|
53701
|
+
"properties": {
|
|
53702
|
+
"version": {
|
|
53703
|
+
"type": "integer",
|
|
53704
|
+
"exclusiveMinimum": 0
|
|
53705
|
+
},
|
|
53706
|
+
"english": {
|
|
53707
|
+
"type": "string",
|
|
53708
|
+
"description": "What its author asked for, in their words."
|
|
53709
|
+
},
|
|
53710
|
+
"tree": { "$ref": "#/components/schemas/EmailRuleTree" },
|
|
53711
|
+
"explanation": {
|
|
53712
|
+
"type": "string",
|
|
53713
|
+
"description": "What the rule matches, as compiled."
|
|
53714
|
+
},
|
|
53715
|
+
"assumptions": {
|
|
53716
|
+
"type": "array",
|
|
53717
|
+
"items": { "type": "string" }
|
|
53718
|
+
},
|
|
53719
|
+
"compiled_by": { "type": "string" },
|
|
53720
|
+
"vocabulary": { "type": "string" },
|
|
53721
|
+
"created_at": {
|
|
53722
|
+
"type": "string",
|
|
53723
|
+
"format": "date-time"
|
|
53724
|
+
}
|
|
53725
|
+
},
|
|
53726
|
+
"required": [
|
|
53727
|
+
"version",
|
|
53728
|
+
"english",
|
|
53729
|
+
"tree",
|
|
53730
|
+
"explanation",
|
|
53731
|
+
"assumptions",
|
|
53732
|
+
"compiled_by",
|
|
53733
|
+
"vocabulary",
|
|
53734
|
+
"created_at"
|
|
53735
|
+
]
|
|
53736
|
+
},
|
|
53737
|
+
"GetEmailRuleCoveringMeResult": { "$ref": "#/components/schemas/EmailRuleCoveringMeRead" },
|
|
53738
|
+
"EmailRuleDecisionOnMyMail": {
|
|
53739
|
+
"type": "object",
|
|
53740
|
+
"properties": {
|
|
53741
|
+
"id": {
|
|
53742
|
+
"type": "string",
|
|
53743
|
+
"format": "uuid"
|
|
53744
|
+
},
|
|
53745
|
+
"email_id": {
|
|
53746
|
+
"type": "string",
|
|
53747
|
+
"format": "uuid"
|
|
53748
|
+
},
|
|
53749
|
+
"rule_version": {
|
|
53750
|
+
"type": "integer",
|
|
53751
|
+
"exclusiveMinimum": 0
|
|
53752
|
+
},
|
|
53753
|
+
"classification_id": {
|
|
53754
|
+
"type": "string",
|
|
53755
|
+
"format": "uuid"
|
|
53756
|
+
},
|
|
53757
|
+
"matched": { "type": "boolean" },
|
|
53758
|
+
"near_miss": {
|
|
53759
|
+
"type": "boolean",
|
|
53760
|
+
"description": "Not matched, but nearly. False when detail_withheld is true."
|
|
53761
|
+
},
|
|
53762
|
+
"parts": {
|
|
53763
|
+
"type": "array",
|
|
53764
|
+
"items": {},
|
|
53765
|
+
"description": "How each top-level part of the rule decided."
|
|
53766
|
+
},
|
|
53767
|
+
"question_answers": {
|
|
53768
|
+
"type": "array",
|
|
53769
|
+
"items": {},
|
|
53770
|
+
"description": "The answers to the rule's own questions, when they were asked."
|
|
53771
|
+
},
|
|
53772
|
+
"detail_withheld": {
|
|
53773
|
+
"description": "Present, as true, when the email's content cannot be read: matched still says what the rule decided, and parts and question_answers are empty.",
|
|
53774
|
+
"type": "boolean",
|
|
53775
|
+
"const": true
|
|
53776
|
+
},
|
|
53777
|
+
"created_at": {
|
|
53778
|
+
"type": "string",
|
|
53779
|
+
"format": "date-time"
|
|
53780
|
+
},
|
|
53781
|
+
"from_address": {
|
|
53782
|
+
"description": "The email's sender address, as GET /v1/emails/{id} shows it.",
|
|
53783
|
+
"type": ["string", "null"]
|
|
53784
|
+
},
|
|
53785
|
+
"subject": { "type": ["string", "null"] },
|
|
53786
|
+
"received_at": {
|
|
53787
|
+
"type": ["string", "null"],
|
|
53788
|
+
"format": "date-time",
|
|
53789
|
+
"description": "When the email arrived. Null, with the other two, when you are not shown the email (it awaits sender authentication)."
|
|
53790
|
+
}
|
|
53791
|
+
},
|
|
53792
|
+
"required": [
|
|
53793
|
+
"id",
|
|
53794
|
+
"email_id",
|
|
53795
|
+
"rule_version",
|
|
53796
|
+
"classification_id",
|
|
53797
|
+
"matched",
|
|
53798
|
+
"near_miss",
|
|
53799
|
+
"parts",
|
|
53800
|
+
"question_answers",
|
|
53801
|
+
"created_at",
|
|
53802
|
+
"from_address",
|
|
53803
|
+
"subject",
|
|
53804
|
+
"received_at"
|
|
53805
|
+
]
|
|
53806
|
+
},
|
|
53807
|
+
"ListEmailRuleDecisionsOnMyMailResult": {
|
|
53808
|
+
"type": "array",
|
|
53809
|
+
"items": { "$ref": "#/components/schemas/EmailRuleDecisionOnMyMail" }
|
|
53185
53810
|
},
|
|
53186
53811
|
"GetDomainAgentAuthorizationResult": {
|
|
53187
53812
|
"type": "object",
|
|
@@ -55095,7 +55720,10 @@ const openapiDocument = {
|
|
|
55095
55720
|
"format": "uuid",
|
|
55096
55721
|
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
|
|
55097
55722
|
},
|
|
55098
|
-
"endpoint_url": {
|
|
55723
|
+
"endpoint_url": {
|
|
55724
|
+
"type": "string",
|
|
55725
|
+
"description": "Where it was sent: a webhook's scheme and host, followed by \"/... (path and query hidden)\" when its URL has more (GET /endpoints/{id} has the whole URL), function://<id> for a Function, or pull: for a pull subscription."
|
|
55726
|
+
},
|
|
55099
55727
|
"status": { "type": "string" },
|
|
55100
55728
|
"attempt_count": { "type": "integer" },
|
|
55101
55729
|
"duration_ms": { "type": ["integer", "null"] },
|
|
@@ -55106,7 +55734,7 @@ const openapiDocument = {
|
|
|
55106
55734
|
"description": "The HTTP status the endpoint answered this attempt with: a webhook's own answer, or for a Function what its runtime answered, which is the platform's own error when the Function could not be run. Null when no answer came back (a network error, a timeout, an attempt refused or not sent) and on attempts recorded before this field."
|
|
55107
55735
|
},
|
|
55108
55736
|
"response_body": {
|
|
55109
|
-
"description": "The first 2 KB of the body the endpoint answered this attempt with, so a handler that answers 200 and ignores a delivery can be seen doing so. It is whatever came back, which may echo what was sent. Null when no answer came back, and cleared when the message's content is discarded or the sent email is deleted. Withheld from a caller who cannot read message content, since an answer can echo what was sent.",
|
|
55737
|
+
"description": "The first 2 KB of the body the endpoint answered this attempt with, so a handler that answers 200 and ignores a delivery can be seen doing so. It is whatever came back, which may echo what was sent. Null when no answer came back, and cleared when the message's content is discarded or the sent email is deleted. Withheld from a caller who cannot read message content, since an answer can echo what was sent. Null for a redirect (3xx), whose body repeats its Location; otherwise the webhook URL's path and query are hidden wherever it repeats them.",
|
|
55110
55738
|
"type": ["string", "null"]
|
|
55111
55739
|
},
|
|
55112
55740
|
"created_at": { "type": "string" },
|
|
@@ -55159,7 +55787,7 @@ const openapiDocument = {
|
|
|
55159
55787
|
"description": "The HTTP status the endpoint answered this attempt with: a webhook's own answer, or for a Function what its runtime answered, which is the platform's own error when the Function could not be run. Null when no answer came back (a network error, a timeout, an attempt refused or not sent) and on attempts recorded before this field."
|
|
55160
55788
|
},
|
|
55161
55789
|
"response_body": {
|
|
55162
|
-
"description": "The first 2 KB of the body the endpoint answered this attempt with, so a handler that answers 200 and ignores a delivery can be seen doing so. It is whatever came back, which may echo what was sent. Null when no answer came back, and cleared when the message's content is discarded or the sent email is deleted. Withheld from a caller who cannot read message content, since an answer can echo what was sent.",
|
|
55790
|
+
"description": "The first 2 KB of the body the endpoint answered this attempt with, so a handler that answers 200 and ignores a delivery can be seen doing so. It is whatever came back, which may echo what was sent. Null when no answer came back, and cleared when the message's content is discarded or the sent email is deleted. Withheld from a caller who cannot read message content, since an answer can echo what was sent. Null for a redirect (3xx), whose body repeats its Location; otherwise the webhook URL's path and query are hidden wherever it repeats them.",
|
|
55163
55791
|
"type": ["string", "null"]
|
|
55164
55792
|
},
|
|
55165
55793
|
"retry_scheduled": {
|
|
@@ -57091,7 +57719,7 @@ const openapiDocument = {
|
|
|
57091
57719
|
"id": { "type": "string" },
|
|
57092
57720
|
"label": {
|
|
57093
57721
|
"type": "string",
|
|
57094
|
-
"description": "A webhook's URL, a pull subscription's name (or pull when it has none), a route's or filter's pattern, or a wake schedule's command and the address it wakes (command to address). A Function trigger's label is function: look it up by id."
|
|
57722
|
+
"description": "A webhook's scheme and host, followed by \"/... (path and query hidden)\" when its URL has more (GET /v1/endpoints/{id} has the whole URL), a pull subscription's name (or pull when it has none), a route's or filter's pattern, or a wake schedule's command and the address it wakes (command to address). A Function trigger's label is function: look it up by id."
|
|
57095
57723
|
},
|
|
57096
57724
|
"org_owned": {
|
|
57097
57725
|
"type": "boolean",
|
|
@@ -71965,8 +72593,8 @@ const PRIMITIVE_TEAM_AUTHOR = {
|
|
|
71965
72593
|
name: "Primitive Team",
|
|
71966
72594
|
url: "https://primitive.dev"
|
|
71967
72595
|
};
|
|
71968
|
-
const SDK_VERSION_RANGE = "^3.0.0-preview.
|
|
71969
|
-
const CLI_VERSION_RANGE = "^3.0.0-preview.
|
|
72596
|
+
const SDK_VERSION_RANGE = "^3.0.0-preview.9";
|
|
72597
|
+
const CLI_VERSION_RANGE = "^3.0.0-preview.9";
|
|
71970
72598
|
const ESBUILD_VERSION_RANGE = "^0.27.0";
|
|
71971
72599
|
function renderHandler() {
|
|
71972
72600
|
return `// env.PRIMITIVE_API_KEY, env.PRIMITIVE_WEBHOOK_SECRET, and
|
|
@@ -75742,7 +76370,7 @@ var KeysCreateCommand = class KeysCreateCommand extends Command {
|
|
|
75742
76370
|
multiple: true
|
|
75743
76371
|
}),
|
|
75744
76372
|
rule: Flags.string({
|
|
75745
|
-
description: "An email rule id whose matching mail the key reaches (repeatable).",
|
|
76373
|
+
description: "An email rule id whose matching mail the key reaches (repeatable). An --address or --domain given beside it is read in full, not only the rule's mail.",
|
|
75746
76374
|
multiple: true
|
|
75747
76375
|
}),
|
|
75748
76376
|
"all-mailboxes": Flags.boolean({ description: "A key with --permission that reaches every mailbox." }),
|
|
@@ -75789,7 +76417,10 @@ var KeysCreateCommand = class KeysCreateCommand extends Command {
|
|
|
75789
76417
|
return;
|
|
75790
76418
|
}
|
|
75791
76419
|
const key = result.data;
|
|
75792
|
-
if (!flags.json)
|
|
76420
|
+
if (!flags.json) {
|
|
76421
|
+
writeWarnings(key.warnings);
|
|
76422
|
+
writeWarnings(key.address_warnings);
|
|
76423
|
+
}
|
|
75793
76424
|
printSecret(this, Boolean(flags.json), key, key.key, [
|
|
75794
76425
|
`Created API key ${key.name ?? "(unnamed)"} (${key.id}), prefix ${key.key_prefix}.`,
|
|
75795
76426
|
`Permissions: ${describePermissions({
|
|
@@ -76015,6 +76646,7 @@ var KeysUpdateCommand = class KeysUpdateCommand extends Command {
|
|
|
76015
76646
|
return;
|
|
76016
76647
|
}
|
|
76017
76648
|
writeWarnings(result.data.warnings);
|
|
76649
|
+
writeWarnings(result.data.address_warnings);
|
|
76018
76650
|
const changed = result.data.changed;
|
|
76019
76651
|
this.log(changed.length > 0 ? `Updated key ${args.id}: ${changed.join(", ")}.` : `Key ${args.id} already matched; nothing changed.`);
|
|
76020
76652
|
if (after?.ok) {
|
|
@@ -76054,8 +76686,10 @@ function reportsCascade(standing) {
|
|
|
76054
76686
|
}
|
|
76055
76687
|
/**
|
|
76056
76688
|
* A standing object's label. A Function trigger's label is only "function" and
|
|
76057
|
-
* an unnamed pull subscription's only "pull", so those carry their id
|
|
76058
|
-
* webhook's
|
|
76689
|
+
* an unnamed pull subscription's only "pull", so those carry their id. A
|
|
76690
|
+
* webhook's label is its URL's scheme and host (the server hides the path and
|
|
76691
|
+
* query); against an older server, which sent the whole URL, it is cut at
|
|
76692
|
+
* `?` or `#`, which can hold a token.
|
|
76059
76693
|
*/
|
|
76060
76694
|
function standingLabel(item) {
|
|
76061
76695
|
const id = typeof item.id === "string" ? item.id : String(item.id);
|