import { ArkmeRequestCoordinator, type ArkmeRequestLane, type ArkmeRequestService, type ArkmeRequestStats } from '../request-coordinator.js'; import type { ArkmeSessionCredentials, ArkmeSessionStore } from '../keychain-store.js'; import { ArkmeAccountSessionOwner } from '../account-session-owner.js'; import type { RecentEmojiStore } from '../emoji-recent.js'; import type { ArkmeCachedQueryResult, ArkmeCachedSnapshot, ArkmeEnvironment, ArkmeLongArticleDraft, ArkmePendingWrite, ArkmeRecordReeditDraft, ArkmeRecordCursor, ArkmeSelfRecordList, ArkmeSelfSummary, ArkmeUserProfile, ArkmeUserProfileSnapshot, ArkmePluginErrorBody } from '../types.js'; import type { ArkmeExtensionReviewOperation } from '../extensions/types.js'; import type { RecordingImportAdmission, RecordingImportJob } from '../recording-import-contract.js'; export interface StateStore extends RecentEmojiStore { teamOutboundTarget(scope: string, requestUid: string): Promise; retainTeamOutboundTarget(scope: string, requestUid: string, value: import('../team-outbound-contract.js').TeamOutboundRecovery): Promise; readonly selfNoteQuotes?: import('../local-self-note-quotes.js').LocalSelfNoteQuotes; readonly worldReactions?: import('../local-world-reactions.js').LocalWorldReactions; localTranscriptEntries?(account: string, scope: string, ids: string[], change?: import('../local-transcript-state.js').LocalTranscriptChange): Promise>; arkoPendingTurns(userId: number): Promise; arkoTurn(userId: number, uid: string): Promise; prepareArkoTurn(userId: number, turn: import('../arko-turn-contract.js').ArkmeArkoPendingTurn, request?: Record): Promise; acknowledgeArkoTurn(userId: number, uid: string): Promise; arkoFileRefs(userId: number): Promise; readDayReviewPending?(scope: string, day: string): Promise; prepareDayReview?(scope: string, day: string, request: Record): Promise; acknowledgeDayReview?(scope: string, day: string, requestId: string): Promise; readOfflineContextJournal?(scope: string): Promise>; putOfflineContextJournal?(scope: string, id: string, entry: import('../offline-context-contract.js').OfflineContextJournalEntry): Promise; deleteOfflineContextJournal?(scope: string, id: string, fingerprint: string): Promise; localDirectoryPreferences?(accountKey: string, entries?: import('../local-directory-preferences.js').LocalDirectoryPreferences, migrate?: boolean): Promise; readConversationViewports?(accountKey: string, surface: string): Promise; writeConversationViewports?(accountKey: string, surface: string, entries: import('../conversation-viewport-state.js').ConversationViewportEntries): Promise; arrangementBoardCache?(environment: string, userId: number, pages?: import('../arrangement-board-cache.js').ArkmeArrangementBoardCachePages): Promise; readCancellationCompletion?(): Promise; writeCancellationCompletion?(completion: import('../state-store.js').ArkmeCancellationCompletion | undefined): Promise; readonly messageMarks?: import('../local-message-marks.js').LocalMessageMarkStore; readonly commonGroups?: import('../common-groups.js').CommonGroupStore; readRecordingSpeakerCache?(scope: string, userId: number): Promise; writeRecordingSpeakerCache?(scope: string, userId: number, candidates: import('../types.js').ArkmeRecordingSpeakerCandidate[]): Promise; clearRecordingSpeakerCache?(scope: string, userId: number): Promise; readDirectoryCache?(userId: number): Promise; writeDirectoryCache?(userId: number, page: import('../types.js').ArkmeSourceList): Promise; readAvatarCache?(userId: number, imageRef: string): Promise; writeAvatarCache?(userId: number, imageRef: string, image: import('../types.js').ArkmeImageBytes): Promise; selfRoleAvatarLocalRef?(userId: number, fileAssetUid: string): Promise; forgetCachedMembers?(userId: number, group: string, refs: readonly string[]): Promise; cachedConversationMembers?(userId: number, group: string): Promise; mergeConversationMembers?(userId: number, group: string, page: import('../types.js').ArkmeConversationMemberUpdate): Promise; clearConversationMembers?(userId: number, group: string): Promise; uniqueCode(): Promise; cachedSnapshot(userId: number): Promise; cacheSummary(userId: number, summary: ArkmeSelfSummary): Promise; cachePage(userId: number, page: ArkmeSelfRecordList, requestCursor?: ArkmeRecordCursor): Promise; queryCached(userId: number, options: { query?: string; limit: number; beforeMillis?: number; }): Promise; revision(userId: number): Promise; cachedProfile(userId: number): Promise; cacheProfile(userId: number, profile: ArkmeUserProfile): Promise; listPending(userId: number): Promise; putPending(userId: number, pending: ArkmePendingWrite): Promise; markAttempt(userId: number, recordUid: string, error: string): Promise; markSynced(userId: number, recordUid: string, status: number): Promise; listExtensionReviewOperations(userId: number): Promise; putExtensionReviewOperation(userId: number, operation: ArkmeExtensionReviewOperation): Promise; markExtensionReviewOperation(userId: number, clientMutationId: string, state: ArkmeExtensionReviewOperation['state'], error?: string): Promise; removeExtensionReviewOperation(userId: number, clientMutationId: string): Promise; getLongArticleDraft(userId: number, sourceRef: string, itemUid?: string, draftScope?: string): Promise; putLongArticleDraft(userId: number, draft: ArkmeLongArticleDraft): Promise; removeLongArticleDraft(userId: number, sourceRef: string, itemUid?: string, expectedRecordUid?: string, draftScope?: string): Promise; getRecordReeditDraft(userId: number, sourceIdentityKey: string, itemUid: string): Promise; putRecordReeditDraft(userId: number, draft: Omit, expectedRevision?: number): Promise; recordReeditFileRefs(userId: number): Promise; listRecordReeditSubmissions(userId: number): Promise; acknowledgeRecordReeditSubmission(userId: number, identity: string, submissionId: string, version: number): Promise; discardRecordReeditCandidate(userId: number, sourceIdentityKey: string, itemUid: string, expectedRevision: number): Promise; putRecordReeditSubmission(userId: number, job: import('../record-reedit-contract.js').ArkmeRecordReeditSubmission, expectedId?: string): Promise; removeRecordReeditDraft(userId: number, sourceIdentityKey: string, itemUid: string, expectedRevision: number, expectedCandidate?: ArkmeRecordReeditDraft): Promise; listRecordingImportJobs(userId: number): Promise; planRecordingToolBatch?(scope: string, candidates: Array<{ key: string; isNew: boolean; strategy?: import('../recording-strategy-contract.js').RecordingStrategy; }>, timeZone: string, signal?: AbortSignal): Promise>; listAllRecordingImportJobs(): Promise; getRecordingImportJob(userId: number, jobId: string): Promise; putRecordingImportJob(userId: number, job: RecordingImportJob): Promise; admitRecordingImportJob(userId: number, job: RecordingImportJob, signal?: AbortSignal): Promise; replaceRecordingImportJob(userId: number, job: RecordingImportJob, expectedRevision: number, signal?: AbortSignal): Promise; removeRecordingImportJob(userId: number, jobId: string): Promise; } export interface ArkmeServiceConfig { environment: ArkmeEnvironment; dshRemoteRealtimeBaseUrl?: string; authBaseUrl: string; subjectBaseUrl: string; recordBaseUrl: string; dataBaseUrl?: string; teamBaseUrl?: string; chatBaseUrl: string; botBaseUrl: string; imBaseUrl: string; webrtcBaseUrl: string; worldBaseUrl: string; relationBaseUrl: string; intelligentBaseUrl: string; memoryCoreBaseUrl?: string; routePath: string; audioBaseUrl: string; extensionPublishBaseUrl?: string; requestTimeoutMs: number; maxTextLength: number; geetestCaptchaId: string; baiduMapBrowserAk?: string; relatedRecordingsEnabled?: boolean; interwovenMomentsEnabled: boolean; /** Explicit rollback only; never fall back automatically after a view-query error. */ selfCalendarViewsEnabled?: boolean; recordingWorkbenchEnabled?: boolean; chatMemberJoinEventsEnabled?: boolean; shareWebsite?: string; richMediaRenderEnabled?: boolean; markdownQuickNotesEnabled?: boolean; markdownLongArticlesEnabled?: boolean; richMediaSendEnabled?: boolean; maxUploadBytes?: number; recordingImportDirectory?: string; fileStateDirectory?: string; } export type FetchLike = typeof fetch; type ArkmePostBody = Record | FormData; export interface ArkmeRemoteRequestOptions { /** Reserved for realtime message projection; only exact read routes are eligible. */ traffic?: 'message-sync'; lane?: ArkmeRequestLane; service?: ArkmeRequestService; scope?: string; key?: string; cacheMs?: number; failureCooldownMs?: number; bypassCache?: boolean; /** Cancel a shared read transport once its last subscriber leaves. */ cancelWhenUnobserved?: boolean; /** Optional writes may avoid publishing service-wide cooldowns; existing admission limits still apply. */ publishServiceCooldown?: boolean; /** Mark only transport outcomes where a mutation may have reached its owner without a usable acknowledgement. */ trackWriteOutcome?: boolean; } export declare class ArkmePluginError extends Error { readonly code: string; readonly retryable: boolean; readonly httpStatus: number; readonly publishReceipt?: ArkmePluginErrorBody['publishReceipt']; readonly upstreamStatus?: number; readonly retryAfterMillis?: number; readonly failureKind?: ArkmePluginErrorBody['failureKind']; readonly retryScope?: ArkmePluginErrorBody['retryScope']; readonly recovery?: ArkmePluginErrorBody['recovery']; readonly imageFailures?: ArkmePluginErrorBody['imageFailures']; /** The owner mutation may have completed, but the caller did not receive a usable acknowledgement. */ readonly writeOutcomeUnknown?: true; constructor(code: string, message: string, retryable: boolean, httpStatus?: number, options?: ErrorOptions & { upstreamStatus?: number; retryAfterMillis?: number; writeOutcomeUnknown?: boolean; publishReceipt?: ArkmePluginErrorBody['publishReceipt']; failureKind?: ArkmePluginErrorBody['failureKind']; retryScope?: ArkmePluginErrorBody['retryScope']; recovery?: ArkmePluginErrorBody['recovery']; imageFailures?: ArkmePluginErrorBody['imageFailures']; }); } /** Opaque upstream body, for the owning business adapter only. Never serialize this error wholesale. */ export declare class ArkmeUpstreamResponseError extends ArkmePluginError { readonly responseData: unknown; constructor(code: string, message: string, retryable: boolean, httpStatus: number, responseData: unknown, options?: ConstructorParameters[4]); } export interface ArkmeOwnerReadPort { runOwnerRead(route: string, parameters: Record, operation: (signal: AbortSignal) => Promise, signal?: AbortSignal): Promise; withOwnerReadInvalidation(route: string, operation: () => Promise): Promise; } export declare function stringValue(value: unknown): string; export declare function knownStringValue(value: unknown, allowed: ReadonlySet): T | undefined; export declare function clippedText(value: unknown, limit?: number): string; export declare function objectValue(value: unknown): Record; export declare function joinUrl(baseUrl: string, path: string): string; export declare class ServiceRuntime { readonly config: ArkmeServiceConfig; readonly sessionStore: ArkmeSessionStore; readonly stateStore: StateStore; readonly fetchImpl: FetchLike; readonly pendingSessionStore?: ArkmeSessionStore | undefined; private memberCacheRevision; memberCacheEpoch(): number; invalidateMemberCache(): void; readonly requestCoordinator: ArkmeRequestCoordinator; private readonly messageSyncCoordinator; private readonly messageSyncLane; private readonly refreshInFlightByUserId; private readonly accountSessions; private pendingBindingSession; constructor(config: ArkmeServiceConfig, sessionStore: ArkmeSessionStore, stateStore: StateStore, fetchImpl?: FetchLike, pendingSessionStore?: ArkmeSessionStore | undefined, accountSessions?: ArkmeAccountSessionOwner); startAccountScope(): Promise; attachGuestConversationProbe(probe: () => Promise): void; accountScopeReady(): boolean; subscribeAccountScope(listener: () => void): () => void; accountScopedSession(): Promise; writeSession(session: ArkmeSessionCredentials): Promise; deleteSession(): Promise; deleteSessionIfCurrent(expected: ArkmeSessionCredentials): Promise; activatePendingBindingSession(expected: ArkmeSessionCredentials): Promise; moveSessionToPendingBinding(expected: ArkmeSessionCredentials): Promise; requestStats(): Record; requestScope(userId: number | undefined): string; private readonly readRevisions; readRevision(scope: string): number; private readonly calendarRevisions; private calendarVersion; calendarReadRevision(scope: string, start: string, end: string, timezone: string): string; /** Chat deltas invalidate only affected composite month results (in any timezone). */ invalidateCalendarDates(scope: string, stamps: number[]): void; withOwnerReadInvalidation(route: string, operation: () => Promise): Promise; runOwnerRead(route: string, parameters: Record, operation: (signal: AbortSignal) => Promise, signal?: AbortSignal): Promise; /** Only for composites whose child requests already pass through transport admission. */ runBackgroundMessageProjection(operation: () => Promise): Promise; runCompositeOwnerRead(route: string, parameters: Record, operation: (signal: AbortSignal) => Promise, signal?: AbortSignal, lane?: 'interactive-read' | 'background-read'): Promise; private ownerRead; invalidateScope(scope: string): void; invalidateKey(scope: string, key: string): void; dispose(): void; requireSession(): Promise; requireAuthFlowSession(): Promise; isPendingBindingSession(session: ArkmeSessionCredentials): boolean; readPendingBindingSession(): Promise; writePendingBindingSession(session: ArkmeSessionCredentials): Promise; clearPendingBindingSession(): Promise; clearRefreshForUser(userId: number): void; refreshAccessToken(session: ArkmeSessionCredentials, signal?: AbortSignal): Promise; private requestService; private remoteServiceCooldownMs; private registeredRead; post(baseUrl: string, path: string, body: ArkmePostBody, bearer: string | undefined, successCodes: readonly number[], signal?: AbortSignal, preferDataError?: boolean, options?: ArkmeRemoteRequestOptions, preserveHttpError?: boolean, preserveForbiddenError?: boolean): Promise; postDirect(baseUrl: string, path: string, body: ArkmePostBody, bearer: string | undefined, successCodes: readonly number[], signal?: AbortSignal, preferDataError?: boolean, preserveHttpError?: boolean, preserveForbiddenError?: boolean): Promise; get(baseUrl: string, path: string, bearer: string | undefined, successCodes: readonly number[], signal?: AbortSignal, options?: ArkmeRemoteRequestOptions, preferDataError?: boolean): Promise; getDirect(baseUrl: string, path: string, bearer: string | undefined, successCodes: readonly number[], signal?: AbortSignal, preferDataError?: boolean): Promise; authenticatedRequestOptions(session: ArkmeSessionCredentials, service: ArkmeRequestService, defaultLane: ArkmeRequestLane, options: ArkmeRemoteRequestOptions): ArkmeRemoteRequestOptions; authenticatedAuthGet(path: string, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions): Promise; authenticatedDshRemoteGet(path: string, signal?: AbortSignal): Promise; authenticatedPost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions): Promise; authenticatedCalendarPost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions): Promise; authenticatedDataPost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions): Promise; authenticatedAuthPost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions): Promise; authenticatedAuthMultipartPost(path: string, body: FormData, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal): Promise; /** Read a legacy private owner hosted by the main authenticated API. */ authenticatedAuthReadPost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions): Promise; /** Read a public auth endpoint while isolating coordination and caching to the active account. */ accountScopedPublicAuthReadPost(path: string, body: Record, viewerUserId: number, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions): Promise; authenticatedDshRemotePost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal): Promise; authenticatedSubjectPost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal): Promise; authenticatedTeamPost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, read?: boolean): Promise; authenticatedChatPost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions & { refreshOnUnauthorized?: boolean; }): Promise; authenticatedBotPost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions & { refreshOnUnauthorized?: boolean; }): Promise; authenticatedWebrtcPost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions): Promise; authenticatedAudioPost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions): Promise; /** Binary service reads keep account scope and credentials in the Host. */ authenticatedAudioStream(path: string, options: { expectedUserId: number; maxBytes?: number; range?: string; signal?: AbortSignal; method?: 'GET' | 'HEAD'; }): Promise; private openAudioStream; authenticatedAudioMultipartPost(path: string, body: FormData, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions): Promise; authenticatedRelationPost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions): Promise; authenticatedRelationGet(path: string, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal): Promise; authenticatedMemoryCorePost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, write?: boolean): Promise; authenticatedWorldPost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions): Promise; /** Keep the body inside coordinator admission until consumption ends. No stream * recovery: a retry after a delivered item would splice two snapshots. */ intelligentExportStream(initialSession: ArkmeSessionCredentials, consume: (body: ReadableStream, signal: AbortSignal) => Promise, signal?: AbortSignal): Promise; authenticatedIntelligentPost(path: string, body: Record, initialSession?: ArkmeSessionCredentials, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions): Promise; extensionPost(path: string, body: Record, signal?: AbortSignal, options?: ArkmeRemoteRequestOptions): Promise; } export {}; //# sourceMappingURL=service.d.ts.map