primcli 3.0.0-preview.14 → 3.0.0-preview.15

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.
@@ -1,12 +1,12 @@
1
- import { $ as interactionNextActions, $t as ConnectedAgentKeyRequiredError, A as openBrowser, B as serverRelationship, Bt as runtimeSessionVariableList, C as approveThenRerunHint, Ct as sendIdentityFields, D as canOfferCopyHotkey, Dt as serializeErrorPayload, E as withApproval, Et as sentHistoryWindowStart, F as formatMailWakeLine, Ft as identitySuggestions, G as claimPendingMail, Gt as readCallerMailFor, H as wakeReadCommand, Ht as withFlagSuggestion, I as latestOwnOutbound, It as loadSkillLine, J as pendingMailPath, Jt as isEmailId, K as clearConsumedPendingMail, Kt as classificationFactLines, L as readThreadContext, Lt as currentMailSessionKey, M as bareAddress, Mt as connectNextSteps, N as describeWake, O as formatBrowserLoginInstructions, Ot as successfulSendOutcome, P as displayAddress, Pt as generatedAgentName, Q as interactionHumanLine, Qt as withAttachmentWait, R as sentInThread, Rt as detectAgentRuntime, S as STEP_UP_TOKEN_FLAG_DESCRIPTION, St as reportSendCommandResult, T as terminalApprovalIo, Tt as sendWaitClampNotice, U as wakeRecipientField, Ut as emptyEmailListHint, Vt as formatAlreadySentNotice, W as wakeRelationship, Wt as mailReach, X as recordPendingMail, Xt as ATTACHMENT_WAIT_FLAG_DESCRIPTION, Y as readPendingMail, Yt as noFactsMessage, Z as removePendingMail, Zt as ATTACHMENT_WAIT_MAX_MS, _ as surfaceUnauthorizedHint, _n as sanitizeForTerminal, _t as formatPriorRepliesCheckSkipped, a as createOperationCommand, an as resolveCliApiRequestConfig, at as MAX_SEND_WAIT_TIMEOUT_MS, b as BROWSER_FLAG_DESCRIPTION, bt as formatSendRecordFailureSummary, c as formatErrorPayload, cn as RESTRICTED_ROLE_NOTE, ct as assertValidIdempotencyKey, d as isGrantRefusal, dn as isBuiltInRoleKey, dt as checkPriorReplies, et as readEmailInteraction, f as networkErrorHint, fn as revokeUserLogin, ft as classifySendError, g as runWithTiming, gn as routeWarningLines, gt as formatDeletedEarlierSendNotice, h as refusalDetails, hn as switchCurrentOrg, ht as followUpCommandPrefix, i as TIME_FLAG_DESCRIPTION, in as refuseOrgSelectionForProfile, it as IDEMPOTENCY_KEY_FLAG_DESCRIPTION, j as explainPendingMailNotFound, jt as cliInvocation, k as listenForCopyHotkey, kt as thrownErrorExitCode, l as hasControlCharacter$1, ln as credentialsFromUserLogin, lt as buildFollowUpCommand, m as readTextFileFlag, mn as roleKeyText, mt as excludeSignalReplies, n as API_ERROR_CODES, nn as createCliApiClient, nt as replyInteractionWarning, o as extractErrorCode, on as selectedOrgFromEnv, ot as SEND_OUTCOME_HELP, p as parameterFlagName, pn as roleKeyLabel, pt as deriveSendIdempotencyKey, q as clearReadPendingMail, qt as classificationOf, r as OPERATION_PATH_FLAGS, rn as refreshStoredCliCredentials, s as extractErrorPayload, sn as CliOrgRefusedError, st as apiResultHttpStatus, t as API_BASE_URL_FLAG_DESCRIPTION, tn as createAuthenticatedCliApiClient, tt as replyExpectation, u as headerFlagName, un as fetchCliOrgs, ut as buildThrownSendFailureEnvelope, v as takesStepUp, vn as setKnownCommands, vt as formatPriorRepliesWarning, w as promptLine$2, wt as sendOutcomeExitCode, x as STEP_UP_HEADER$1, xt as priorRepliesThatWentOut, y as writeErrorWithHints, yn as operationManifest, yt as formatSendFailureSummary, z as serverMuted, zt as detectRuntimeSession } from "../api-command-BTOIanV1.js";
2
- import { $n as setMemory, $t as getOwnGrant, A as filtersFromFlags, An as listWakeAuthorizations, At as deleteWakeAuthorization, B as awaitingRejectedError, Bn as reorderRoutes, C as transientFailure, Cn as listMailboxAccess, Ct as createRoute, D as cursorFromAcceptedRows, Dn as listRoutes, E as collectNewAcceptedEmails, En as listRoles, F as AWAITING_FLAG_DESCRIPTION, Ft as downloadSentAttachmentArchiveMember, G as isAwaitingRejectedError, Gn as runWakeSchedule, Gt as getFunction, H as formatAwaitingCell, Hn as resendAgentSignupVerification, Ht as getCreditBalance, I as AWAITING_VALUES, It as downloadSentAttachmentByFilename, Jn as searchMemories, Jt as getInboxStatus, K as queryUsesAwaiting, Kt as getFunctionRouting, L as REPLY_STATE_UNSUPPORTED_CODE, Lt as getAccessMode, M as quoteDslValue, Mn as listWakeSchedules, Mt as downloadEmailAttachmentArchiveMember, N as sinceFromFlags, Nn as pollCliLogin, Nt as downloadEmailAttachmentByFilename, O as encodeReceivedAtSearchCursor, On as listSentAttachmentArchiveMembers, Ot as deleteMemory, P as sleep$3, Pn as pullWebhookEvent, Q as isEmailReceivedEvent, Qn as setFunctionSecret, Qt as getOutboundStatus, R as ReplyStateUnsupportedError, Rn as redeemCreditCode, Rt as getAccount, S as retryingOperation, Sn as listKeys, St as createKey, T as SINCE_VALUE_HELP, Tn as listRepeatingSends, Tt as createWakeSchedule, U as formatRepliesCell, Un as revokeCredential, Ut as getDefaultNetworkAgent, V as ensureSearchReportsReplyState, Vn as replyToEmail, Vt as getConversation, W as hasReplyState, Wn as rotateKey, Wt as getEmail, Xn as sendEmail, Xt as getMemory, Yn as semanticSearch, Yt as getKey, Zn as setFunctionRoute, Zt as getOrgRoutingTopology, _ as backoffDelay, _n as listEmails, _t as checkSendability, a as REPEAT_IDLE_MAX_MINUTES, ar as testFunction, at as AutomatedFilterUnsupportedError, b as pauseForTransientFailure, bn as listFunctions, bt as createEndpoint, cr as updateFunction, d as parseRepeatTick, dr as updateRoute, dt as hasAutomatedVerdict, en as getRepeatingSend, er as simulateRoute, et as parseWebhookEvent, f as preparePresenceAliveEmail, fn as listDefaultNetworkAgents, fr as updateWakeAuthorization, ft as isAutomatedRejectedError, g as WaitDeadlineReached, gn as listEmailRuleResults, gr as whoami, gt as checkDefaultNetworkContactAdmission, hn as listEmailAttachmentArchiveMembers, hr as verifyAgentSignup, ht as cancelSentEmailByIdempotencyKey, i as REPEAT_EVERY_MAX_MINUTES, in as getWakeSchedule, ir as stopRepeatFromEmail, it as AUTOMATED_VALUES, j as lateMailReread, jn as listWakeDispatches, jt as deleteWakeSchedule, k as fetchEmailSearchPage, kn as listSentEmails, kt as deleteRoute, l as parseInteractionEnvelope, ln as listAgentContacts, lr as updateKey, m as repeatStopCommand, mn as listDomains, mr as verifyAgentClaim, mt as cancelSentEmail, nn as getSentEmail, nr as startAgentSignup, nt as AUTOMATED_FILTER_UNSUPPORTED_CODE, o as REPEAT_MAX_SENDS_MAX, on as leaveOrganization, or as unsetFunctionRoute, ot as assertAutomatedVerdict, p as prepareSignalEmail, pn as listDefaultNetworkMembers, pr as updateWakeSchedule, pt as addDefaultNetworkMember, qn as searchEmails, qt as getFunctionTestRunTrace, rn as getThread, rr as startCliLogin, rt as AUTOMATED_FLAG_DESCRIPTION, s as buildRepeatStopBody, sn as listActivityObjects, sr as updateDefaultNetworkMember, st as automatedRejectedError, tn as getSendFrom, tr as startAgentClaim, tt as parseFromHeader, u as parsePresenceEnvelope, un as listAgentNetworks, ur as updateRepeatingSend, v as describeApiFailure, vn as listEndpoints, vt as cliLogout, w as waitOutRetryAfter, wn as listOrganizationPeople, wt as createWakeAuthorization, x as retryTransient, xn as listGroups, xt as createFunction, yn as listFunctionLogs, yt as completeWebhookEvent, z as assertAwaitingFilterRows, zn as removeDefaultNetworkMember, zt as getAgentContactPolicy } from "../repeats-Dj_o6c-X-B7sSj0oc.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-b_0jyPIk.js";
1
+ import { $ as interactionNextActions, $t as ConnectedAgentKeyRequiredError, A as openBrowser, B as serverRelationship, Bt as runtimeSessionVariableList, C as approveThenRerunHint, Ct as sendIdentityFields, D as canOfferCopyHotkey, Dt as serializeErrorPayload, E as withApproval, Et as sentHistoryWindowStart, F as formatMailWakeLine, Ft as identitySuggestions, G as claimPendingMail, Gt as readCallerMailFor, H as wakeReadCommand, Ht as withFlagSuggestion, I as latestOwnOutbound, It as loadSkillLine, J as pendingMailPath, Jt as isEmailId, K as clearConsumedPendingMail, Kt as classificationFactLines, L as readThreadContext, Lt as currentMailSessionKey, M as bareAddress, Mt as connectNextSteps, N as describeWake, O as formatBrowserLoginInstructions, Ot as successfulSendOutcome, P as displayAddress, Pt as generatedAgentName, Q as interactionHumanLine, Qt as withAttachmentWait, R as sentInThread, Rt as detectAgentRuntime, S as STEP_UP_TOKEN_FLAG_DESCRIPTION, St as reportSendCommandResult, T as terminalApprovalIo, Tt as sendWaitClampNotice, U as wakeRecipientField, Ut as emptyEmailListHint, Vt as formatAlreadySentNotice, W as wakeRelationship, Wt as mailReach, X as recordPendingMail, Xt as ATTACHMENT_WAIT_FLAG_DESCRIPTION, Y as readPendingMail, Yt as noFactsMessage, Z as removePendingMail, Zt as ATTACHMENT_WAIT_MAX_MS, _ as surfaceUnauthorizedHint, _n as sanitizeForTerminal, _t as formatPriorRepliesCheckSkipped, a as createOperationCommand, an as resolveCliApiRequestConfig, at as MAX_SEND_WAIT_TIMEOUT_MS, b as BROWSER_FLAG_DESCRIPTION, bt as formatSendRecordFailureSummary, c as formatErrorPayload, cn as RESTRICTED_ROLE_NOTE, ct as assertValidIdempotencyKey, d as isGrantRefusal, dn as isBuiltInRoleKey, dt as checkPriorReplies, et as readEmailInteraction, f as networkErrorHint, fn as revokeUserLogin, ft as classifySendError, g as runWithTiming, gn as routeWarningLines, gt as formatDeletedEarlierSendNotice, h as refusalDetails, hn as switchCurrentOrg, ht as followUpCommandPrefix, i as TIME_FLAG_DESCRIPTION, in as refuseOrgSelectionForProfile, it as IDEMPOTENCY_KEY_FLAG_DESCRIPTION, j as explainPendingMailNotFound, jt as cliInvocation, k as listenForCopyHotkey, kt as thrownErrorExitCode, l as hasControlCharacter$1, ln as credentialsFromUserLogin, lt as buildFollowUpCommand, m as readTextFileFlag, mn as roleKeyText, mt as excludeSignalReplies, n as API_ERROR_CODES, nn as createCliApiClient, nt as replyInteractionWarning, o as extractErrorCode, on as selectedOrgFromEnv, ot as SEND_OUTCOME_HELP, p as parameterFlagName, pn as roleKeyLabel, pt as deriveSendIdempotencyKey, q as clearReadPendingMail, qt as classificationOf, r as OPERATION_PATH_FLAGS, rn as refreshStoredCliCredentials, s as extractErrorPayload, sn as CliOrgRefusedError, st as apiResultHttpStatus, t as API_BASE_URL_FLAG_DESCRIPTION, tn as createAuthenticatedCliApiClient, tt as replyExpectation, u as headerFlagName, un as fetchCliOrgs, ut as buildThrownSendFailureEnvelope, v as takesStepUp, vn as setKnownCommands, vt as formatPriorRepliesWarning, w as promptLine$2, wt as sendOutcomeExitCode, x as STEP_UP_HEADER$1, xt as priorRepliesThatWentOut, y as writeErrorWithHints, yn as operationManifest, yt as formatSendFailureSummary, z as serverMuted, zt as detectRuntimeSession } from "../api-command-D5Nbd6Pq.js";
2
+ import { $n as setMemory, $t as getOwnGrant, A as filtersFromFlags, An as listWakeAuthorizations, At as deleteWakeAuthorization, B as awaitingRejectedError, Bn as reorderRoutes, C as transientFailure, Cn as listMailboxAccess, Ct as createRoute, D as cursorFromAcceptedRows, Dn as listRoutes, E as collectNewAcceptedEmails, En as listRoles, F as AWAITING_FLAG_DESCRIPTION, Ft as downloadSentAttachmentArchiveMember, G as isAwaitingRejectedError, Gn as runWakeSchedule, Gt as getFunction, H as formatAwaitingCell, Hn as resendAgentSignupVerification, Ht as getCreditBalance, I as AWAITING_VALUES, It as downloadSentAttachmentByFilename, Jn as searchMemories, Jt as getInboxStatus, K as queryUsesAwaiting, Kt as getFunctionRouting, L as REPLY_STATE_UNSUPPORTED_CODE, Lt as getAccessMode, M as quoteDslValue, Mn as listWakeSchedules, Mt as downloadEmailAttachmentArchiveMember, N as sinceFromFlags, Nn as pollCliLogin, Nt as downloadEmailAttachmentByFilename, O as encodeReceivedAtSearchCursor, On as listSentAttachmentArchiveMembers, Ot as deleteMemory, P as sleep$3, Pn as pullWebhookEvent, Q as isEmailReceivedEvent, Qn as setFunctionSecret, Qt as getOutboundStatus, R as ReplyStateUnsupportedError, Rn as redeemCreditCode, Rt as getAccount, S as retryingOperation, Sn as listKeys, St as createKey, T as SINCE_VALUE_HELP, Tn as listRepeatingSends, Tt as createWakeSchedule, U as formatRepliesCell, Un as revokeCredential, Ut as getDefaultNetworkAgent, V as ensureSearchReportsReplyState, Vn as replyToEmail, Vt as getConversation, W as hasReplyState, Wn as rotateKey, Wt as getEmail, Xn as sendEmail, Xt as getMemory, Yn as semanticSearch, Yt as getKey, Zn as setFunctionRoute, Zt as getOrgRoutingTopology, _ as backoffDelay, _n as listEmails, _t as checkSendability, a as REPEAT_IDLE_MAX_MINUTES, ar as testFunction, at as AutomatedFilterUnsupportedError, b as pauseForTransientFailure, bn as listFunctions, bt as createEndpoint, cr as updateFunction, d as parseRepeatTick, dr as updateRoute, dt as hasAutomatedVerdict, en as getRepeatingSend, er as simulateRoute, et as parseWebhookEvent, f as preparePresenceAliveEmail, fn as listDefaultNetworkAgents, fr as updateWakeAuthorization, ft as isAutomatedRejectedError, g as WaitDeadlineReached, gn as listEmailRuleResults, gr as whoami, gt as checkDefaultNetworkContactAdmission, hn as listEmailAttachmentArchiveMembers, hr as verifyAgentSignup, ht as cancelSentEmailByIdempotencyKey, i as REPEAT_EVERY_MAX_MINUTES, in as getWakeSchedule, ir as stopRepeatFromEmail, it as AUTOMATED_VALUES, j as lateMailReread, jn as listWakeDispatches, jt as deleteWakeSchedule, k as fetchEmailSearchPage, kn as listSentEmails, kt as deleteRoute, l as parseInteractionEnvelope, ln as listAgentContacts, lr as updateKey, m as repeatStopCommand, mn as listDomains, mr as verifyAgentClaim, mt as cancelSentEmail, nn as getSentEmail, nr as startAgentSignup, nt as AUTOMATED_FILTER_UNSUPPORTED_CODE, o as REPEAT_MAX_SENDS_MAX, on as leaveOrganization, or as unsetFunctionRoute, ot as assertAutomatedVerdict, p as prepareSignalEmail, pn as listDefaultNetworkMembers, pr as updateWakeSchedule, pt as addDefaultNetworkMember, qn as searchEmails, qt as getFunctionTestRunTrace, rn as getThread, rr as startCliLogin, rt as AUTOMATED_FLAG_DESCRIPTION, s as buildRepeatStopBody, sn as listActivityObjects, sr as updateDefaultNetworkMember, st as automatedRejectedError, tn as getSendFrom, tr as startAgentClaim, tt as parseFromHeader, u as parsePresenceEnvelope, un as listAgentNetworks, ur as updateRepeatingSend, v as describeApiFailure, vn as listEndpoints, vt as cliLogout, w as waitOutRetryAfter, wn as listOrganizationPeople, wt as createWakeAuthorization, x as retryTransient, xn as listGroups, xt as createFunction, yn as listFunctionLogs, yt as completeWebhookEvent, z as assertAwaitingFilterRows, zn as removeDefaultNetworkMember, zt as getAgentContactPolicy } from "../repeats-Dj_o6c-X-C1y88ZwJ.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-B64Lgv6Z.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-BTkDAKda.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-Cqmn-k7q.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-DyGP7wDs.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-CocomDwR.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-ewPBzvjU.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-lJM0763f.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";
@@ -226,7 +226,7 @@ const openapiDocument = {
226
226
  },
227
227
  {
228
228
  "name": "Email Rule Oversight",
229
- "description": "The email rules that reach your own mailboxes, whoever wrote them, read-only, and your objections to them: asking a rule's author to turn it off. 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.",
229
+ "description": "The email rules that reach your own mailboxes, whoever wrote them, read-only, and your objections to them: asking a rule's author to turn it off, narrow it or explain it. 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.",
230
230
  "x-openapi-spec": "https://api.primitive.dev/v1/openapi/tags/email-rule-oversight"
231
231
  },
232
232
  {
@@ -22117,7 +22117,7 @@ const openapiDocument = {
22117
22117
  "/email-rules/test": { "post": {
22118
22118
  "operationId": "testEmailRule",
22119
22119
  "summary": "Test a rule against received mail",
22120
- "description": "Runs a rule over received mail and reports what it would decide for each email (matched, near_miss, no_match, unclassified, skipped or not_found), with a summary of how each top-level condition and question decided. Test an unsaved tree, or a saved rule by rule_id (its current version, as its author). It reads only mail its author can read and its scope covers. A rule you see only because it covers your own mailboxes runs as you, over only those, from the dashboard or the Primitive CLI. Without email_ids it tests the newest emails, at most 200 and none older than 30 days, plus any expected ones. Unclassified emails over 2 hours old are classified first unless classify_missing is false. It records no decision and grants nothing, and stops at about 90 seconds. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token).",
22120
+ "description": "Runs a rule over received mail and reports what it would decide for each email (matched, near_miss, no_match, unclassified, skipped or not_found), with a summary of how each top-level condition and question decided. Test an unsaved tree, a saved rule by rule_id (its current version, as its author), or a pending rule request by request_id (its rule as asked, as you, over your own mailboxes). It reads only mail its author can read and its scope covers. A rule you see only because it covers your own mailboxes runs as you, over only those, from the dashboard or the Primitive CLI. Without email_ids it tests the newest emails, at most 200 and none older than 30 days, plus any expected ones. Unclassified emails over 2 hours old are classified first unless classify_missing is false. It records no decision and grants nothing, and stops at about 90 seconds. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token).",
22121
22121
  "tags": ["Email Rules"],
22122
22122
  "security": [{ "BearerAuth": [] }],
22123
22123
  "requestBody": {
@@ -22140,7 +22140,7 @@ const openapiDocument = {
22140
22140
  }
22141
22141
  },
22142
22142
  "400": {
22143
- "description": "validation_error: give exactly one of tree and rule_id, at most 200 email_ids (with the expected emails), 1 to 100 expected emails none in both lists (or only expect.samples, up to 20), and a tree that is valid for the column contract. evaluation_scope, scope_selection and kind go only with tree. A saved rule whose current version no longer renders answers details.reason version_not_renderable; email_ids that with its saved expectations name over 200 emails, too_many_emails.",
22143
+ "description": "validation_error: give exactly one of tree, rule_id and request_id, at most 200 email_ids (with the expected emails), 1 to 100 expected emails none in both lists (or only expect.samples, up to 20), and a tree that is valid for the column contract. evaluation_scope, scope_selection and kind go only with tree. A saved rule's current version or a request's rule that no longer renders answers details.reason version_not_renderable; email_ids that with its saved expectations name over 200 emails, too_many_emails.",
22144
22144
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
22145
22145
  },
22146
22146
  "401": {
@@ -22167,11 +22167,11 @@ const openapiDocument = {
22167
22167
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
22168
22168
  },
22169
22169
  "404": {
22170
- "description": "not_found: rule_id names no rule you can see or that covers your mailboxes (details.reason rule_not_found).",
22170
+ "description": "not_found: rule_id names no rule you can see or that covers your mailboxes (details.reason rule_not_found), or request_id no rule request you can see (request_not_found).",
22171
22171
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
22172
22172
  },
22173
22173
  "409": {
22174
- "description": "email_rule_author_unresolvable: the rule cannot run as its author (for an unsaved tree or a rule covering you, the caller). details.reason is left, revoked, suspended, membership_ended, no_mail_read, no_own_mailbox, no_shareable_mailbox or no_selected_mailbox.",
22174
+ "description": "email_rule_author_unresolvable: the rule cannot run as its author (for an unsaved tree, a request or a rule covering you, the caller). details.reason is left, revoked, suspended, membership_ended, no_mail_read, no_own_mailbox, no_shareable_mailbox or no_selected_mailbox. email_rule_request_not_pending: request_id names a request already decided.",
22175
22175
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
22176
22176
  },
22177
22177
  "429": {
@@ -22319,7 +22319,7 @@ const openapiDocument = {
22319
22319
  "/email-rules/test-sample": { "post": {
22320
22320
  "operationId": "testEmailRuleOnSample",
22321
22321
  "summary": "Test a rule against a made-up email",
22322
- "description": "Reports what a rule would decide for an email you describe (sender, recipients, subject, plain text, attachment types and file names; optionally automated, from a mailing list, and a spam score), classified and decided as received mail would be. A rule reading a spam score you gave none for decides on none (unset_columns). Nothing is stored. Test an unsaved tree or a saved rule by rule_id. The answer includes what the classifier read. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token).",
22322
+ "description": "Reports what a rule would decide for an email you describe (sender, recipients, subject, plain text, attachment types and file names; optionally automated, from a mailing list, and a spam score), classified and decided as received mail would be. A rule reading a spam score you gave none for decides on none (unset_columns). Nothing is stored. Test an unsaved tree, a saved rule by rule_id, or a pending rule request by request_id (its rule as asked, as you). The answer includes what the classifier read. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token).",
22323
22323
  "tags": ["Email Rules"],
22324
22324
  "security": [{ "BearerAuth": [] }],
22325
22325
  "requestBody": {
@@ -22342,7 +22342,7 @@ const openapiDocument = {
22342
22342
  }
22343
22343
  },
22344
22344
  "400": {
22345
- "description": "validation_error: give exactly one of tree and rule_id (evaluation_scope, scope_selection and kind only with tree), an email with a sender, 1 to 50 To addresses (and up to 50 Cc), and a text body, and a tree that is valid for the column contract and within the size limits for a saved rule. A saved rule whose current version no longer renders answers details.reason version_not_renderable.",
22345
+ "description": "validation_error: give exactly one of tree, rule_id and request_id (evaluation_scope, scope_selection and kind only with tree), an email with a sender, 1 to 50 To addresses (and up to 50 Cc), and a text body, and a tree that is valid for the column contract and within the size limits for a saved rule. A saved rule's current version or a request's rule that no longer renders answers details.reason version_not_renderable. With with_protection: not_a_grant_rule, or protection_mailbox_outside_rule when the rule does not run over the first recipient.",
22346
22346
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
22347
22347
  },
22348
22348
  "401": {
@@ -22365,15 +22365,15 @@ const openapiDocument = {
22365
22365
  }
22366
22366
  },
22367
22367
  "403": {
22368
- "description": "feature_not_enabled: this organization lacks the email rules feature; permission refusals answer forbidden or grant_forbidden. email_rule_scope_not_readable: scope_selection names something you cannot read. forbidden with details.reason covering_view_only: you read this rule only in the covering view, since it decided on your mail before and covers none of your mailboxes now (details.covering_view).",
22368
+ "description": "feature_not_enabled: this organization lacks the email rules feature; permission refusals answer forbidden or grant_forbidden. email_rule_scope_not_readable: scope_selection names something you cannot read. forbidden with details.reason covering_view_only: you read this rule only in the covering view, since it decided on your mail before and covers none of your mailboxes now (details.covering_view). grant_forbidden protection_mailbox_not_read: with_protection at a mailbox you do not read in full.",
22369
22369
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
22370
22370
  },
22371
22371
  "404": {
22372
- "description": "not_found: rule_id names no rule you can see or that covers your mailboxes (details.reason rule_not_found).",
22372
+ "description": "not_found: rule_id names no rule you can see or that covers your mailboxes (details.reason rule_not_found), or request_id no rule request you can see (request_not_found).",
22373
22373
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
22374
22374
  },
22375
22375
  "409": {
22376
- "description": "email_rule_author_unresolvable: the rule cannot run as its author (for an unsaved tree or a rule covering you, you), so it would decide nothing for real. details.reason is left, revoked, suspended, membership_ended, no_mail_read, no_own_mailbox, no_shareable_mailbox or no_selected_mailbox.",
22376
+ "description": "email_rule_author_unresolvable: the rule cannot run as its author (for an unsaved tree, a request or a rule covering you, you), so it would decide nothing for real. details.reason is left, revoked, suspended, membership_ended, no_mail_read, no_own_mailbox, no_shareable_mailbox or no_selected_mailbox. email_rule_request_not_pending: request_id names a request already decided.",
22377
22377
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
22378
22378
  },
22379
22379
  "429": {
@@ -22398,6 +22398,10 @@ const openapiDocument = {
22398
22398
  }
22399
22399
  }
22400
22400
  } }
22401
+ },
22402
+ "503": {
22403
+ "description": "service_unavailable: with_protection could not read the do-not-share rules in time (protection_unavailable), or its limit could not be checked (protection_limit_unavailable).",
22404
+ "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
22401
22405
  }
22402
22406
  },
22403
22407
  "x-primitive-permission": ["mail:read"],
@@ -23502,7 +23506,7 @@ const openapiDocument = {
23502
23506
  "post": {
23503
23507
  "operationId": "createEmailRuleRequest",
23504
23508
  "summary": "Ask a member for a rule",
23505
- "description": "Asks another member of the organization for a rule over their own mail, from a compile response or a tree you wrote. Name them by user id, or by their member mailbox address, or by their verified work email if you can list members (at most 30 lookups by address an hour). Nothing is evaluated or shared until they accept, and they may change the rule first. A message (up to 500 characters, fixed once sent) tells them why you ask. At most 5 pending requests to one member and 50 in all. With members:read the answer says whether they can accept it under their role (target_can_accept, target_warning); POST /v1/email-rule-requests/target-check checks first. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token).",
23509
+ "description": "Asks another member of the organization for a rule over their own mail, from a compile response or a tree you wrote. Name them by user id, or by their member mailbox address, or by their verified work email if you can list members (at most 30 lookups by address an hour). Nothing is evaluated or shared until they accept, and they may change the rule first. A message (up to 500 characters, fixed once sent) tells them why you ask. With an Idempotency-Key, asking again for exactly what a pending request of yours to the same member asks (name, english, tree, explanation and message, naming them the same way) returns that request with existing: true (200), so a retry never asks them twice. At most 5 pending requests to one member and 50 in all. With members:read the answer says whether they can accept it under their role (target_can_accept, target_warning); POST /v1/email-rule-requests/target-check checks first. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token).",
23506
23510
  "tags": ["Email Rules"],
23507
23511
  "security": [{ "BearerAuth": [] }],
23508
23512
  "requestBody": {
@@ -23510,6 +23514,20 @@ const openapiDocument = {
23510
23514
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateEmailRuleRequestRequest" } } }
23511
23515
  },
23512
23516
  "responses": {
23517
+ "200": {
23518
+ "description": "The pending request this create matched (existing: true): no second one was made.",
23519
+ "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SuccessEnvelope" }, {
23520
+ "type": "object",
23521
+ "required": ["data"],
23522
+ "properties": { "data": { "$ref": "#/components/schemas/CreateEmailRuleRequestResult" } }
23523
+ }] } } },
23524
+ "headers": {
23525
+ "ratelimit-limit": { "$ref": "#/components/headers/ratelimit-limit" },
23526
+ "ratelimit-remaining": { "$ref": "#/components/headers/ratelimit-remaining" },
23527
+ "ratelimit-reset": { "$ref": "#/components/headers/ratelimit-reset" },
23528
+ "ratelimit-policy": { "$ref": "#/components/headers/ratelimit-policy" }
23529
+ }
23530
+ },
23513
23531
  "201": {
23514
23532
  "description": "Ask a member for a rule",
23515
23533
  "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/SuccessEnvelope" }, {
@@ -23581,18 +23599,18 @@ const openapiDocument = {
23581
23599
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
23582
23600
  }
23583
23601
  },
23584
- "x-primitive-permission": ["mail:read"],
23585
23602
  "parameters": [{
23586
23603
  "name": "Idempotency-Key",
23587
23604
  "in": "header",
23588
23605
  "required": false,
23589
- "description": "Optional, and not used to deduplicate: this operation stores no result by the key, so a retry with the same key runs the request again. Operations that need a credential refuse a key that is empty, longer than 255 characters or not printable ASCII with 400 `validation_error` and echo a valid one in the Idempotency-Key response header; operations that need none ignore it.",
23606
+ "description": "Optional. With a key, a create identical to a pending request of yours to the same member (name, english, tree, explanation and message, naming the member the same way) returns that request with existing: true (200) instead of making a second one. The key itself is not stored, so any key does this, and a create without one is never matched to an existing request. A key that is empty, longer than 255 characters or not printable ASCII is refused with 400 `validation_error`; a valid one is echoed in the Idempotency-Key response header.",
23590
23607
  "schema": {
23591
23608
  "type": "string",
23592
23609
  "minLength": 1,
23593
23610
  "maxLength": 255
23594
23611
  }
23595
- }]
23612
+ }],
23613
+ "x-primitive-permission": ["mail:read"]
23596
23614
  },
23597
23615
  "get": {
23598
23616
  "operationId": "listEmailRuleRequests",
@@ -24863,7 +24881,7 @@ const openapiDocument = {
24863
24881
  "/email-rules/covering-me": { "get": {
24864
24882
  "operationId": "listEmailRulesCoveringMe",
24865
24883
  "summary": "List the rules over your mail",
24866
- "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). While it covers you, you also see who receives what it matches (receivers): how many API keys, webhooks and shares, the member each belongs to (or the organization), and the sites the webhooks deliver to. You do not see which keys, webhooks or shares they are (no ids, names, prefixes, or URLs beyond the site), the other inboxes and domains its scope names, or its saved expectations. 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, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token). Only on your own dashboard session or the Primitive CLI.",
24884
+ "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). While it covers you, you also see who receives what it matches (receivers): how many API keys, webhooks and shares, the member each belongs to (or the organization), and the sites the webhooks deliver to. You do not see which keys, webhooks or shares they are (no ids, names, prefixes, or URLs beyond the site), the other inboxes and domains its scope names, or its saved expectations. 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. For what happened to one email of yours, every rule's decision on it and, for another member's rule covering you, who receives what it shares: GET /v1/emails/{id}/rule-results (primitive email-rules list-email-rule-results --email-id <email-id>). Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token). Only on your own dashboard session or the Primitive CLI.",
24867
24885
  "tags": ["Email Rule Oversight"],
24868
24886
  "security": [{ "BearerAuth": [] }],
24869
24887
  "parameters": [{
@@ -24961,7 +24979,7 @@ const openapiDocument = {
24961
24979
  "/email-rules/covering-me/{id}": { "get": {
24962
24980
  "operationId": "getEmailRuleCoveringMe",
24963
24981
  "summary": "Get a rule over your mail",
24964
- "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). While it covers you, you also see who receives what it matches (receivers): how many API keys, webhooks and shares, the member each belongs to (or the organization), and the sites the webhooks deliver to. You do not see which keys, webhooks or shares they are (no ids, names, prefixes, or URLs beyond the site), the other inboxes and domains its scope names, or its saved expectations. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token). Only on your own dashboard session or the Primitive CLI.",
24982
+ "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). While it covers you, you also see who receives what it matches (receivers): how many API keys, webhooks and shares, the member each belongs to (or the organization), and the sites the webhooks deliver to. You do not see which keys, webhooks or shares they are (no ids, names, prefixes, or URLs beyond the site), the other inboxes and domains its scope names, or its saved expectations. For what happened to one email of yours, every rule's decision on it and, for another member's rule covering you, who receives what it shares: GET /v1/emails/{id}/rule-results (primitive email-rules list-email-rule-results --email-id <email-id>). Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token). Only on your own dashboard session or the Primitive CLI.",
24965
24983
  "tags": ["Email Rule Oversight"],
24966
24984
  "security": [{ "BearerAuth": [] }],
24967
24985
  "parameters": [{
@@ -25013,7 +25031,7 @@ const openapiDocument = {
25013
25031
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
25014
25032
  },
25015
25033
  "404": {
25016
- "description": "not_found: no rule with this id covers your mailboxes or decided on your mail.",
25034
+ "description": "not_found: no rule with this id covers your mailboxes or decided on your mail; details.reason rule_deleted (with details.rule_name) for one deleted after you were told it covered you.",
25017
25035
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
25018
25036
  },
25019
25037
  "429": {
@@ -25139,7 +25157,7 @@ const openapiDocument = {
25139
25157
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
25140
25158
  },
25141
25159
  "404": {
25142
- "description": "not_found: no rule with this id covers your mailboxes or decided on your mail.",
25160
+ "description": "not_found: no rule with this id covers your mailboxes or decided on your mail; details.reason rule_deleted (with details.rule_name) for one deleted after you were told it covered you.",
25143
25161
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
25144
25162
  },
25145
25163
  "429": {
@@ -25267,7 +25285,7 @@ const openapiDocument = {
25267
25285
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
25268
25286
  },
25269
25287
  "404": {
25270
- "description": "not_found: no rule with this id covers your mailboxes or decided on your mail.",
25288
+ "description": "not_found: no rule with this id covers your mailboxes or decided on your mail; details.reason rule_deleted (with details.rule_name) for one deleted after you were told it covered you.",
25271
25289
  "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } }
25272
25290
  },
25273
25291
  "429": {
@@ -25300,7 +25318,7 @@ const openapiDocument = {
25300
25318
  "post": {
25301
25319
  "operationId": "createEmailRuleObjection",
25302
25320
  "summary": "Object to a rule over your mail",
25303
- "description": "Asks the author of a rule that covers one of your own mailboxes now to turn it off. Only a rule that covers you now: one you see only because it once decided on your mail cannot be objected to. An objection is seen by the member who made it, the rule's author and the organization's owners and admins. It stays pending until the rule's author accepts it, turning the rule off, or declines it, or the member who made it withdraws it, which clears its message. It never changes after that. You may have one pending objection per rule and 50 in all, and object to the same rule again only 10 minutes after you last did, whatever became of it. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token). Only on your own dashboard session or the Primitive CLI.",
25321
+ "description": "Objects to a rule that covers one of your own mailboxes now: say in the message what you ask its author, to turn it off, narrow it, or explain who receives what it matches. The author answers by accepting, which turns it off, or by declining, optionally with a reason you see; the rule keeps running unless they accept. Only a rule that covers you now: one you see only because it once decided on your mail cannot be objected to. An objection is seen by the member who made it, the rule's author and the organization's owners and admins. It stays pending until the rule's author accepts it, turning the rule off, or declines it (optionally with a reason the objector sees), or the member who made it withdraws it, which clears its message. It never changes after that. You may have one pending objection per rule and 50 in all, and object to the same rule again only 10 minutes after you last did, whatever became of it. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token). Only on your own dashboard session or the Primitive CLI.",
25304
25322
  "tags": ["Email Rule Oversight"],
25305
25323
  "security": [{ "BearerAuth": [] }],
25306
25324
  "requestBody": {
@@ -25401,7 +25419,7 @@ const openapiDocument = {
25401
25419
  "get": {
25402
25420
  "operationId": "listEmailRuleObjections",
25403
25421
  "summary": "List objections",
25404
- "description": "Objections you made and objections to rules you wrote (by default), only one of the two, or every objection you can see, newest first. An objection is seen by the member who made it, the rule's author and the organization's owners and admins. It stays pending until the rule's author accepts it, turning the rule off, or declines it, or the member who made it withdraws it, which clears its message. It never changes after that. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token). Only on your own dashboard session or the Primitive CLI.",
25422
+ "description": "Objections you made and objections to rules you wrote (by default), only one of the two, or every objection you can see, newest first. An objection is seen by the member who made it, the rule's author and the organization's owners and admins. It stays pending until the rule's author accepts it, turning the rule off, or declines it (optionally with a reason the objector sees), or the member who made it withdraws it, which clears its message. It never changes after that. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token). Only on your own dashboard session or the Primitive CLI.",
25405
25423
  "tags": ["Email Rule Oversight"],
25406
25424
  "security": [{ "BearerAuth": [] }],
25407
25425
  "parameters": [
@@ -25535,7 +25553,7 @@ const openapiDocument = {
25535
25553
  "/email-rule-objections/{id}": { "get": {
25536
25554
  "operationId": "getEmailRuleObjection",
25537
25555
  "summary": "Get an objection",
25538
- "description": "One objection you can see. An objection is seen by the member who made it, the rule's author and the organization's owners and admins. It stays pending until the rule's author accepts it, turning the rule off, or declines it, or the member who made it withdraws it, which clears its message. It never changes after that. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token). Only on your own dashboard session or the Primitive CLI.",
25556
+ "description": "One objection you can see. An objection is seen by the member who made it, the rule's author and the organization's owners and admins. It stays pending until the rule's author accepts it, turning the rule off, or declines it (optionally with a reason the objector sees), or the member who made it withdraws it, which clears its message. It never changes after that. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token). Only on your own dashboard session or the Primitive CLI.",
25539
25557
  "tags": ["Email Rule Oversight"],
25540
25558
  "security": [{ "BearerAuth": [] }],
25541
25559
  "parameters": [{
@@ -25717,7 +25735,7 @@ const openapiDocument = {
25717
25735
  "/email-rule-objections/{id}/decline": { "post": {
25718
25736
  "operationId": "declineEmailRuleObjection",
25719
25737
  "summary": "Decline an objection to your rule",
25720
- "description": "Declines a pending objection to a rule you wrote, optionally saying why; the rule stays as it is. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token). Only on your own dashboard session or the Primitive CLI.",
25738
+ "description": "Declines a pending objection to a rule you wrote, optionally saying why (reason), which the member who objected sees; the rule stays as it is. When its message asks you to narrow the rule or explain who receives it, the reason is your answer; narrow it with a new version as well if you agree. Needs mail:read, the email rules feature, and a member's own full-access credential (no API key, agent key or narrowed token). Only on your own dashboard session or the Primitive CLI.",
25721
25739
  "tags": ["Email Rule Oversight"],
25722
25740
  "security": [{ "BearerAuth": [] }],
25723
25741
  "parameters": [{
@@ -34803,7 +34821,7 @@ const openapiDocument = {
34803
34821
  "summary": "Rotate an API key",
34804
34822
  "tags": ["Credentials"],
34805
34823
  "security": [{ "BearerAuth": [] }],
34806
- "description": "Mint a successor with a new id and the same name, grant, expiry and conditions, and return its secret once. The old key keeps working for overlap_seconds, then stops: 24 hours when overlap_seconds is omitted, at most 7 days, never past its own expires_at, and at once with 0 (which is how to rotate a key whose secret leaked). previous_key_expires_at says when the old key stops. Revoking the successor during the overlap also revokes the old key when you may revoke that one too; the revoke's predecessors_left counts any left working. Rotating does not extend a key: the successor keeps the old expiry unless expires_at gives it a new one. That needs keys:manage (403 forbidden otherwise), is held to the credential policy (400 when past its maximum lifetime, with the latest expiry it allows now in the message), and someone limited to their own keys can only keep or bring it forward (403 grant_forbidden, details.reason own_key_tighten_only); the old key then never outlives the new one. The person rotating must cover the key's access (403 grant_forbidden, details.reason target_not_covered), and a key an owner holds is rotated by an owner only (403 forbidden, details.reason owner_key_rotation), since rotating hands over the new secret. The person's own Primitive CLI login needs no step-up (it acts as the person, held to the same rules) unless the organization's credential policy sets cli_writes_require_approval; the Primitive app's token is refused, even with one. Needs the organization's credential features to be enabled; while they are not, this answers 404 feature_disabled, with details.feature naming the feature. Contact Primitive to turn them on.\n\nPerson only: a dashboard session, the person's own Primitive CLI login with no step-up (unless the organization's credential policy sets cli_writes_require_approval), or the person's own OAuth token with a step-up token for purpose `keys.create` in the Primitive-Step-Up header. Without one any other OAuth token is answered 403 step_up_required, whose details carry the dashboard URL that issues it (or 403 grant_forbidden when the person's role, or the client, could not do it anyway). The person's role must hold keys:manage. API keys and agent connection keys are refused. An agent acting for the person is refused unless it carries a step-up token the person issued in the dashboard.",
34824
+ "description": "Mint a successor with a new id and the same name, grant, expiry and conditions, and return its secret once, with its name and grant so you can see they carried over. The old key keeps working for overlap_seconds, then stops: 24 hours when overlap_seconds is omitted, at most 7 days, never past its own expires_at, and at once with 0 (which is how to rotate a key whose secret leaked). previous_key_expires_at says when the old key stops. Revoking the successor during the overlap also revokes the old key when you may revoke that one too; the revoke's predecessors_left counts any left working. Rotating does not extend a key: the successor keeps the old expiry unless expires_at gives it a new one. That needs keys:manage (403 forbidden otherwise), is held to the credential policy (400 when past its maximum lifetime, with the latest expiry it allows now in the message), and someone limited to their own keys can only keep or bring it forward (403 grant_forbidden, details.reason own_key_tighten_only); the old key then never outlives the new one. The person rotating must cover the key's access (403 grant_forbidden, details.reason target_not_covered), and a key an owner holds is rotated by an owner only (403 forbidden, details.reason owner_key_rotation), since rotating hands over the new secret. The person's own Primitive CLI login needs no step-up (it acts as the person, held to the same rules) unless the organization's credential policy sets cli_writes_require_approval; the Primitive app's token is refused, even with one. Needs the organization's credential features to be enabled; while they are not, this answers 404 feature_disabled, with details.feature naming the feature. Contact Primitive to turn them on.\n\nPerson only: a dashboard session, the person's own Primitive CLI login with no step-up (unless the organization's credential policy sets cli_writes_require_approval), or the person's own OAuth token with a step-up token for purpose `keys.create` in the Primitive-Step-Up header. Without one any other OAuth token is answered 403 step_up_required, whose details carry the dashboard URL that issues it (or 403 grant_forbidden when the person's role, or the client, could not do it anyway). The person's role must hold keys:manage. API keys and agent connection keys are refused. An agent acting for the person is refused unless it carries a step-up token the person issued in the dashboard.",
34807
34825
  "x-primitive-person-only": {
34808
34826
  "access": "step_up",
34809
34827
  "step_up_purpose": "keys.create",
@@ -43237,8 +43255,14 @@ const openapiDocument = {
43237
43255
  "format": "date-time"
43238
43256
  },
43239
43257
  "raw_size_bytes": { "type": ["integer", "null"] },
43240
- "webhook_status": { "$ref": "#/components/schemas/EmailWebhookStatus" },
43241
- "webhook_attempt_count": { "type": "integer" },
43258
+ "webhook_status": {
43259
+ "$ref": "#/components/schemas/EmailWebhookStatus",
43260
+ "description": "The email's own routed delivery only (where routing sent it); a rule's deliveries never change this, and are in `rule_deliveries` on GET /emails/{id} for the mailbox's owner. Its delivery state. `pending` with 0 attempts can also mean no route webhook took it."
43261
+ },
43262
+ "webhook_attempt_count": {
43263
+ "type": "integer",
43264
+ "description": "The email's own routed delivery only (where routing sent it); a rule's deliveries never change this, and are in `rule_deliveries` on GET /emails/{id} for the mailbox's owner. Its attempts."
43265
+ },
43242
43266
  "thread_id": {
43243
43267
  "type": ["string", "null"],
43244
43268
  "format": "uuid",
@@ -43736,17 +43760,31 @@ const openapiDocument = {
43736
43760
  "format": "date-time"
43737
43761
  },
43738
43762
  "rejection_reason": { "type": ["string", "null"] },
43739
- "webhook_status": { "$ref": "#/components/schemas/EmailWebhookStatus" },
43740
- "webhook_attempt_count": { "type": "integer" },
43763
+ "webhook_status": {
43764
+ "$ref": "#/components/schemas/EmailWebhookStatus",
43765
+ "description": "The email's own routed delivery only (where routing sent it); a rule's deliveries never change this, and are in `rule_deliveries` on GET /emails/{id} for the mailbox's owner. Its delivery state. `pending` with 0 attempts can also mean no route webhook took it."
43766
+ },
43767
+ "webhook_attempt_count": {
43768
+ "type": "integer",
43769
+ "description": "The email's own routed delivery only (where routing sent it); a rule's deliveries never change this, and are in `rule_deliveries` on GET /emails/{id} for the mailbox's owner. Its attempts."
43770
+ },
43741
43771
  "webhook_last_attempt_at": {
43742
43772
  "type": ["string", "null"],
43743
- "format": "date-time"
43773
+ "format": "date-time",
43774
+ "description": "The email's own routed delivery only (where routing sent it); a rule's deliveries never change this, and are in `rule_deliveries` on GET /emails/{id} for the mailbox's owner. Its last attempt."
43775
+ },
43776
+ "webhook_last_status_code": {
43777
+ "type": ["integer", "null"],
43778
+ "description": "The email's own routed delivery only (where routing sent it); a rule's deliveries never change this, and are in `rule_deliveries` on GET /emails/{id} for the mailbox's owner. What it last answered."
43779
+ },
43780
+ "webhook_last_error": {
43781
+ "type": ["string", "null"],
43782
+ "description": "The email's own routed delivery only (where routing sent it); a rule's deliveries never change this, and are in `rule_deliveries` on GET /emails/{id} for the mailbox's owner. Its last error."
43744
43783
  },
43745
- "webhook_last_status_code": { "type": ["integer", "null"] },
43746
- "webhook_last_error": { "type": ["string", "null"] },
43747
43784
  "webhook_fired_at": {
43748
43785
  "type": ["string", "null"],
43749
- "format": "date-time"
43786
+ "format": "date-time",
43787
+ "description": "The email's own routed delivery only (where routing sent it); a rule's deliveries never change this, and are in `rule_deliveries` on GET /emails/{id} for the mailbox's owner. When it was delivered."
43750
43788
  },
43751
43789
  "smtp_helo": { "type": ["string", "null"] },
43752
43790
  "smtp_mail_from": {
@@ -44040,6 +44078,81 @@ const openapiDocument = {
44040
44078
  }
44041
44079
  }
44042
44080
  },
44081
+ "rule_deliveries": {
44082
+ "type": ["object", "null"],
44083
+ "description": "Where Email Rules delivered this email by webhook, for the owner of the mailbox it is at, on their own dashboard session or the Primitive CLI. Null for everyone else, and when it could not be read in time. A key reading it through a rule is not a delivery.",
44084
+ "required": [
44085
+ "rules",
44086
+ "hidden",
44087
+ "complete"
44088
+ ],
44089
+ "properties": {
44090
+ "rules": {
44091
+ "type": "array",
44092
+ "description": "Each rule over your mail that queued a webhook delivery of this email, newest rule first.",
44093
+ "items": {
44094
+ "type": "object",
44095
+ "required": [
44096
+ "rule_id",
44097
+ "name",
44098
+ "delivered",
44099
+ "pending",
44100
+ "failed",
44101
+ "not_sent",
44102
+ "hosts",
44103
+ "hosts_not_listed"
44104
+ ],
44105
+ "properties": {
44106
+ "rule_id": {
44107
+ "type": "string",
44108
+ "format": "uuid",
44109
+ "description": "The rule. A webhook sent it through several rules counts under one."
44110
+ },
44111
+ "name": { "type": "string" },
44112
+ "delivered": {
44113
+ "type": "integer",
44114
+ "minimum": 0,
44115
+ "description": "Webhooks it was delivered to."
44116
+ },
44117
+ "pending": {
44118
+ "type": "integer",
44119
+ "minimum": 0,
44120
+ "description": "Webhooks still owed it."
44121
+ },
44122
+ "failed": {
44123
+ "type": "integer",
44124
+ "minimum": 0,
44125
+ "description": "Webhooks whose attempts gave up."
44126
+ },
44127
+ "not_sent": {
44128
+ "type": "integer",
44129
+ "minimum": 0,
44130
+ "description": "Webhooks it was not sent to after all."
44131
+ },
44132
+ "hosts": {
44133
+ "type": "array",
44134
+ "items": { "type": "string" },
44135
+ "description": "The sites it was delivered to at the time, named as the covering view names sites; they may differ from the rule's current receivers there."
44136
+ },
44137
+ "hosts_not_listed": {
44138
+ "type": "integer",
44139
+ "minimum": 0,
44140
+ "description": "Sites past the listed ones."
44141
+ }
44142
+ }
44143
+ }
44144
+ },
44145
+ "hidden": {
44146
+ "type": "integer",
44147
+ "minimum": 0,
44148
+ "description": "Rules that queued a delivery of it that are not listed: they do not cover your mailboxes now, or are past the 50 one answer judges."
44149
+ },
44150
+ "complete": {
44151
+ "type": "boolean",
44152
+ "description": "False when a delivery may be missing: the email is older than 14 days, or it has more deliveries or rules than one answer reads."
44153
+ }
44154
+ }
44155
+ },
44043
44156
  "from_name": {
44044
44157
  "type": ["string", "null"],
44045
44158
  "description": "Display name from the `From:` header, decoded for display: RFC 2047 encoded words are decoded in their declared charset and folded lines are joined (e.g. `Dana Rúiz` for `=?UTF-8?Q?Dana_R=C3=BAiz?= <dana@example.com>`). Null when the header carries no display name. For display only: identify the sender by `from_email`, never by this name, which the sender chooses freely."
@@ -45052,7 +45165,7 @@ const openapiDocument = {
45052
45165
  "type": "object",
45053
45166
  "additionalProperties": false,
45054
45167
  "required": ["url"],
45055
- "description": "One-click unsubscribe for the message. Primitive writes a `List-Unsubscribe` header naming `url` (and `mailto` when given) and, unless `one_click` is false, `List-Unsubscribe-Post: List-Unsubscribe=One-Click` (RFC 8058), and DKIM-signs both. A receiver that offers one-click unsubscribe sends an HTTPS POST to `url` with the form body `List-Unsubscribe=One-Click`; your endpoint records the unsubscribe. Every recipient of the message gets the same `url`, so send one message per recipient when the URL identifies who to unsubscribe. The `headers` map refuses both header names, so this field is the only way to set them, and the headers it adds count toward the 25 entries `headers` may hold. A field whose rendered `List-Unsubscribe` would pass 980 characters is refused. Not accepted on a repeating send.",
45168
+ "description": "One-click unsubscribe for the message. Primitive writes a `List-Unsubscribe` header naming `url` (and `mailto` when given) and, unless `one_click` is false, `List-Unsubscribe-Post: List-Unsubscribe=One-Click` (RFC 8058), and DKIM-signs both. A receiver that offers one-click unsubscribe sends an HTTPS POST to `url` with the form body `List-Unsubscribe=One-Click`; your endpoint records the unsubscribe. Every recipient of a message would get the same `url`, so another recipient could unsubscribe whoever it identifies: a send with `unsubscribe` must have exactly one recipient, one entry across `to`, `cc` and `bcc` (an address given twice counts twice), and a send to more is refused with a `validation_error`. Send one message per recipient, for example with `POST /v1/send-mail/batch`. The `headers` map refuses both header names, so this field is the only way to set them, and the headers it adds count toward the 25 entries `headers` may hold. A field whose rendered `List-Unsubscribe` would pass 980 characters is refused. Not accepted on a repeating send.",
45056
45169
  "properties": {
45057
45170
  "url": {
45058
45171
  "type": "string",
@@ -46124,7 +46237,7 @@ const openapiDocument = {
46124
46237
  "type": "object",
46125
46238
  "additionalProperties": false,
46126
46239
  "required": ["url"],
46127
- "description": "One-click unsubscribe for the message. Primitive writes a `List-Unsubscribe` header naming `url` (and `mailto` when given) and, unless `one_click` is false, `List-Unsubscribe-Post: List-Unsubscribe=One-Click` (RFC 8058), and DKIM-signs both. A receiver that offers one-click unsubscribe sends an HTTPS POST to `url` with the form body `List-Unsubscribe=One-Click`; your endpoint records the unsubscribe. Every recipient of the message gets the same `url`, so send one message per recipient when the URL identifies who to unsubscribe. The `headers` map refuses both header names, so this field is the only way to set them, and the headers it adds count toward the 25 entries `headers` may hold. A field whose rendered `List-Unsubscribe` would pass 980 characters is refused. Not accepted on a repeating send.",
46240
+ "description": "One-click unsubscribe for the message. Primitive writes a `List-Unsubscribe` header naming `url` (and `mailto` when given) and, unless `one_click` is false, `List-Unsubscribe-Post: List-Unsubscribe=One-Click` (RFC 8058), and DKIM-signs both. A receiver that offers one-click unsubscribe sends an HTTPS POST to `url` with the form body `List-Unsubscribe=One-Click`; your endpoint records the unsubscribe. Every recipient of a message would get the same `url`, so another recipient could unsubscribe whoever it identifies: a reply with `unsubscribe` must go to the one address it answers, and one with `reply_all` that adds a cc is refused with a `validation_error`. The `headers` map refuses both header names, so this field is the only way to set them, and the headers it adds count toward the 25 entries `headers` may hold. A field whose rendered `List-Unsubscribe` would pass 980 characters is refused. Not accepted on a repeating send.",
46128
46241
  "properties": {
46129
46242
  "url": {
46130
46243
  "type": "string",
@@ -51275,7 +51388,7 @@ const openapiDocument = {
51275
51388
  "ended_at": {
51276
51389
  "type": ["string", "null"],
51277
51390
  "format": "date-time",
51278
- "description": "When it was deleted, replaced or revoked, when an API key expired, when a repeating send stopped, or when a rule request or objection was decided (accepted, declined or withdrawn); null otherwise, as on every coverage notice."
51391
+ "description": "When it was deleted, replaced or revoked, when an API key expired, when a repeating send stopped, or when a rule request or objection was decided (accepted, declined or withdrawn); null otherwise, as on every coverage notice (rule_now marks one whose rule was deleted)."
51279
51392
  },
51280
51393
  "owned_now": {
51281
51394
  "type": "string",
@@ -51305,10 +51418,15 @@ const openapiDocument = {
51305
51418
  ]
51306
51419
  },
51307
51420
  "rule_id": {
51308
- "description": "For email_rule_coverage, always: the rule it is about, since names need not be unique (for pending, the same as id). GET /v1/email-rules/covering-me/{rule_id} shows the rule while it covers you, or as it last decided on your mail; otherwise it answers not_found.",
51421
+ "description": "For email_rule_coverage, always: the rule it is about, since names need not be unique (for pending, the same as id). GET /v1/email-rules/covering-me/{rule_id} shows the rule while it covers you, or as it last decided on your mail; otherwise it answers not_found, with details.reason rule_deleted once a rule you were told of is deleted.",
51309
51422
  "type": "string",
51310
51423
  "format": "uuid"
51311
51424
  },
51425
+ "rule_now": {
51426
+ "description": "For email_rule_coverage: deleted once the rule it is about has been deleted. Left out while it exists, or when that could not be checked.",
51427
+ "type": "string",
51428
+ "enum": ["deleted"]
51429
+ },
51312
51430
  "receivers_change": {
51313
51431
  "description": "For a receivers_changed notice: who received the rule's matches before and after, in totals. They can be equal when only an owner or a webhook site changed; covering-me shows them by owner. A rotated key counts once here while the old one still works; covering-me counts both.",
51314
51432
  "type": "object",
@@ -51417,7 +51535,7 @@ const openapiDocument = {
51417
51535
  "as_of": {
51418
51536
  "type": ["string", "null"],
51419
51537
  "format": "date-time",
51420
- "description": "With relation=concerning only: about when the notices last looked at your organization; null if never or unread. Coverage since may have no notice yet."
51538
+ "description": "With relation=concerning only: about when the notices last looked at your organization; null if never or unread. Coverage since may have no notice yet. They look only while one of its rules could cover someone, so this stops moving while none could."
51421
51539
  },
51422
51540
  "pending_complete": {
51423
51541
  "description": "With relation=concerning, on the first page only: whether the check for rules that started covering you without their start notice (state pending, listed ahead of the notices and beyond limit) was finished. false: some may be missing. Absent where there is nothing to check.",
@@ -51631,6 +51749,44 @@ const openapiDocument = {
51631
51749
  },
51632
51750
  "required": ["checked", "matched"]
51633
51751
  },
51752
+ "EmailRuleScopeUsed": {
51753
+ "type": "object",
51754
+ "properties": {
51755
+ "evaluation_scope": {
51756
+ "type": "string",
51757
+ "enum": [
51758
+ "author",
51759
+ "own_mailboxes",
51760
+ "selected"
51761
+ ],
51762
+ "description": "author, own_mailboxes or selected, as a rule's evaluation_scope."
51763
+ },
51764
+ "scope_selection": {
51765
+ "type": ["object", "null"],
51766
+ "properties": {
51767
+ "addresses": {
51768
+ "maxItems": 100,
51769
+ "type": "array",
51770
+ "items": {
51771
+ "type": "string",
51772
+ "maxLength": 320
51773
+ }
51774
+ },
51775
+ "domains": {
51776
+ "maxItems": 50,
51777
+ "type": "array",
51778
+ "items": {
51779
+ "type": "string",
51780
+ "maxLength": 253
51781
+ }
51782
+ }
51783
+ },
51784
+ "required": ["addresses", "domains"],
51785
+ "description": "What a selected scope names; null for any other."
51786
+ }
51787
+ },
51788
+ "required": ["evaluation_scope", "scope_selection"]
51789
+ },
51634
51790
  "EmailRuleScopeSelection": {
51635
51791
  "type": "object",
51636
51792
  "properties": {
@@ -51725,6 +51881,10 @@ const openapiDocument = {
51725
51881
  "description": "For a grant rule with questions, breadth counted on its conditions alone: the emails its questions are asked about. Null for any other rule, or when not counted in full (as breadth).",
51726
51882
  "anyOf": [{ "$ref": "#/components/schemas/EmailRuleBreadth" }, { "type": "null" }]
51727
51883
  },
51884
+ "breadth_scope": {
51885
+ "description": "The scope breadth and conditions_breadth are counted over: evaluation_scope as sent, by default own_mailboxes. Not the saved rule's scope, which a write sets with evaluation_scope; writes ignore this, as they ignore breadth.",
51886
+ "$ref": "#/components/schemas/EmailRuleScopeUsed"
51887
+ },
51728
51888
  "sql": {
51729
51889
  "description": "Present only when include_sql was true.",
51730
51890
  "type": "object",
@@ -52010,7 +52170,7 @@ const openapiDocument = {
52010
52170
  "type": "object",
52011
52171
  "properties": {
52012
52172
  "tree": {
52013
- "description": "An unsaved rule tree, as POST /email-rules/compile returned it or written by hand. Give tree or rule_id, not both.",
52173
+ "description": "An unsaved rule tree, as POST /email-rules/compile returned it or written by hand. Give one of tree, rule_id and request_id.",
52014
52174
  "$ref": "#/components/schemas/EmailRuleTreeInput"
52015
52175
  },
52016
52176
  "evaluation_scope": {
@@ -52028,8 +52188,13 @@ const openapiDocument = {
52028
52188
  "type": "string",
52029
52189
  "format": "uuid"
52030
52190
  },
52191
+ "request_id": {
52192
+ "description": "A pending rule request you can see: its rule as asked, tested as you over your own mailboxes (what accepting would share, for the member asked). Give one of tree, rule_id and request_id.",
52193
+ "type": "string",
52194
+ "format": "uuid"
52195
+ },
52031
52196
  "kind": {
52032
- "description": "For an unsaved tree: do_not_share tests it as a rule that blocks sharing, so an email it cannot decide counts as matched. A saved rule uses its own.",
52197
+ "description": "For an unsaved tree: do_not_share tests it as a rule that blocks sharing, so an email it cannot decide counts as matched. A saved rule or a request uses its own.",
52033
52198
  "type": "string",
52034
52199
  "enum": ["grant", "do_not_share"]
52035
52200
  },
@@ -52098,6 +52263,20 @@ const openapiDocument = {
52098
52263
  "type": "integer",
52099
52264
  "minimum": 0,
52100
52265
  "description": "The most emails the recent window holds: 200, less one place per expected email."
52266
+ },
52267
+ "scope": {
52268
+ "description": "The scope the test ran with: a saved rule's as stored, over its author's mail (GET /email-rules/{id}/scope: what it reaches now), or a tree's as sent, over yours (by default own_mailboxes). A rule covering you, tested as you: own_mailboxes, your mailboxes it covers.",
52269
+ "$ref": "#/components/schemas/EmailRuleScopeUsed"
52270
+ },
52271
+ "oldest_at": {
52272
+ "type": ["string", "null"],
52273
+ "format": "date-time",
52274
+ "description": "When the oldest email tested arrived, expected ones included; null when none was. The window is the newest 200 the scope reaches, so a narrower scope reaches further back: compare counts only over the same scope and span."
52275
+ },
52276
+ "newest_at": {
52277
+ "type": ["string", "null"],
52278
+ "format": "date-time",
52279
+ "description": "When the newest email tested arrived; null when none was."
52101
52280
  }
52102
52281
  },
52103
52282
  "required": [
@@ -52627,7 +52806,7 @@ const openapiDocument = {
52627
52806
  "type": "object",
52628
52807
  "properties": {
52629
52808
  "tree": {
52630
- "description": "An unsaved rule tree, as POST /email-rules/compile returned it or written by hand. Give tree or rule_id, not both.",
52809
+ "description": "An unsaved rule tree, as POST /email-rules/compile returned it or written by hand. Give one of tree, rule_id and request_id.",
52631
52810
  "$ref": "#/components/schemas/EmailRuleTreeInput"
52632
52811
  },
52633
52812
  "english": {
@@ -52657,7 +52836,7 @@ const openapiDocument = {
52657
52836
  "format": "uuid"
52658
52837
  },
52659
52838
  "kind": {
52660
- "description": "For an unsaved tree: do_not_share tests it as a rule that blocks sharing, so an email it cannot decide counts as matched. A saved rule uses its own.",
52839
+ "description": "For an unsaved tree: do_not_share tests it as a rule that blocks sharing, so an email it cannot decide counts as matched. A saved rule or a request uses its own.",
52661
52840
  "type": "string",
52662
52841
  "enum": ["grant", "do_not_share"]
52663
52842
  },
@@ -52745,7 +52924,7 @@ const openapiDocument = {
52745
52924
  "type": "object",
52746
52925
  "properties": {
52747
52926
  "tree": {
52748
- "description": "An unsaved rule tree, as POST /email-rules/compile returned it or written by hand. Give tree or rule_id, not both.",
52927
+ "description": "An unsaved rule tree, as POST /email-rules/compile returned it or written by hand. Give one of tree, rule_id and request_id.",
52749
52928
  "$ref": "#/components/schemas/EmailRuleTreeInput"
52750
52929
  },
52751
52930
  "evaluation_scope": {
@@ -52763,8 +52942,13 @@ const openapiDocument = {
52763
52942
  "type": "string",
52764
52943
  "format": "uuid"
52765
52944
  },
52945
+ "request_id": {
52946
+ "description": "A pending rule request you can see: its rule as asked, tested as you over your own mailboxes (what accepting would share, for the member asked). Give one of tree, rule_id and request_id.",
52947
+ "type": "string",
52948
+ "format": "uuid"
52949
+ },
52766
52950
  "kind": {
52767
- "description": "For an unsaved tree: do_not_share tests it as a rule that blocks sharing, so an email it cannot decide counts as matched. A saved rule uses its own.",
52951
+ "description": "For an unsaved tree: do_not_share tests it as a rule that blocks sharing, so an email it cannot decide counts as matched. A saved rule or a request uses its own.",
52768
52952
  "type": "string",
52769
52953
  "enum": ["grant", "do_not_share"]
52770
52954
  },
@@ -52863,6 +53047,10 @@ const openapiDocument = {
52863
53047
  ],
52864
53048
  "additionalProperties": false,
52865
53049
  "description": "A made-up received email. Nothing about it is stored."
53050
+ },
53051
+ "with_protection": {
53052
+ "description": "With true, a grant rule that matches is also judged against the active do-not-share rules over the first recipient's mailbox, which you must read in full and the rule must run over; see protection. Limited to 20 an hour per member.",
53053
+ "type": "boolean"
52866
53054
  }
52867
53055
  },
52868
53056
  "required": ["email"],
@@ -52992,6 +53180,59 @@ const openapiDocument = {
52992
53180
  "required": ["value", "confidence"]
52993
53181
  },
52994
53182
  "description": "What the classifier read from the email, by fact: its value and confidence."
53183
+ },
53184
+ "protection": {
53185
+ "description": "With with_protection: whether a match would be shared. Nothing is stored.",
53186
+ "type": "object",
53187
+ "properties": {
53188
+ "mailbox": {
53189
+ "type": "string",
53190
+ "description": "The mailbox judged: the first recipient."
53191
+ },
53192
+ "outcome": {
53193
+ "type": "string",
53194
+ "enum": [
53195
+ "shared",
53196
+ "withheld",
53197
+ "not_matched"
53198
+ ],
53199
+ "description": "not_matched: the rule did not match, so nothing would be shared and no do-not-share rule was judged."
53200
+ },
53201
+ "withheld_by": {
53202
+ "type": "array",
53203
+ "items": {
53204
+ "type": "object",
53205
+ "properties": {
53206
+ "id": {
53207
+ "type": "string",
53208
+ "format": "uuid"
53209
+ },
53210
+ "name": { "type": "string" },
53211
+ "reason": {
53212
+ "type": "string",
53213
+ "enum": ["matched", "undecided"]
53214
+ }
53215
+ },
53216
+ "required": [
53217
+ "id",
53218
+ "name",
53219
+ "reason"
53220
+ ]
53221
+ },
53222
+ "description": "Do-not-share rules you can see that would keep it from being shared. undecided: left undecided as real mail would leave it, or not reached by this test (past 50 rules, 10 rules' questions, or the time limit); it is held back either way."
53223
+ },
53224
+ "withheld_by_hidden": {
53225
+ "type": "integer",
53226
+ "minimum": 0,
53227
+ "description": "Rules you cannot see that would."
53228
+ }
53229
+ },
53230
+ "required": [
53231
+ "mailbox",
53232
+ "outcome",
53233
+ "withheld_by",
53234
+ "withheld_by_hidden"
53235
+ ]
52995
53236
  }
52996
53237
  },
52997
53238
  "required": [
@@ -53069,7 +53310,7 @@ const openapiDocument = {
53069
53310
  "minimum": 0
53070
53311
  },
53071
53312
  "objection_notice": {
53072
- "description": "With pending_objections above 0: that members asked you to turn it off, and how to answer.",
53313
+ "description": "With pending_objections above 0: that members objected (each message says what they ask: to turn it off, narrow it or explain it), and how to answer.",
53073
53314
  "type": "string"
53074
53315
  },
53075
53316
  "created_at": {
@@ -53089,6 +53330,10 @@ const openapiDocument = {
53089
53330
  "type": "array",
53090
53331
  "items": { "$ref": "#/components/schemas/EmailRuleScopeWarning" }
53091
53332
  },
53333
+ "do_not_share_note": {
53334
+ "description": "On a grant rule's create answer: that active do-not-share rules reaching an email run first: one that matches it keeps it from being shared through this rule, and one that cannot decide it holds it back while it is decided again for up to a day; it is shared through this rule only if none of them then matches it.",
53335
+ "type": "string"
53336
+ },
53092
53337
  "expectations": {
53093
53338
  "description": "Its saved expectations, each list by email id, as stored: on every create, and on an update that set or removed them.",
53094
53339
  "type": "object",
@@ -53459,6 +53704,10 @@ const openapiDocument = {
53459
53704
  "conditions_breadth": {
53460
53705
  "description": "Ignored.",
53461
53706
  "anyOf": [{ "$ref": "#/components/schemas/EmailRuleBreadth" }, { "type": "null" }]
53707
+ },
53708
+ "breadth_scope": {
53709
+ "description": "Ignored (the compile answer's breadth_scope): set a rule's scope with evaluation_scope.",
53710
+ "$ref": "#/components/schemas/EmailRuleScopeUsed"
53462
53711
  }
53463
53712
  },
53464
53713
  "required": [
@@ -53534,7 +53783,7 @@ const openapiDocument = {
53534
53783
  "minimum": 0
53535
53784
  },
53536
53785
  "objection_notice": {
53537
- "description": "With pending_objections above 0: that members asked you to turn it off, and how to answer.",
53786
+ "description": "With pending_objections above 0: that members objected (each message says what they ask: to turn it off, narrow it or explain it), and how to answer.",
53538
53787
  "type": "string"
53539
53788
  },
53540
53789
  "created_at": {
@@ -53641,7 +53890,7 @@ const openapiDocument = {
53641
53890
  "minimum": 0
53642
53891
  },
53643
53892
  "objection_notice": {
53644
- "description": "With pending_objections above 0: that members asked you to turn it off, and how to answer.",
53893
+ "description": "With pending_objections above 0: that members objected (each message says what they ask: to turn it off, narrow it or explain it), and how to answer.",
53645
53894
  "type": "string"
53646
53895
  },
53647
53896
  "created_at": {
@@ -53764,6 +54013,10 @@ const openapiDocument = {
53764
54013
  "description": "Ignored.",
53765
54014
  "anyOf": [{ "$ref": "#/components/schemas/EmailRuleBreadth" }, { "type": "null" }]
53766
54015
  },
54016
+ "breadth_scope": {
54017
+ "description": "Ignored (the compile answer's breadth_scope): set a rule's scope with evaluation_scope.",
54018
+ "$ref": "#/components/schemas/EmailRuleScopeUsed"
54019
+ },
53767
54020
  "kind": {
53768
54021
  "description": "Must be the rule's own (400 kind_mismatch).",
53769
54022
  "type": "string",
@@ -54328,9 +54581,10 @@ const openapiDocument = {
54328
54581
  "enum": [
54329
54582
  "draft",
54330
54583
  "created_after_email",
54584
+ "outside_scope",
54331
54585
  null
54332
54586
  ],
54333
- "description": "What is known about a rule with no result on this email. draft: the rule is a draft now. created_after_email: the rule was created after the email arrived. Null when it has a result, or when nothing is known."
54587
+ "description": "What is known about a rule with no result on this email. draft: the rule is a draft now. created_after_email: the rule was created after the email arrived. outside_scope: the mailbox this email is in is outside what its scope names (its author's own mailboxes, its selection, or all its author reads now), so it does not decide on it. Null when it has a result, or when nothing is known (it may not have decided yet)."
54334
54588
  },
54335
54589
  "author_left": {
54336
54590
  "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.",
@@ -54662,6 +54916,10 @@ const openapiDocument = {
54662
54916
  "description": "Ignored.",
54663
54917
  "anyOf": [{ "$ref": "#/components/schemas/EmailRuleBreadth" }, { "type": "null" }]
54664
54918
  },
54919
+ "breadth_scope": {
54920
+ "description": "Ignored (the compile answer's breadth_scope): set a rule's scope with evaluation_scope.",
54921
+ "$ref": "#/components/schemas/EmailRuleScopeUsed"
54922
+ },
54665
54923
  "kind": {
54666
54924
  "description": "Only grant.",
54667
54925
  "type": "string",
@@ -54758,7 +55016,7 @@ const openapiDocument = {
54758
55016
  "type": ["boolean", "null"]
54759
55017
  },
54760
55018
  "notice": {
54761
- "description": "For the member asked, while pending: what the rule actually does (server_explanation), Primitive's warnings, then what accepting would share. For the member who asked, once accepted with changes: that the request is not what is shared. Else null.",
55019
+ "description": "For the member asked, while pending: what the rule actually does (server_explanation), Primitive's warnings, what accepting would share, then where to see what becomes of one email (rule-results). For the member who asked, once accepted with changes: that the request is not what is shared. Else null.",
54762
55020
  "type": ["string", "null"]
54763
55021
  },
54764
55022
  "target_can_accept": {
@@ -54768,6 +55026,11 @@ const openapiDocument = {
54768
55026
  "target_warning": {
54769
55027
  "description": "Why the member asked cannot accept it yet, naming the permission their role lacks. The request is still sent. Null when they can, or when target_can_accept is null.",
54770
55028
  "type": ["string", "null"]
55029
+ },
55030
+ "existing": {
55031
+ "description": "Present, as true, when the create carried an Idempotency-Key and you already had a pending request to this member asking exactly this (name, english, tree, explanation and message, naming the member the same way): that request is returned (200), and no second one is made or sent.",
55032
+ "type": "boolean",
55033
+ "const": true
54771
55034
  }
54772
55035
  },
54773
55036
  "required": [
@@ -54933,7 +55196,7 @@ const openapiDocument = {
54933
55196
  "type": ["boolean", "null"]
54934
55197
  },
54935
55198
  "notice": {
54936
- "description": "For the member asked, while pending: what the rule actually does (server_explanation), Primitive's warnings, then what accepting would share. For the member who asked, once accepted with changes: that the request is not what is shared. Else null.",
55199
+ "description": "For the member asked, while pending: what the rule actually does (server_explanation), Primitive's warnings, what accepting would share, then where to see what becomes of one email (rule-results). For the member who asked, once accepted with changes: that the request is not what is shared. Else null.",
54937
55200
  "type": ["string", "null"]
54938
55201
  }
54939
55202
  },
@@ -55047,7 +55310,7 @@ const openapiDocument = {
55047
55310
  "minimum": 0
55048
55311
  },
55049
55312
  "objection_notice": {
55050
- "description": "With pending_objections above 0: that members asked you to turn it off, and how to answer.",
55313
+ "description": "With pending_objections above 0: that members objected (each message says what they ask: to turn it off, narrow it or explain it), and how to answer.",
55051
55314
  "type": "string"
55052
55315
  },
55053
55316
  "created_at": {
@@ -55293,6 +55556,10 @@ const openapiDocument = {
55293
55556
  "description": "Ignored.",
55294
55557
  "anyOf": [{ "$ref": "#/components/schemas/EmailRuleBreadth" }, { "type": "null" }]
55295
55558
  },
55559
+ "breadth_scope": {
55560
+ "description": "Ignored (the compile answer's breadth_scope): set a rule's scope with evaluation_scope.",
55561
+ "$ref": "#/components/schemas/EmailRuleScopeUsed"
55562
+ },
55296
55563
  "kind": {
55297
55564
  "description": "Only grant.",
55298
55565
  "type": "string",
@@ -55315,7 +55582,7 @@ const openapiDocument = {
55315
55582
  "rule": { "$ref": "#/components/schemas/EmailRuleWithVersion" },
55316
55583
  "share": { "$ref": "#/components/schemas/EmailRuleShare" },
55317
55584
  "notice": {
55318
- "description": "What is now shared, in words. When you changed the rule and it can now match mail the request left out by who it was sent to (such as mail where an address is only copied), that comes first.",
55585
+ "description": "What is now shared, in words. When you changed the rule and it can now match mail the request left out by who it was sent to (such as mail where an address is only copied), that comes first; when you changed its english, tree or explanation (edited_on_accept; a new name alone is no change), that rule.current is what you agreed to and request what was asked.",
55319
55586
  "type": "string"
55320
55587
  }
55321
55588
  },
@@ -55666,6 +55933,10 @@ const openapiDocument = {
55666
55933
  "enum": ["grant", "do_not_share"],
55667
55934
  "description": "grant: what it matches can be shared. do_not_share: it blocks sharing what it matches."
55668
55935
  },
55936
+ "do_not_share_note": {
55937
+ "description": "On a grant rule: that the active do-not-share rules over an email run first, keeping from it what they match and holding back what they cannot decide, which is decided again for up to a day and shared only if none of them then matches it.",
55938
+ "type": "string"
55939
+ },
55669
55940
  "author": {
55670
55941
  "description": "Who wrote it.",
55671
55942
  "$ref": "#/components/schemas/EmailRuleCoveringAuthor"
@@ -55755,6 +56026,10 @@ const openapiDocument = {
55755
56026
  "enum": ["grant", "do_not_share"],
55756
56027
  "description": "grant: what it matches can be shared. do_not_share: it blocks sharing what it matches."
55757
56028
  },
56029
+ "do_not_share_note": {
56030
+ "description": "On a grant rule: that the active do-not-share rules over an email run first, keeping from it what they match and holding back what they cannot decide, which is decided again for up to a day and shared only if none of them then matches it.",
56031
+ "type": "string"
56032
+ },
55758
56033
  "author": {
55759
56034
  "description": "Who wrote it.",
55760
56035
  "$ref": "#/components/schemas/EmailRuleCoveringAuthor"
@@ -55978,10 +56253,13 @@ const openapiDocument = {
55978
56253
  "description": "Whether it is to a rule you wrote, in your current membership."
55979
56254
  },
55980
56255
  "message": {
55981
- "description": "Why the objector objects; null when none was given, or once withdrawn.",
56256
+ "description": "Why they object and what they ask (to turn the rule off, narrow it, or explain who receives it); null when none was given, or once withdrawn.",
56257
+ "type": ["string", "null"]
56258
+ },
56259
+ "decline_reason": {
56260
+ "description": "The author's answer when declining, which the objector sees; null when none was given.",
55982
56261
  "type": ["string", "null"]
55983
56262
  },
55984
- "decline_reason": { "type": ["string", "null"] },
55985
56263
  "created_at": {
55986
56264
  "type": "string",
55987
56265
  "format": "date-time"
@@ -56041,7 +56319,7 @@ const openapiDocument = {
56041
56319
  "type": ["string", "null"],
56042
56320
  "minLength": 1,
56043
56321
  "maxLength": 500,
56044
- "description": "Why you object, up to 500 characters; null or absent for none. The rule's author and the organization's owners and admins see it while it stands; withdrawing clears it."
56322
+ "description": "Why you object and what you ask, up to 500 characters: to turn the rule off, to narrow it, or to explain who receives what it matches. Null or absent for none. The rule's author and the organization's owners and admins see it while it stands; withdrawing clears it."
56045
56323
  }
56046
56324
  },
56047
56325
  "required": ["rule_id"],
@@ -56060,7 +56338,7 @@ const openapiDocument = {
56060
56338
  "type": ["string", "null"],
56061
56339
  "minLength": 1,
56062
56340
  "maxLength": 500,
56063
- "description": "Why you are declining, up to 500 characters; null or absent for none. The member who objected sees it."
56341
+ "description": "Why you are declining, up to 500 characters; null or absent for none. The member who objected sees it: it is how to answer one that asks you to narrow the rule or explain who receives it."
56064
56342
  } },
56065
56343
  "additionalProperties": false
56066
56344
  },
@@ -60803,6 +61081,36 @@ const openapiDocument = {
60803
61081
  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
60804
61082
  },
60805
61083
  "previous_key_id": { "type": "string" },
61084
+ "name": {
61085
+ "description": "The successor's name: the rotated key's, which it keeps.",
61086
+ "type": ["string", "null"]
61087
+ },
61088
+ "grant": {
61089
+ "description": "The grant the successor holds, as a create answers it: the rotated key's own, carried over unchanged (rules, addresses and domains included).",
61090
+ "type": "object",
61091
+ "properties": {
61092
+ "template": { "type": ["string", "null"] },
61093
+ "credential_grant_id": { "type": ["string", "null"] },
61094
+ "permissions": {
61095
+ "type": ["array", "null"],
61096
+ "items": { "type": "string" }
61097
+ },
61098
+ "mail_scope": {},
61099
+ "resources": {}
61100
+ },
61101
+ "required": [
61102
+ "template",
61103
+ "credential_grant_id",
61104
+ "permissions",
61105
+ "mail_scope",
61106
+ "resources"
61107
+ ],
61108
+ "additionalProperties": {}
61109
+ },
61110
+ "rotated_from": {
61111
+ "description": "The rotated key: previous_key_id, under the name GET /v1/keys/{id} gives it.",
61112
+ "type": "string"
61113
+ },
60806
61114
  "previous_key_expires_at": {
60807
61115
  "type": "string",
60808
61116
  "format": "date-time",
@@ -65202,7 +65510,7 @@ function formatConcerningRows(items, complete = false, asOf, pendingComplete) {
65202
65510
  const rows = items.map((item) => [
65203
65511
  item.state,
65204
65512
  minute(item.created_at),
65205
- item.name ?? "(unnamed)",
65513
+ `${item.name ?? "(unnamed)"}${item.rule_now === "deleted" ? " (deleted)" : ""}`,
65206
65514
  item.created_through.name ?? item.created_through.id ?? "",
65207
65515
  item.rule_id ?? (item.state === "pending" ? item.id : "")
65208
65516
  ]);
@@ -75721,8 +76029,8 @@ const PRIMITIVE_TEAM_AUTHOR = {
75721
76029
  name: "Primitive Team",
75722
76030
  url: "https://primitive.dev"
75723
76031
  };
75724
- const SDK_VERSION_RANGE = "^3.0.0-preview.14";
75725
- const CLI_VERSION_RANGE = "^3.0.0-preview.14";
76032
+ const SDK_VERSION_RANGE = "^3.0.0-preview.15";
76033
+ const CLI_VERSION_RANGE = "^3.0.0-preview.15";
75726
76034
  const ESBUILD_VERSION_RANGE = "^0.27.0";
75727
76035
  function renderHandler() {
75728
76036
  return `// env.PRIMITIVE_API_KEY, env.PRIMITIVE_WEBHOOK_SECRET, and