@alfe.ai/openclaw-sync 0.0.18 → 0.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -792,9 +792,14 @@ declare class AgentApiClient {
792
792
  }): Promise<{
793
793
  identityId: string | null;
794
794
  status: string;
795
- accessAllowed: boolean;
796
795
  created?: boolean;
797
796
  reason?: string;
797
+ /**
798
+ * Flattened auriclabs permission strings for the resolved identity
799
+ * (scope-prefixed where applicable). Empty array on miss / org service
800
+ * outage — the runtime gate fails closed in that case.
801
+ */
802
+ permissions: string[];
798
803
  }>;
799
804
  searchIdentities(args?: {
800
805
  q?: string;
@@ -927,7 +932,6 @@ declare class AgentApiClient {
927
932
  }): Promise<{
928
933
  identityId: string | null;
929
934
  status: string;
930
- accessAllowed: boolean;
931
935
  }>;
932
936
  memorySearch(query: string, opts?: {
933
937
  limit?: number;
@@ -1007,6 +1011,29 @@ declare class AgentApiClient {
1007
1011
  storageEstimateBytes: number;
1008
1012
  lastIngestionAt?: string;
1009
1013
  }>;
1014
+ memoryLearn(args: {
1015
+ text: string;
1016
+ source?: string;
1017
+ sourceType?: "file" | "url" | "inline";
1018
+ metadata?: {
1019
+ sessionId?: string;
1020
+ channelId?: string;
1021
+ userName?: string;
1022
+ };
1023
+ }): Promise<{
1024
+ memoriesStored: number;
1025
+ triplesStored: number;
1026
+ chunks: number;
1027
+ source?: string;
1028
+ }>;
1029
+ memoryBootstrapStatus(): Promise<{
1030
+ synced: boolean;
1031
+ syncedAt?: string;
1032
+ }>;
1033
+ memoryBootstrapStatusMark(): Promise<{
1034
+ synced: true;
1035
+ syncedAt: string;
1036
+ }>;
1010
1037
  searchWeb(params: {
1011
1038
  query: string;
1012
1039
  count?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":["ResourceScope","IntegrationVisibility","IntegrationScope","IntegrationDesiredStatus","IntegrationActualStatus","IntegrationInstall","Record","IntegrationConfigSchemaField","IntegrationConfigResult","RegistryEntry","SecretScope","EncryptedEnvelopeV1","FIELD_FORMATS","FieldFormat","FIELD_SENSITIVITIES","FieldSensitivity","Field","SECRET_CATEGORIES","SecretCategory","FieldView","SecretAggregate","SecretMetadata","FieldEnvelope","ScopeInfo","GeneratedDataKey","CHANGELOG_ACTIONS","ChangelogAction","ChangelogActor","ChangelogEntry","AgentApiClientConfig","SyncAgentInfo","SyncManifestEntry","SyncManifest","SyncPresignedUrl","SyncConfirmedUpload","SyncReconstructFile","SyncReconstructBundle","SyncAgentStats","SyncFileEntry","SyncSessionEntry","SyncSessionContent","SharedFileEntry","AgentApiClient","Promise"],"sources":["../src/manifest.ts","../src/ignore.ts","../../agent-api-client/dist/index.d.ts","../src/sync-engine.ts","../src/watcher.ts","../src/uploader.ts","../src/downloader.ts","../src/retry.ts","../src/shared-sync.ts"],"sourcesContent":["//#region ../../packages-internal/types/dist/access.d.ts\n\n/**\n * The four resource scopes at which a permission can apply.\n * Order is meaningful: broader scopes first (`org`) → narrower last (`agent`).\n *\n * `IntegrationScope` in integration.ts and `SecretScope` in secrets.ts are\n * intentional aliases of this same enum — there is only one concept of\n * \"scope\" in Alfe.\n */\ndeclare const ResourceScope: {\n readonly Org: \"org\";\n readonly Team: \"team\";\n readonly Project: \"project\";\n readonly Agent: \"agent\";\n};\ntype ResourceScope = (typeof ResourceScope)[keyof typeof ResourceScope];\n/** Ordered tuple of resource scope string values (broad → narrow). */\n//#endregion\n//#region ../../packages-internal/types/dist/integration.d.ts\n/** Controls where an integration appears: public (everyone), hidden (nowhere) */\ndeclare const IntegrationVisibility: {\n readonly Public: \"public\";\n readonly Hidden: \"hidden\";\n};\ntype IntegrationVisibility = (typeof IntegrationVisibility)[keyof typeof IntegrationVisibility];\n/** Scope at which an integration is installed */\ndeclare const IntegrationScope: {\n readonly Org: \"org\";\n readonly Team: \"team\";\n readonly Project: \"project\";\n readonly Agent: \"agent\";\n};\ntype IntegrationScope = ResourceScope;\ndeclare const IntegrationDesiredStatus: {\n readonly Active: \"active\";\n readonly Removed: \"removed\";\n};\ntype IntegrationDesiredStatus = (typeof IntegrationDesiredStatus)[keyof typeof IntegrationDesiredStatus];\ndeclare const IntegrationActualStatus: {\n readonly Installing: \"installing\";\n readonly Active: \"active\";\n readonly Error: \"error\";\n readonly Removing: \"removing\";\n readonly Inactive: \"inactive\";\n readonly Unknown: \"unknown\";\n};\ntype IntegrationActualStatus = (typeof IntegrationActualStatus)[keyof typeof IntegrationActualStatus];\ninterface IntegrationInstall {\n scope: IntegrationScope;\n scopeId: string;\n integrationId: string;\n tenantId: string;\n desiredStatus: IntegrationDesiredStatus;\n actualStatus: IntegrationActualStatus;\n version: string;\n config: Record<string, unknown>;\n errorMessage: string;\n installedAt: string;\n updatedAt: string;\n}\n/** @deprecated Use IntegrationInstall instead */\n\ninterface IntegrationConfigSchemaField {\n key: string;\n label: string;\n type: string;\n description?: string;\n required?: boolean;\n default?: string | number | boolean;\n options?: string[];\n select_options?: {\n value: string;\n label: string;\n }[];\n oauth_provider?: string;\n oauth_scopes?: string[];\n oauth_integration_id?: string;\n editable?: string;\n hidden?: boolean;\n}\ninterface IntegrationConfigResult {\n integrationId: string;\n config: Record<string, unknown>;\n configSchema: IntegrationConfigSchemaField[];\n}\ninterface RegistryEntry {\n id: string;\n name: string;\n description: string;\n versions: string[];\n latest: string;\n repository: string;\n commit: string;\n icon?: string;\n author?: {\n name: string;\n url?: string;\n } | string;\n pricing?: {\n type: \"free\" | \"paid\" | \"usage\";\n price?: number;\n currency?: string;\n interval?: \"month\" | \"year\";\n description?: string;\n };\n features?: string[];\n preview_images?: string[];\n config_schema?: IntegrationConfigSchemaField[];\n supported_agents?: string[];\n /** Scopes where this integration can be installed */\n supported_scopes?: IntegrationScope[];\n /** Visibility status — controls where integration appears */\n visibility?: IntegrationVisibility;\n}\n//# sourceMappingURL=integration.d.ts.map\n//#endregion\n//#region ../../packages-internal/types/dist/secrets.d.ts\n/** Scope levels at which a secret can be owned. Aliased to ResourceScope. */\ntype SecretScope = ResourceScope;\n/**\n * v1 encrypted envelope as persisted by services/secrets and exchanged with\n * agents. Values are AES-256-GCM ciphertext; iv/authTag/ciphertext/dataKeyCiphertext\n * are all base64-encoded.\n */\ninterface EncryptedEnvelopeV1 {\n version: 1;\n iv: string;\n ciphertext: string;\n authTag: string;\n dataKeyCiphertext: string;\n}\n/**\n * Display/validation hint for a field's value. `\"json\"` signals that the\n * string is a JSON-stringified payload that consumers should `JSON.parse`.\n */\ndeclare const FIELD_FORMATS: readonly [\"text\", \"email\", \"url\", \"phone\", \"date\", \"number\", \"json\"];\ntype FieldFormat = (typeof FIELD_FORMATS)[number];\n/**\n * Whether a field is stored in plaintext (visible to anyone with read access)\n * or encrypted (requires KMS + the right encryption context to read).\n */\ndeclare const FIELD_SENSITIVITIES: readonly [\"plaintext\", \"encrypted\"];\ntype FieldSensitivity = (typeof FIELD_SENSITIVITIES)[number];\n/**\n * A field on a secret. `value` is always a string at the wire; for encrypted\n * fields it's the plaintext at the API edge (the service encrypts before\n * persistence). Reads from the dashboard omit `value` for encrypted fields;\n * agents get a `FieldEnvelope` instead and decrypt locally.\n */\ninterface Field {\n key: string;\n format?: FieldFormat;\n sensitivity: FieldSensitivity;\n value: string;\n}\n/**\n * Secret category — drives icon/template/filter behaviour. Defaults to\n * `\"other\"` for migrated rows.\n */\ndeclare const SECRET_CATEGORIES: readonly [\"login\", \"api_key\", \"database\", \"ssh_key\", \"certificate\", \"secure_note\", \"credit_card\", \"identity\", \"wifi\", \"other\"];\ntype SecretCategory = (typeof SECRET_CATEGORIES)[number];\n/**\n * One field as exposed to readers. Encrypted fields have no `value` on the\n * dashboard read path; the agent-side aggregate carries `envelope` instead.\n */\ninterface FieldView {\n key: string;\n format?: FieldFormat;\n sensitivity: FieldSensitivity;\n /** Present for `sensitivity: \"plaintext\"` only. */\n value?: string;\n /** Present for `sensitivity: \"encrypted\"` on agent-side reads only. */\n envelope?: EncryptedEnvelopeV1;\n /** Plaintext fields that opt into `format: \"json\"` are pre-parsed for callers. */\n parsedValue?: unknown;\n rotatedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n/** A secret as assembled from its multi-row aggregate. */\ninterface SecretAggregate {\n secretId: string;\n secretName: string;\n description?: string;\n tags: string[];\n category: SecretCategory;\n fields: FieldView[];\n changelogVersion: number;\n createdAt: string;\n updatedAt: string;\n}\n/** Metadata-only projection — used by list endpoints. */\ninterface SecretMetadata {\n secretId: string;\n secretName: string;\n description?: string;\n tags: string[];\n category: SecretCategory;\n fieldKeys: string[];\n changelogVersion: number;\n createdAt: string;\n updatedAt: string;\n}\n/**\n * Per-field encrypted envelope returned to agents on the agent-side aggregate.\n * Agents decrypt locally using a data key fetched from `/decrypt-data-key`.\n */\ninterface FieldEnvelope {\n key: string;\n format?: FieldFormat;\n envelope: EncryptedEnvelopeV1;\n rotatedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n/** A scope the caller can read or write secrets in. */\ninterface ScopeInfo {\n scope: SecretScope;\n scopeId: string;\n name?: string;\n}\n/**\n * KMS-issued data key, returned by the secrets service's\n * `/secrets/generate-data-key` KMS proxy endpoint. The plaintext key is\n * returned base64-encoded; callers MUST decode it to a Buffer and zero the\n * Buffer after use — never keep the plaintext as a JS string.\n */\ninterface GeneratedDataKey {\n plaintextKey: string;\n dataKeyCiphertext: string;\n}\n/**\n * Action types recorded in the secret changelog. Append-only.\n */\ndeclare const CHANGELOG_ACTIONS: readonly [\"created\", \"deleted\", \"metadata_updated\", \"field_added\", \"field_rotated\", \"field_removed\", \"tag_added\", \"tag_removed\"];\ntype ChangelogAction = (typeof CHANGELOG_ACTIONS)[number];\n/** Who triggered a changelog entry. */\ninterface ChangelogActor {\n kind: \"user\" | \"agent\" | \"system\";\n id: string;\n}\n/**\n * One audit row from the secret's changelog. Metadata only — never carries\n * field VALUES (old or new). Rolling back a rotated secret is intentionally\n * not supported.\n */\ninterface ChangelogEntry {\n changelogVersion: number;\n action: ChangelogAction;\n fieldKey?: string;\n fieldSensitivity?: FieldSensitivity;\n changedBy: ChangelogActor;\n reason?: string;\n timestamp: string;\n}\n//# sourceMappingURL=secrets.d.ts.map\n//#endregion\n//#region src/index.d.ts\ninterface AgentApiClientConfig {\n apiKey: string;\n apiUrl: string;\n}\ninterface SyncAgentInfo {\n agentId: string;\n tenantId: string;\n displayName: string;\n s3Prefix: string;\n status: \"stale\" | \"syncing\" | \"synced\";\n fileCount?: number;\n totalSize?: number;\n lastSync?: string;\n}\ninterface SyncManifestEntry {\n hash: string;\n size: number;\n modified: string;\n etag?: string;\n storageClass?: string;\n compressed?: boolean;\n}\ninterface SyncManifest {\n version: 1;\n agentId: string;\n lastSync: string;\n files: Record<string, SyncManifestEntry>;\n}\ninterface SyncPresignedUrl {\n path: string;\n url: string;\n expiresAt: string;\n}\ninterface SyncConfirmedUpload {\n filePath: string;\n hash: string;\n size: number;\n storageClass: \"STANDARD\" | \"GLACIER_IR\";\n syncedAt: string;\n}\ninterface SyncReconstructFile {\n path: string;\n size: number;\n url: string;\n storageClass?: string;\n compressed?: boolean;\n}\ninterface SyncReconstructBundle {\n agentId: string;\n mode: \"full\" | \"active\" | \"memory\";\n fileCount: number;\n totalSize: number;\n files: SyncReconstructFile[];\n expiresAt: string;\n}\ninterface SyncAgentStats {\n agentId: string;\n standardBytes: number;\n glacierBytes: number;\n fileCount: number;\n lastSyncAt: string | null;\n}\ninterface SyncFileEntry {\n filePath: string;\n size: number;\n modified: string;\n contentHash: string;\n storageClass?: string;\n compressed?: boolean;\n}\ninterface SyncSessionEntry {\n sessionId: string;\n size: number;\n lastModified: string;\n storageClass?: string;\n isArchived: boolean;\n}\ninterface SyncSessionContent {\n sessionId: string;\n content: string;\n compressed: boolean;\n}\ninterface SharedFileEntry {\n filePath: string;\n fileName: string;\n size: number;\n contentType?: string;\n}\ndeclare class AgentApiClient {\n private readonly apiKey;\n private readonly apiUrl;\n constructor(config: AgentApiClientConfig);\n private request;\n syncRegister(args?: {\n displayName?: string;\n }): Promise<{\n agent: SyncAgentInfo;\n }>;\n syncGetManifest(): Promise<SyncManifest>;\n syncPresign(args: {\n files: {\n path: string;\n operation: \"put\" | \"get\";\n contentType?: string;\n }[];\n }): Promise<{\n urls: SyncPresignedUrl[];\n }>;\n syncConfirmUpload(args: {\n filePath: string;\n hash: string;\n size: number;\n storageClass?: \"STANDARD\" | \"GLACIER_IR\";\n }): Promise<SyncConfirmedUpload>;\n syncReconstruct(args: {\n mode: \"full\" | \"active\" | \"memory\";\n }): Promise<SyncReconstructBundle>;\n syncGetStats(): Promise<SyncAgentStats>;\n syncListFiles(args?: {\n prefix?: string;\n }): Promise<{\n files: SyncFileEntry[];\n }>;\n syncListSessions(): Promise<{\n sessions: SyncSessionEntry[];\n }>;\n syncGetSession(sessionId: string): Promise<SyncSessionContent>;\n syncDeleteFile(filePath: string): Promise<{\n removed: boolean;\n }>;\n sharedListFiles(args: {\n scope: \"org\" | \"team\" | \"project\";\n scopeId: string;\n }): Promise<{\n files: SharedFileEntry[];\n nextCursor: string | null;\n }>;\n sharedDownloadUrl(args: {\n scope: \"org\" | \"team\" | \"project\";\n scopeId: string;\n filePath: string;\n }): Promise<{\n downloadUrl: string;\n expiresIn: number;\n }>;\n listIntegrations(): Promise<IntegrationInstall[]>;\n getIntegrationConfig(integrationId: string): Promise<IntegrationConfigResult>;\n updateIntegrationConfig(integrationId: string, config: Record<string, unknown>): Promise<void>;\n installIntegration(integrationId: string, options?: {\n version?: string;\n config?: Record<string, unknown>;\n }): Promise<IntegrationInstall>;\n removeIntegration(integrationId: string): Promise<IntegrationInstall>;\n getOAuthUrl(provider: string, scopes?: string[]): Promise<{\n url: string;\n provider: string;\n expiresIn: number;\n }>;\n getOAuthStatus(provider: string): Promise<{\n provider: string;\n connected: boolean;\n config?: Record<string, string>;\n }>;\n getRegistry(): Promise<{\n integrations: RegistryEntry[];\n }>;\n getGoogleCredentials(): Promise<{\n accounts?: {\n email: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n enabledServices?: string[];\n isDefault: boolean;\n displayName?: string;\n }[];\n email: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n projectId: string;\n enabledServices?: string[];\n }>;\n disconnectGoogleAccount(email: string): Promise<{\n accounts: {\n email: string;\n displayName?: string;\n isDefault: boolean;\n }[];\n }>;\n setDefaultGoogleAccount(email: string): Promise<{\n accounts: {\n email: string;\n displayName?: string;\n isDefault: boolean;\n }[];\n }>;\n getGoogleChatCredentials(): Promise<{\n email: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n displayName?: string;\n }>;\n getGithubCredentials(): Promise<{\n login: string;\n accessToken: string;\n }>;\n getXeroCredentials(): Promise<{\n accessToken: string;\n accessTokenExpiresAt: string;\n xeroTenantId: string;\n }>;\n refreshXeroToken(): Promise<{\n accessToken: string;\n expiresAt: string;\n }>;\n getNotionCredentials(): Promise<{\n accessToken: string;\n workspaceId: string;\n workspaceName: string;\n }>;\n getAtlassianCredentials(): Promise<{\n accessToken: string;\n refreshToken: string;\n accessTokenExpiresAt: string;\n cloudId: string;\n siteName: string;\n siteUrl: string;\n email: string;\n enabledProducts: string[];\n clientId: string;\n clientSecret: string;\n }>;\n refreshAtlassianToken(): Promise<{\n accessToken: string;\n expiresAt: string;\n }>;\n getMYOBCredentials(): Promise<{\n accessToken: string;\n accessTokenExpiresAt: string;\n myobBusinessId: string;\n clientId: string;\n }>;\n refreshMYOBToken(): Promise<{\n accessToken: string;\n expiresAt: string;\n }>;\n getTeamsCredentials(): Promise<{\n agentId: string;\n tenantId: string;\n azureAppId: string;\n azureBotId: string;\n azureClientSecret: string;\n botDisplayName?: string;\n teamsTenantId?: string;\n serviceUrl?: string;\n }>;\n sendTeamsMessage(data: {\n conversationId: string;\n text?: string;\n adaptiveCard?: Record<string, unknown>;\n }): Promise<{\n ok: boolean;\n activityId: string;\n }>;\n listTeamsChannels(): Promise<{\n channels: {\n id: string;\n name: string;\n description?: string;\n }[];\n }>;\n presignAttachments(files: {\n filename: string;\n mimeType: string;\n size: number;\n }[]): Promise<{\n attachments: {\n id: string;\n uploadUrl: string;\n downloadUrl: string;\n s3Key: string;\n expiresAt: string;\n }[];\n }>;\n recordActivity(data: {\n userId?: string;\n channel: string;\n role: \"user\" | \"assistant\";\n }): Promise<{\n recorded: boolean;\n }>;\n /**\n * Mint a fresh AES-256 data key for a specific (secret, field) pair. The\n * encryption context is rebuilt server-side from `auth.tenantId` + the body\n * fields including `fieldKey`; the agent cannot forge context for a scope\n * or field it doesn't own. Legacy single-envelope secrets are migrated to\n * `field#value` rows by the data migration, so call with `fieldKey: \"value\"`\n * to reach them.\n */\n generateSecretDataKey(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n }): Promise<GeneratedDataKey>;\n /**\n * Unwrap a wrapped data key so the agent can decrypt the envelope locally.\n * `fieldKey` MUST match the value supplied when the data key was generated\n * (it's bound into KMS encryption context); mismatch fails with\n * `InvalidCiphertextException`.\n */\n decryptSecretDataKey(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n dataKeyCiphertext: string;\n }): Promise<{\n plaintextKey: string;\n }>;\n /**\n * Create a new secret with one or more fields. Encrypted fields must arrive\n * pre-sealed (the agent has already obtained per-field data keys via\n * `generateSecretDataKey({ ..., fieldKey })` and AES-encrypted locally).\n * Plaintext fields ship the value inline.\n */\n createSecret(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n secretName: string;\n category?: SecretCategory;\n description?: string;\n tags?: string[];\n fields: {\n key: string;\n format?: FieldFormat;\n sensitivity: FieldSensitivity;\n value?: string;\n envelope?: EncryptedEnvelopeV1;\n }[];\n reason?: string;\n }): Promise<SecretAggregate>;\n /** Fetch the secret aggregate plus per-field encrypted envelopes. */\n getSecret(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n }): Promise<{\n aggregate: SecretAggregate;\n envelopes: FieldEnvelope[];\n }>;\n /** Fetch one field. Plaintext: value inline. Encrypted: envelope. */\n getSecretField(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n }): Promise<{\n key: string;\n sensitivity: FieldSensitivity;\n format?: FieldFormat;\n value?: string;\n envelope?: EncryptedEnvelopeV1;\n rotatedAt?: string;\n createdAt: string;\n updatedAt: string;\n }>;\n /** Add OR rotate one field. */\n setSecretField(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n sensitivity: FieldSensitivity;\n format?: FieldFormat;\n value?: string;\n envelope?: EncryptedEnvelopeV1;\n reason?: string;\n }): Promise<{\n fieldKey: string;\n rotated: boolean;\n }>;\n /** Remove one field. */\n removeSecretField(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n }): Promise<void>;\n /** Update secret-level metadata (name/description/tags/category). */\n updateSecretMetadata(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n secretName?: string;\n description?: string;\n tags?: string[];\n category?: SecretCategory;\n reason?: string;\n }): Promise<SecretAggregate>;\n /** List metadata for secrets in a scope. Optional filters route through the byFacet GSI. */\n listSecrets(args: {\n scope: SecretScope;\n scopeId: string;\n category?: SecretCategory;\n tag?: string;\n fieldKey?: string;\n }): Promise<SecretMetadata[]>;\n /** Bounded changelog read — metadata-only audit entries. */\n getSecretHistory(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n limit?: number;\n cursor?: string;\n }): Promise<{\n entries: ChangelogEntry[];\n nextCursor?: string;\n }>;\n /** Delete a secret (and all its field rows + tag rows + changelog rows). */\n deleteSecret(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n }): Promise<void>;\n /** Enumerate scopes (org/team/project/agent) this agent can access. */\n listSecretScopes(): Promise<ScopeInfo[]>;\n resolveIdentity(args: {\n provider: string;\n platformId: string;\n kind?: \"user\" | \"agent\" | \"service\" | \"bot\" | \"workspace\";\n displayName?: string;\n }): Promise<{\n identityId: string | null;\n status: string;\n accessAllowed: boolean;\n created?: boolean;\n reason?: string;\n }>;\n searchIdentities(args?: {\n q?: string;\n status?: string;\n limit?: number;\n }): Promise<{\n identities: unknown[];\n }>;\n getIdentityContext(identityId: string): Promise<{\n context: unknown;\n }>;\n mergeIdentities(survivorId: string, args: {\n mergedId: string;\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n error?: string;\n }>;\n unmergeIdentity(identityId: string, args: {\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n error?: string;\n }>;\n addIdentityNote(identityId: string, args: {\n content: string;\n category?: string;\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n noteId: string | null;\n }>;\n tagIdentity(identityId: string, args: {\n tag: string;\n action: \"add\" | \"remove\";\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n }>;\n getIdentityChangelog(identityId: string, args?: {\n limit?: number;\n }): Promise<{\n entries: unknown[];\n }>;\n rollbackIdentity(identityId: string, args: {\n targetVersion: number;\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n entry?: unknown;\n }>;\n requestIdentityVerification(args: {\n claimedIdentityId: string;\n requestingIdentityId: string;\n requestingProvider: string;\n requestingPlatformId: string;\n preferredChannel?: \"mobile\" | \"email\";\n /**\n * Phase 2: agent-supplied contact endpoint. When provided, the top-level\n * `preferredChannel` is ignored — the contact's channel wins.\n */\n contact?: {\n channel: \"email\" | \"mobile\";\n value: string;\n };\n }): Promise<{\n verificationId: string;\n channel: string;\n deliveredTo: string;\n expiresAt: string;\n availableChannels: {\n channel: string;\n deliveredTo: string;\n }[];\n } | {\n error: string;\n }>;\n confirmIdentityVerification(args: {\n claimedIdentityId: string;\n verificationId: string;\n phrase: string;\n }): Promise<{\n verified: boolean;\n identityId?: string;\n /** Phase 2: how the confirm resolved — Scenario A vs B. */\n action?: \"merged\" | \"contact_verified\";\n error?: string;\n }>;\n /**\n * Update display-shape fields on an Identity. Body excludes `email` /\n * `phone` / `title` / `company` / `metadata` per Section D4 — contacts go\n * via the verify flow, title/company live on OrgMembership, metadata is\n * not agent-writable.\n */\n updateIdentity(identityId: string, args: {\n name?: string;\n avatarUrl?: string;\n timezone?: string;\n locale?: string;\n }): Promise<{\n ok: boolean;\n }>;\n /**\n * Phase 2 (Section H): server-side verification of a Google Chat sender via\n * the agent's existing Google OAuth credentials. Returns the resolved\n * identity (created or matched via Scenario-B email enrichment).\n */\n resolveGoogleChatSender(args: {\n senderUserId: string;\n spaceId?: string;\n }): Promise<{\n identityId: string | null;\n status: string;\n accessAllowed: boolean;\n }>;\n memorySearch(query: string, opts?: {\n limit?: number;\n topic?: string;\n subtopic?: string;\n tag?: string;\n includeKnowledge?: boolean;\n }): Promise<{\n facts: {\n subject: string;\n predicate: string;\n object: string;\n since: string;\n confidence: number;\n }[];\n memories: {\n id: string;\n text: string;\n topic: string;\n subtopic: string;\n tag: string;\n importance: number;\n timestamp: number;\n score: number;\n }[];\n }>;\n memoryStore(text: string, opts?: {\n topic?: string;\n subtopic?: string;\n tag?: string;\n importance?: number;\n }): Promise<{\n memoryId: string;\n }>;\n memoryIngest(sessionKey: string, messages: {\n role: string;\n content: string;\n index: number;\n timestamp?: string;\n }[], metadata?: {\n channelId?: string;\n userId?: string;\n userName?: string;\n }): Promise<{\n queued: boolean;\n messageCount: number;\n }>;\n memoryLoadContext(tier?: number, topicHint?: string): Promise<{\n formatted: string;\n [key: string]: unknown;\n }>;\n memoryLookupEntity(subject: string): Promise<{\n subject: string;\n triples: {\n tripleId: string;\n predicate: string;\n object: string;\n validFrom: string;\n validTo?: string;\n confidence: number;\n }[];\n }>;\n memoryNavigate(): Promise<{\n topics: {\n name: string;\n tripleCount: number;\n subtopics: string[];\n }[];\n cursor: string | null;\n }>;\n memoryDelete(memoryId: string): Promise<{\n deleted: boolean;\n }>;\n memoryStats(): Promise<{\n vectorCount: number;\n tripleCount: number;\n storageEstimateBytes: number;\n lastIngestionAt?: string;\n }>;\n searchWeb(params: {\n query: string;\n count?: number;\n offset?: number;\n country?: string;\n freshness?: string;\n }): Promise<unknown>;\n searchImages(params: {\n query: string;\n count?: number;\n }): Promise<unknown>;\n searchNews(params: {\n query: string;\n count?: number;\n freshness?: string;\n }): Promise<unknown>;\n registerDatabaseCredentials(): Promise<{\n connectionString: string;\n username: string;\n password: string;\n databases: string[];\n }>;\n reportDatabaseAudit(entry: {\n database: string;\n collection: string;\n operation: string;\n summary?: string;\n }): Promise<void>;\n}\n//# sourceMappingURL=index.d.ts.map\n//#endregion\nexport { AgentApiClient, AgentApiClientConfig, type ChangelogAction, type ChangelogActor, type ChangelogEntry, type EncryptedEnvelopeV1, type Field, type FieldEnvelope, type FieldFormat, type FieldSensitivity, type FieldView, type GeneratedDataKey, type IntegrationConfigResult, type IntegrationConfigSchemaField, type IntegrationInstall, type RegistryEntry, type ScopeInfo, type SecretAggregate, type SecretCategory, type SecretMetadata, type SecretScope, SharedFileEntry, SyncAgentInfo, SyncAgentStats, SyncConfirmedUpload, SyncFileEntry, SyncManifest, SyncManifestEntry, SyncPresignedUrl, SyncReconstructBundle, SyncReconstructFile, SyncSessionContent, SyncSessionEntry };\n//# sourceMappingURL=index.d.ts.map"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.cts","names":["ResourceScope","IntegrationVisibility","IntegrationScope","IntegrationDesiredStatus","IntegrationActualStatus","IntegrationInstall","Record","IntegrationConfigSchemaField","IntegrationConfigResult","RegistryEntry","SecretScope","EncryptedEnvelopeV1","FIELD_FORMATS","FieldFormat","FIELD_SENSITIVITIES","FieldSensitivity","Field","SECRET_CATEGORIES","SecretCategory","FieldView","SecretAggregate","SecretMetadata","FieldEnvelope","ScopeInfo","GeneratedDataKey","CHANGELOG_ACTIONS","ChangelogAction","ChangelogActor","ChangelogEntry","AgentApiClientConfig","SyncAgentInfo","SyncManifestEntry","SyncManifest","SyncPresignedUrl","SyncConfirmedUpload","SyncReconstructFile","SyncReconstructBundle","SyncAgentStats","SyncFileEntry","SyncSessionEntry","SyncSessionContent","SharedFileEntry","AgentApiClient","Promise"],"sources":["../src/manifest.ts","../src/ignore.ts","../../agent-api-client/dist/index.d.ts","../src/sync-engine.ts","../src/watcher.ts","../src/uploader.ts","../src/downloader.ts","../src/retry.ts","../src/shared-sync.ts"],"sourcesContent":["//#region ../../packages-internal/types/dist/access.d.ts\n\n/**\n * The four resource scopes at which a permission can apply.\n * Order is meaningful: broader scopes first (`org`) → narrower last (`agent`).\n *\n * `IntegrationScope` in integration.ts and `SecretScope` in secrets.ts are\n * intentional aliases of this same enum — there is only one concept of\n * \"scope\" in Alfe.\n */\ndeclare const ResourceScope: {\n readonly Org: \"org\";\n readonly Team: \"team\";\n readonly Project: \"project\";\n readonly Agent: \"agent\";\n};\ntype ResourceScope = (typeof ResourceScope)[keyof typeof ResourceScope];\n/** Ordered tuple of resource scope string values (broad → narrow). */\n//#endregion\n//#region ../../packages-internal/types/dist/integration.d.ts\n/** Controls where an integration appears: public (everyone), hidden (nowhere) */\ndeclare const IntegrationVisibility: {\n readonly Public: \"public\";\n readonly Hidden: \"hidden\";\n};\ntype IntegrationVisibility = (typeof IntegrationVisibility)[keyof typeof IntegrationVisibility];\n/** Scope at which an integration is installed */\ndeclare const IntegrationScope: {\n readonly Org: \"org\";\n readonly Team: \"team\";\n readonly Project: \"project\";\n readonly Agent: \"agent\";\n};\ntype IntegrationScope = ResourceScope;\ndeclare const IntegrationDesiredStatus: {\n readonly Active: \"active\";\n readonly Removed: \"removed\";\n};\ntype IntegrationDesiredStatus = (typeof IntegrationDesiredStatus)[keyof typeof IntegrationDesiredStatus];\ndeclare const IntegrationActualStatus: {\n readonly Installing: \"installing\";\n readonly Active: \"active\";\n readonly Error: \"error\";\n readonly Removing: \"removing\";\n readonly Inactive: \"inactive\";\n readonly Unknown: \"unknown\";\n};\ntype IntegrationActualStatus = (typeof IntegrationActualStatus)[keyof typeof IntegrationActualStatus];\ninterface IntegrationInstall {\n scope: IntegrationScope;\n scopeId: string;\n integrationId: string;\n tenantId: string;\n desiredStatus: IntegrationDesiredStatus;\n actualStatus: IntegrationActualStatus;\n version: string;\n config: Record<string, unknown>;\n errorMessage: string;\n installedAt: string;\n updatedAt: string;\n}\n/** @deprecated Use IntegrationInstall instead */\n\ninterface IntegrationConfigSchemaField {\n key: string;\n label: string;\n type: string;\n description?: string;\n required?: boolean;\n default?: string | number | boolean;\n options?: string[];\n select_options?: {\n value: string;\n label: string;\n }[];\n oauth_provider?: string;\n oauth_scopes?: string[];\n oauth_integration_id?: string;\n editable?: string;\n hidden?: boolean;\n}\ninterface IntegrationConfigResult {\n integrationId: string;\n config: Record<string, unknown>;\n configSchema: IntegrationConfigSchemaField[];\n}\ninterface RegistryEntry {\n id: string;\n name: string;\n description: string;\n versions: string[];\n latest: string;\n repository: string;\n commit: string;\n icon?: string;\n author?: {\n name: string;\n url?: string;\n } | string;\n pricing?: {\n type: \"free\" | \"paid\" | \"usage\";\n price?: number;\n currency?: string;\n interval?: \"month\" | \"year\";\n description?: string;\n };\n features?: string[];\n preview_images?: string[];\n config_schema?: IntegrationConfigSchemaField[];\n supported_agents?: string[];\n /** Scopes where this integration can be installed */\n supported_scopes?: IntegrationScope[];\n /** Visibility status — controls where integration appears */\n visibility?: IntegrationVisibility;\n}\n//# sourceMappingURL=integration.d.ts.map\n//#endregion\n//#region ../../packages-internal/types/dist/secrets.d.ts\n/** Scope levels at which a secret can be owned. Aliased to ResourceScope. */\ntype SecretScope = ResourceScope;\n/**\n * v1 encrypted envelope as persisted by services/secrets and exchanged with\n * agents. Values are AES-256-GCM ciphertext; iv/authTag/ciphertext/dataKeyCiphertext\n * are all base64-encoded.\n */\ninterface EncryptedEnvelopeV1 {\n version: 1;\n iv: string;\n ciphertext: string;\n authTag: string;\n dataKeyCiphertext: string;\n}\n/**\n * Display/validation hint for a field's value. `\"json\"` signals that the\n * string is a JSON-stringified payload that consumers should `JSON.parse`.\n */\ndeclare const FIELD_FORMATS: readonly [\"text\", \"email\", \"url\", \"phone\", \"date\", \"number\", \"json\"];\ntype FieldFormat = (typeof FIELD_FORMATS)[number];\n/**\n * Whether a field is stored in plaintext (visible to anyone with read access)\n * or encrypted (requires KMS + the right encryption context to read).\n */\ndeclare const FIELD_SENSITIVITIES: readonly [\"plaintext\", \"encrypted\"];\ntype FieldSensitivity = (typeof FIELD_SENSITIVITIES)[number];\n/**\n * A field on a secret. `value` is always a string at the wire; for encrypted\n * fields it's the plaintext at the API edge (the service encrypts before\n * persistence). Reads from the dashboard omit `value` for encrypted fields;\n * agents get a `FieldEnvelope` instead and decrypt locally.\n */\ninterface Field {\n key: string;\n format?: FieldFormat;\n sensitivity: FieldSensitivity;\n value: string;\n}\n/**\n * Secret category — drives icon/template/filter behaviour. Defaults to\n * `\"other\"` for migrated rows.\n */\ndeclare const SECRET_CATEGORIES: readonly [\"login\", \"api_key\", \"database\", \"ssh_key\", \"certificate\", \"secure_note\", \"credit_card\", \"identity\", \"wifi\", \"other\"];\ntype SecretCategory = (typeof SECRET_CATEGORIES)[number];\n/**\n * One field as exposed to readers. Encrypted fields have no `value` on the\n * dashboard read path; the agent-side aggregate carries `envelope` instead.\n */\ninterface FieldView {\n key: string;\n format?: FieldFormat;\n sensitivity: FieldSensitivity;\n /** Present for `sensitivity: \"plaintext\"` only. */\n value?: string;\n /** Present for `sensitivity: \"encrypted\"` on agent-side reads only. */\n envelope?: EncryptedEnvelopeV1;\n /** Plaintext fields that opt into `format: \"json\"` are pre-parsed for callers. */\n parsedValue?: unknown;\n rotatedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n/** A secret as assembled from its multi-row aggregate. */\ninterface SecretAggregate {\n secretId: string;\n secretName: string;\n description?: string;\n tags: string[];\n category: SecretCategory;\n fields: FieldView[];\n changelogVersion: number;\n createdAt: string;\n updatedAt: string;\n}\n/** Metadata-only projection — used by list endpoints. */\ninterface SecretMetadata {\n secretId: string;\n secretName: string;\n description?: string;\n tags: string[];\n category: SecretCategory;\n fieldKeys: string[];\n changelogVersion: number;\n createdAt: string;\n updatedAt: string;\n}\n/**\n * Per-field encrypted envelope returned to agents on the agent-side aggregate.\n * Agents decrypt locally using a data key fetched from `/decrypt-data-key`.\n */\ninterface FieldEnvelope {\n key: string;\n format?: FieldFormat;\n envelope: EncryptedEnvelopeV1;\n rotatedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n/** A scope the caller can read or write secrets in. */\ninterface ScopeInfo {\n scope: SecretScope;\n scopeId: string;\n name?: string;\n}\n/**\n * KMS-issued data key, returned by the secrets service's\n * `/secrets/generate-data-key` KMS proxy endpoint. The plaintext key is\n * returned base64-encoded; callers MUST decode it to a Buffer and zero the\n * Buffer after use — never keep the plaintext as a JS string.\n */\ninterface GeneratedDataKey {\n plaintextKey: string;\n dataKeyCiphertext: string;\n}\n/**\n * Action types recorded in the secret changelog. Append-only.\n */\ndeclare const CHANGELOG_ACTIONS: readonly [\"created\", \"deleted\", \"metadata_updated\", \"field_added\", \"field_rotated\", \"field_removed\", \"tag_added\", \"tag_removed\"];\ntype ChangelogAction = (typeof CHANGELOG_ACTIONS)[number];\n/** Who triggered a changelog entry. */\ninterface ChangelogActor {\n kind: \"user\" | \"agent\" | \"system\";\n id: string;\n}\n/**\n * One audit row from the secret's changelog. Metadata only — never carries\n * field VALUES (old or new). Rolling back a rotated secret is intentionally\n * not supported.\n */\ninterface ChangelogEntry {\n changelogVersion: number;\n action: ChangelogAction;\n fieldKey?: string;\n fieldSensitivity?: FieldSensitivity;\n changedBy: ChangelogActor;\n reason?: string;\n timestamp: string;\n}\n//# sourceMappingURL=secrets.d.ts.map\n//#endregion\n//#region src/index.d.ts\ninterface AgentApiClientConfig {\n apiKey: string;\n apiUrl: string;\n}\ninterface SyncAgentInfo {\n agentId: string;\n tenantId: string;\n displayName: string;\n s3Prefix: string;\n status: \"stale\" | \"syncing\" | \"synced\";\n fileCount?: number;\n totalSize?: number;\n lastSync?: string;\n}\ninterface SyncManifestEntry {\n hash: string;\n size: number;\n modified: string;\n etag?: string;\n storageClass?: string;\n compressed?: boolean;\n}\ninterface SyncManifest {\n version: 1;\n agentId: string;\n lastSync: string;\n files: Record<string, SyncManifestEntry>;\n}\ninterface SyncPresignedUrl {\n path: string;\n url: string;\n expiresAt: string;\n}\ninterface SyncConfirmedUpload {\n filePath: string;\n hash: string;\n size: number;\n storageClass: \"STANDARD\" | \"GLACIER_IR\";\n syncedAt: string;\n}\ninterface SyncReconstructFile {\n path: string;\n size: number;\n url: string;\n storageClass?: string;\n compressed?: boolean;\n}\ninterface SyncReconstructBundle {\n agentId: string;\n mode: \"full\" | \"active\" | \"memory\";\n fileCount: number;\n totalSize: number;\n files: SyncReconstructFile[];\n expiresAt: string;\n}\ninterface SyncAgentStats {\n agentId: string;\n standardBytes: number;\n glacierBytes: number;\n fileCount: number;\n lastSyncAt: string | null;\n}\ninterface SyncFileEntry {\n filePath: string;\n size: number;\n modified: string;\n contentHash: string;\n storageClass?: string;\n compressed?: boolean;\n}\ninterface SyncSessionEntry {\n sessionId: string;\n size: number;\n lastModified: string;\n storageClass?: string;\n isArchived: boolean;\n}\ninterface SyncSessionContent {\n sessionId: string;\n content: string;\n compressed: boolean;\n}\ninterface SharedFileEntry {\n filePath: string;\n fileName: string;\n size: number;\n contentType?: string;\n}\ndeclare class AgentApiClient {\n private readonly apiKey;\n private readonly apiUrl;\n constructor(config: AgentApiClientConfig);\n private request;\n syncRegister(args?: {\n displayName?: string;\n }): Promise<{\n agent: SyncAgentInfo;\n }>;\n syncGetManifest(): Promise<SyncManifest>;\n syncPresign(args: {\n files: {\n path: string;\n operation: \"put\" | \"get\";\n contentType?: string;\n }[];\n }): Promise<{\n urls: SyncPresignedUrl[];\n }>;\n syncConfirmUpload(args: {\n filePath: string;\n hash: string;\n size: number;\n storageClass?: \"STANDARD\" | \"GLACIER_IR\";\n }): Promise<SyncConfirmedUpload>;\n syncReconstruct(args: {\n mode: \"full\" | \"active\" | \"memory\";\n }): Promise<SyncReconstructBundle>;\n syncGetStats(): Promise<SyncAgentStats>;\n syncListFiles(args?: {\n prefix?: string;\n }): Promise<{\n files: SyncFileEntry[];\n }>;\n syncListSessions(): Promise<{\n sessions: SyncSessionEntry[];\n }>;\n syncGetSession(sessionId: string): Promise<SyncSessionContent>;\n syncDeleteFile(filePath: string): Promise<{\n removed: boolean;\n }>;\n sharedListFiles(args: {\n scope: \"org\" | \"team\" | \"project\";\n scopeId: string;\n }): Promise<{\n files: SharedFileEntry[];\n nextCursor: string | null;\n }>;\n sharedDownloadUrl(args: {\n scope: \"org\" | \"team\" | \"project\";\n scopeId: string;\n filePath: string;\n }): Promise<{\n downloadUrl: string;\n expiresIn: number;\n }>;\n listIntegrations(): Promise<IntegrationInstall[]>;\n getIntegrationConfig(integrationId: string): Promise<IntegrationConfigResult>;\n updateIntegrationConfig(integrationId: string, config: Record<string, unknown>): Promise<void>;\n installIntegration(integrationId: string, options?: {\n version?: string;\n config?: Record<string, unknown>;\n }): Promise<IntegrationInstall>;\n removeIntegration(integrationId: string): Promise<IntegrationInstall>;\n getOAuthUrl(provider: string, scopes?: string[]): Promise<{\n url: string;\n provider: string;\n expiresIn: number;\n }>;\n getOAuthStatus(provider: string): Promise<{\n provider: string;\n connected: boolean;\n config?: Record<string, string>;\n }>;\n getRegistry(): Promise<{\n integrations: RegistryEntry[];\n }>;\n getGoogleCredentials(): Promise<{\n accounts?: {\n email: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n enabledServices?: string[];\n isDefault: boolean;\n displayName?: string;\n }[];\n email: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n projectId: string;\n enabledServices?: string[];\n }>;\n disconnectGoogleAccount(email: string): Promise<{\n accounts: {\n email: string;\n displayName?: string;\n isDefault: boolean;\n }[];\n }>;\n setDefaultGoogleAccount(email: string): Promise<{\n accounts: {\n email: string;\n displayName?: string;\n isDefault: boolean;\n }[];\n }>;\n getGoogleChatCredentials(): Promise<{\n email: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n displayName?: string;\n }>;\n getGithubCredentials(): Promise<{\n login: string;\n accessToken: string;\n }>;\n getXeroCredentials(): Promise<{\n accessToken: string;\n accessTokenExpiresAt: string;\n xeroTenantId: string;\n }>;\n refreshXeroToken(): Promise<{\n accessToken: string;\n expiresAt: string;\n }>;\n getNotionCredentials(): Promise<{\n accessToken: string;\n workspaceId: string;\n workspaceName: string;\n }>;\n getAtlassianCredentials(): Promise<{\n accessToken: string;\n refreshToken: string;\n accessTokenExpiresAt: string;\n cloudId: string;\n siteName: string;\n siteUrl: string;\n email: string;\n enabledProducts: string[];\n clientId: string;\n clientSecret: string;\n }>;\n refreshAtlassianToken(): Promise<{\n accessToken: string;\n expiresAt: string;\n }>;\n getMYOBCredentials(): Promise<{\n accessToken: string;\n accessTokenExpiresAt: string;\n myobBusinessId: string;\n clientId: string;\n }>;\n refreshMYOBToken(): Promise<{\n accessToken: string;\n expiresAt: string;\n }>;\n getTeamsCredentials(): Promise<{\n agentId: string;\n tenantId: string;\n azureAppId: string;\n azureBotId: string;\n azureClientSecret: string;\n botDisplayName?: string;\n teamsTenantId?: string;\n serviceUrl?: string;\n }>;\n sendTeamsMessage(data: {\n conversationId: string;\n text?: string;\n adaptiveCard?: Record<string, unknown>;\n }): Promise<{\n ok: boolean;\n activityId: string;\n }>;\n listTeamsChannels(): Promise<{\n channels: {\n id: string;\n name: string;\n description?: string;\n }[];\n }>;\n presignAttachments(files: {\n filename: string;\n mimeType: string;\n size: number;\n }[]): Promise<{\n attachments: {\n id: string;\n uploadUrl: string;\n downloadUrl: string;\n s3Key: string;\n expiresAt: string;\n }[];\n }>;\n recordActivity(data: {\n userId?: string;\n channel: string;\n role: \"user\" | \"assistant\";\n }): Promise<{\n recorded: boolean;\n }>;\n /**\n * Mint a fresh AES-256 data key for a specific (secret, field) pair. The\n * encryption context is rebuilt server-side from `auth.tenantId` + the body\n * fields including `fieldKey`; the agent cannot forge context for a scope\n * or field it doesn't own. Legacy single-envelope secrets are migrated to\n * `field#value` rows by the data migration, so call with `fieldKey: \"value\"`\n * to reach them.\n */\n generateSecretDataKey(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n }): Promise<GeneratedDataKey>;\n /**\n * Unwrap a wrapped data key so the agent can decrypt the envelope locally.\n * `fieldKey` MUST match the value supplied when the data key was generated\n * (it's bound into KMS encryption context); mismatch fails with\n * `InvalidCiphertextException`.\n */\n decryptSecretDataKey(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n dataKeyCiphertext: string;\n }): Promise<{\n plaintextKey: string;\n }>;\n /**\n * Create a new secret with one or more fields. Encrypted fields must arrive\n * pre-sealed (the agent has already obtained per-field data keys via\n * `generateSecretDataKey({ ..., fieldKey })` and AES-encrypted locally).\n * Plaintext fields ship the value inline.\n */\n createSecret(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n secretName: string;\n category?: SecretCategory;\n description?: string;\n tags?: string[];\n fields: {\n key: string;\n format?: FieldFormat;\n sensitivity: FieldSensitivity;\n value?: string;\n envelope?: EncryptedEnvelopeV1;\n }[];\n reason?: string;\n }): Promise<SecretAggregate>;\n /** Fetch the secret aggregate plus per-field encrypted envelopes. */\n getSecret(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n }): Promise<{\n aggregate: SecretAggregate;\n envelopes: FieldEnvelope[];\n }>;\n /** Fetch one field. Plaintext: value inline. Encrypted: envelope. */\n getSecretField(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n }): Promise<{\n key: string;\n sensitivity: FieldSensitivity;\n format?: FieldFormat;\n value?: string;\n envelope?: EncryptedEnvelopeV1;\n rotatedAt?: string;\n createdAt: string;\n updatedAt: string;\n }>;\n /** Add OR rotate one field. */\n setSecretField(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n sensitivity: FieldSensitivity;\n format?: FieldFormat;\n value?: string;\n envelope?: EncryptedEnvelopeV1;\n reason?: string;\n }): Promise<{\n fieldKey: string;\n rotated: boolean;\n }>;\n /** Remove one field. */\n removeSecretField(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n }): Promise<void>;\n /** Update secret-level metadata (name/description/tags/category). */\n updateSecretMetadata(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n secretName?: string;\n description?: string;\n tags?: string[];\n category?: SecretCategory;\n reason?: string;\n }): Promise<SecretAggregate>;\n /** List metadata for secrets in a scope. Optional filters route through the byFacet GSI. */\n listSecrets(args: {\n scope: SecretScope;\n scopeId: string;\n category?: SecretCategory;\n tag?: string;\n fieldKey?: string;\n }): Promise<SecretMetadata[]>;\n /** Bounded changelog read — metadata-only audit entries. */\n getSecretHistory(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n limit?: number;\n cursor?: string;\n }): Promise<{\n entries: ChangelogEntry[];\n nextCursor?: string;\n }>;\n /** Delete a secret (and all its field rows + tag rows + changelog rows). */\n deleteSecret(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n }): Promise<void>;\n /** Enumerate scopes (org/team/project/agent) this agent can access. */\n listSecretScopes(): Promise<ScopeInfo[]>;\n resolveIdentity(args: {\n provider: string;\n platformId: string;\n kind?: \"user\" | \"agent\" | \"service\" | \"bot\" | \"workspace\";\n displayName?: string;\n }): Promise<{\n identityId: string | null;\n status: string;\n created?: boolean;\n reason?: string;\n /**\n * Flattened auriclabs permission strings for the resolved identity\n * (scope-prefixed where applicable). Empty array on miss / org service\n * outage — the runtime gate fails closed in that case.\n */\n permissions: string[];\n }>;\n searchIdentities(args?: {\n q?: string;\n status?: string;\n limit?: number;\n }): Promise<{\n identities: unknown[];\n }>;\n getIdentityContext(identityId: string): Promise<{\n context: unknown;\n }>;\n mergeIdentities(survivorId: string, args: {\n mergedId: string;\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n error?: string;\n }>;\n unmergeIdentity(identityId: string, args: {\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n error?: string;\n }>;\n addIdentityNote(identityId: string, args: {\n content: string;\n category?: string;\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n noteId: string | null;\n }>;\n tagIdentity(identityId: string, args: {\n tag: string;\n action: \"add\" | \"remove\";\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n }>;\n getIdentityChangelog(identityId: string, args?: {\n limit?: number;\n }): Promise<{\n entries: unknown[];\n }>;\n rollbackIdentity(identityId: string, args: {\n targetVersion: number;\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n entry?: unknown;\n }>;\n requestIdentityVerification(args: {\n claimedIdentityId: string;\n requestingIdentityId: string;\n requestingProvider: string;\n requestingPlatformId: string;\n preferredChannel?: \"mobile\" | \"email\";\n /**\n * Phase 2: agent-supplied contact endpoint. When provided, the top-level\n * `preferredChannel` is ignored — the contact's channel wins.\n */\n contact?: {\n channel: \"email\" | \"mobile\";\n value: string;\n };\n }): Promise<{\n verificationId: string;\n channel: string;\n deliveredTo: string;\n expiresAt: string;\n availableChannels: {\n channel: string;\n deliveredTo: string;\n }[];\n } | {\n error: string;\n }>;\n confirmIdentityVerification(args: {\n claimedIdentityId: string;\n verificationId: string;\n phrase: string;\n }): Promise<{\n verified: boolean;\n identityId?: string;\n /** Phase 2: how the confirm resolved — Scenario A vs B. */\n action?: \"merged\" | \"contact_verified\";\n error?: string;\n }>;\n /**\n * Update display-shape fields on an Identity. Body excludes `email` /\n * `phone` / `title` / `company` / `metadata` per Section D4 — contacts go\n * via the verify flow, title/company live on OrgMembership, metadata is\n * not agent-writable.\n */\n updateIdentity(identityId: string, args: {\n name?: string;\n avatarUrl?: string;\n timezone?: string;\n locale?: string;\n }): Promise<{\n ok: boolean;\n }>;\n /**\n * Phase 2 (Section H): server-side verification of a Google Chat sender via\n * the agent's existing Google OAuth credentials. Returns the resolved\n * identity (created or matched via Scenario-B email enrichment).\n */\n resolveGoogleChatSender(args: {\n senderUserId: string;\n spaceId?: string;\n }): Promise<{\n identityId: string | null;\n status: string;\n }>;\n memorySearch(query: string, opts?: {\n limit?: number;\n topic?: string;\n subtopic?: string;\n tag?: string;\n includeKnowledge?: boolean;\n }): Promise<{\n facts: {\n subject: string;\n predicate: string;\n object: string;\n since: string;\n confidence: number;\n }[];\n memories: {\n id: string;\n text: string;\n topic: string;\n subtopic: string;\n tag: string;\n importance: number;\n timestamp: number;\n score: number;\n }[];\n }>;\n memoryStore(text: string, opts?: {\n topic?: string;\n subtopic?: string;\n tag?: string;\n importance?: number;\n }): Promise<{\n memoryId: string;\n }>;\n memoryIngest(sessionKey: string, messages: {\n role: string;\n content: string;\n index: number;\n timestamp?: string;\n }[], metadata?: {\n channelId?: string;\n userId?: string;\n userName?: string;\n }): Promise<{\n queued: boolean;\n messageCount: number;\n }>;\n memoryLoadContext(tier?: number, topicHint?: string): Promise<{\n formatted: string;\n [key: string]: unknown;\n }>;\n memoryLookupEntity(subject: string): Promise<{\n subject: string;\n triples: {\n tripleId: string;\n predicate: string;\n object: string;\n validFrom: string;\n validTo?: string;\n confidence: number;\n }[];\n }>;\n memoryNavigate(): Promise<{\n topics: {\n name: string;\n tripleCount: number;\n subtopics: string[];\n }[];\n cursor: string | null;\n }>;\n memoryDelete(memoryId: string): Promise<{\n deleted: boolean;\n }>;\n memoryStats(): Promise<{\n vectorCount: number;\n tripleCount: number;\n storageEstimateBytes: number;\n lastIngestionAt?: string;\n }>;\n memoryLearn(args: {\n text: string;\n source?: string;\n sourceType?: \"file\" | \"url\" | \"inline\";\n metadata?: {\n sessionId?: string;\n channelId?: string;\n userName?: string;\n };\n }): Promise<{\n memoriesStored: number;\n triplesStored: number;\n chunks: number;\n source?: string;\n }>;\n memoryBootstrapStatus(): Promise<{\n synced: boolean;\n syncedAt?: string;\n }>;\n memoryBootstrapStatusMark(): Promise<{\n synced: true;\n syncedAt: string;\n }>;\n searchWeb(params: {\n query: string;\n count?: number;\n offset?: number;\n country?: string;\n freshness?: string;\n }): Promise<unknown>;\n searchImages(params: {\n query: string;\n count?: number;\n }): Promise<unknown>;\n searchNews(params: {\n query: string;\n count?: number;\n freshness?: string;\n }): Promise<unknown>;\n registerDatabaseCredentials(): Promise<{\n connectionString: string;\n username: string;\n password: string;\n databases: string[];\n }>;\n reportDatabaseAudit(entry: {\n database: string;\n collection: string;\n operation: string;\n summary?: string;\n }): Promise<void>;\n}\n//# sourceMappingURL=index.d.ts.map\n//#endregion\nexport { AgentApiClient, AgentApiClientConfig, type ChangelogAction, type ChangelogActor, type ChangelogEntry, type EncryptedEnvelopeV1, type Field, type FieldEnvelope, type FieldFormat, type FieldSensitivity, type FieldView, type GeneratedDataKey, type IntegrationConfigResult, type IntegrationConfigSchemaField, type IntegrationInstall, type RegistryEntry, type ScopeInfo, type SecretAggregate, type SecretCategory, type SecretMetadata, type SecretScope, SharedFileEntry, SyncAgentInfo, SyncAgentStats, SyncConfirmedUpload, SyncFileEntry, SyncManifest, SyncManifestEntry, SyncPresignedUrl, SyncReconstructBundle, SyncReconstructFile, SyncSessionContent, SyncSessionEntry };\n//# sourceMappingURL=index.d.ts.map"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -792,9 +792,14 @@ declare class AgentApiClient {
792
792
  }): Promise<{
793
793
  identityId: string | null;
794
794
  status: string;
795
- accessAllowed: boolean;
796
795
  created?: boolean;
797
796
  reason?: string;
797
+ /**
798
+ * Flattened auriclabs permission strings for the resolved identity
799
+ * (scope-prefixed where applicable). Empty array on miss / org service
800
+ * outage — the runtime gate fails closed in that case.
801
+ */
802
+ permissions: string[];
798
803
  }>;
799
804
  searchIdentities(args?: {
800
805
  q?: string;
@@ -927,7 +932,6 @@ declare class AgentApiClient {
927
932
  }): Promise<{
928
933
  identityId: string | null;
929
934
  status: string;
930
- accessAllowed: boolean;
931
935
  }>;
932
936
  memorySearch(query: string, opts?: {
933
937
  limit?: number;
@@ -1007,6 +1011,29 @@ declare class AgentApiClient {
1007
1011
  storageEstimateBytes: number;
1008
1012
  lastIngestionAt?: string;
1009
1013
  }>;
1014
+ memoryLearn(args: {
1015
+ text: string;
1016
+ source?: string;
1017
+ sourceType?: "file" | "url" | "inline";
1018
+ metadata?: {
1019
+ sessionId?: string;
1020
+ channelId?: string;
1021
+ userName?: string;
1022
+ };
1023
+ }): Promise<{
1024
+ memoriesStored: number;
1025
+ triplesStored: number;
1026
+ chunks: number;
1027
+ source?: string;
1028
+ }>;
1029
+ memoryBootstrapStatus(): Promise<{
1030
+ synced: boolean;
1031
+ syncedAt?: string;
1032
+ }>;
1033
+ memoryBootstrapStatusMark(): Promise<{
1034
+ synced: true;
1035
+ syncedAt: string;
1036
+ }>;
1010
1037
  searchWeb(params: {
1011
1038
  query: string;
1012
1039
  count?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":["ResourceScope","IntegrationVisibility","IntegrationScope","IntegrationDesiredStatus","IntegrationActualStatus","IntegrationInstall","Record","IntegrationConfigSchemaField","IntegrationConfigResult","RegistryEntry","SecretScope","EncryptedEnvelopeV1","FIELD_FORMATS","FieldFormat","FIELD_SENSITIVITIES","FieldSensitivity","Field","SECRET_CATEGORIES","SecretCategory","FieldView","SecretAggregate","SecretMetadata","FieldEnvelope","ScopeInfo","GeneratedDataKey","CHANGELOG_ACTIONS","ChangelogAction","ChangelogActor","ChangelogEntry","AgentApiClientConfig","SyncAgentInfo","SyncManifestEntry","SyncManifest","SyncPresignedUrl","SyncConfirmedUpload","SyncReconstructFile","SyncReconstructBundle","SyncAgentStats","SyncFileEntry","SyncSessionEntry","SyncSessionContent","SharedFileEntry","AgentApiClient","Promise"],"sources":["../src/manifest.ts","../src/ignore.ts","../../agent-api-client/dist/index.d.ts","../src/sync-engine.ts","../src/watcher.ts","../src/uploader.ts","../src/downloader.ts","../src/retry.ts","../src/shared-sync.ts"],"sourcesContent":["//#region ../../packages-internal/types/dist/access.d.ts\n\n/**\n * The four resource scopes at which a permission can apply.\n * Order is meaningful: broader scopes first (`org`) → narrower last (`agent`).\n *\n * `IntegrationScope` in integration.ts and `SecretScope` in secrets.ts are\n * intentional aliases of this same enum — there is only one concept of\n * \"scope\" in Alfe.\n */\ndeclare const ResourceScope: {\n readonly Org: \"org\";\n readonly Team: \"team\";\n readonly Project: \"project\";\n readonly Agent: \"agent\";\n};\ntype ResourceScope = (typeof ResourceScope)[keyof typeof ResourceScope];\n/** Ordered tuple of resource scope string values (broad → narrow). */\n//#endregion\n//#region ../../packages-internal/types/dist/integration.d.ts\n/** Controls where an integration appears: public (everyone), hidden (nowhere) */\ndeclare const IntegrationVisibility: {\n readonly Public: \"public\";\n readonly Hidden: \"hidden\";\n};\ntype IntegrationVisibility = (typeof IntegrationVisibility)[keyof typeof IntegrationVisibility];\n/** Scope at which an integration is installed */\ndeclare const IntegrationScope: {\n readonly Org: \"org\";\n readonly Team: \"team\";\n readonly Project: \"project\";\n readonly Agent: \"agent\";\n};\ntype IntegrationScope = ResourceScope;\ndeclare const IntegrationDesiredStatus: {\n readonly Active: \"active\";\n readonly Removed: \"removed\";\n};\ntype IntegrationDesiredStatus = (typeof IntegrationDesiredStatus)[keyof typeof IntegrationDesiredStatus];\ndeclare const IntegrationActualStatus: {\n readonly Installing: \"installing\";\n readonly Active: \"active\";\n readonly Error: \"error\";\n readonly Removing: \"removing\";\n readonly Inactive: \"inactive\";\n readonly Unknown: \"unknown\";\n};\ntype IntegrationActualStatus = (typeof IntegrationActualStatus)[keyof typeof IntegrationActualStatus];\ninterface IntegrationInstall {\n scope: IntegrationScope;\n scopeId: string;\n integrationId: string;\n tenantId: string;\n desiredStatus: IntegrationDesiredStatus;\n actualStatus: IntegrationActualStatus;\n version: string;\n config: Record<string, unknown>;\n errorMessage: string;\n installedAt: string;\n updatedAt: string;\n}\n/** @deprecated Use IntegrationInstall instead */\n\ninterface IntegrationConfigSchemaField {\n key: string;\n label: string;\n type: string;\n description?: string;\n required?: boolean;\n default?: string | number | boolean;\n options?: string[];\n select_options?: {\n value: string;\n label: string;\n }[];\n oauth_provider?: string;\n oauth_scopes?: string[];\n oauth_integration_id?: string;\n editable?: string;\n hidden?: boolean;\n}\ninterface IntegrationConfigResult {\n integrationId: string;\n config: Record<string, unknown>;\n configSchema: IntegrationConfigSchemaField[];\n}\ninterface RegistryEntry {\n id: string;\n name: string;\n description: string;\n versions: string[];\n latest: string;\n repository: string;\n commit: string;\n icon?: string;\n author?: {\n name: string;\n url?: string;\n } | string;\n pricing?: {\n type: \"free\" | \"paid\" | \"usage\";\n price?: number;\n currency?: string;\n interval?: \"month\" | \"year\";\n description?: string;\n };\n features?: string[];\n preview_images?: string[];\n config_schema?: IntegrationConfigSchemaField[];\n supported_agents?: string[];\n /** Scopes where this integration can be installed */\n supported_scopes?: IntegrationScope[];\n /** Visibility status — controls where integration appears */\n visibility?: IntegrationVisibility;\n}\n//# sourceMappingURL=integration.d.ts.map\n//#endregion\n//#region ../../packages-internal/types/dist/secrets.d.ts\n/** Scope levels at which a secret can be owned. Aliased to ResourceScope. */\ntype SecretScope = ResourceScope;\n/**\n * v1 encrypted envelope as persisted by services/secrets and exchanged with\n * agents. Values are AES-256-GCM ciphertext; iv/authTag/ciphertext/dataKeyCiphertext\n * are all base64-encoded.\n */\ninterface EncryptedEnvelopeV1 {\n version: 1;\n iv: string;\n ciphertext: string;\n authTag: string;\n dataKeyCiphertext: string;\n}\n/**\n * Display/validation hint for a field's value. `\"json\"` signals that the\n * string is a JSON-stringified payload that consumers should `JSON.parse`.\n */\ndeclare const FIELD_FORMATS: readonly [\"text\", \"email\", \"url\", \"phone\", \"date\", \"number\", \"json\"];\ntype FieldFormat = (typeof FIELD_FORMATS)[number];\n/**\n * Whether a field is stored in plaintext (visible to anyone with read access)\n * or encrypted (requires KMS + the right encryption context to read).\n */\ndeclare const FIELD_SENSITIVITIES: readonly [\"plaintext\", \"encrypted\"];\ntype FieldSensitivity = (typeof FIELD_SENSITIVITIES)[number];\n/**\n * A field on a secret. `value` is always a string at the wire; for encrypted\n * fields it's the plaintext at the API edge (the service encrypts before\n * persistence). Reads from the dashboard omit `value` for encrypted fields;\n * agents get a `FieldEnvelope` instead and decrypt locally.\n */\ninterface Field {\n key: string;\n format?: FieldFormat;\n sensitivity: FieldSensitivity;\n value: string;\n}\n/**\n * Secret category — drives icon/template/filter behaviour. Defaults to\n * `\"other\"` for migrated rows.\n */\ndeclare const SECRET_CATEGORIES: readonly [\"login\", \"api_key\", \"database\", \"ssh_key\", \"certificate\", \"secure_note\", \"credit_card\", \"identity\", \"wifi\", \"other\"];\ntype SecretCategory = (typeof SECRET_CATEGORIES)[number];\n/**\n * One field as exposed to readers. Encrypted fields have no `value` on the\n * dashboard read path; the agent-side aggregate carries `envelope` instead.\n */\ninterface FieldView {\n key: string;\n format?: FieldFormat;\n sensitivity: FieldSensitivity;\n /** Present for `sensitivity: \"plaintext\"` only. */\n value?: string;\n /** Present for `sensitivity: \"encrypted\"` on agent-side reads only. */\n envelope?: EncryptedEnvelopeV1;\n /** Plaintext fields that opt into `format: \"json\"` are pre-parsed for callers. */\n parsedValue?: unknown;\n rotatedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n/** A secret as assembled from its multi-row aggregate. */\ninterface SecretAggregate {\n secretId: string;\n secretName: string;\n description?: string;\n tags: string[];\n category: SecretCategory;\n fields: FieldView[];\n changelogVersion: number;\n createdAt: string;\n updatedAt: string;\n}\n/** Metadata-only projection — used by list endpoints. */\ninterface SecretMetadata {\n secretId: string;\n secretName: string;\n description?: string;\n tags: string[];\n category: SecretCategory;\n fieldKeys: string[];\n changelogVersion: number;\n createdAt: string;\n updatedAt: string;\n}\n/**\n * Per-field encrypted envelope returned to agents on the agent-side aggregate.\n * Agents decrypt locally using a data key fetched from `/decrypt-data-key`.\n */\ninterface FieldEnvelope {\n key: string;\n format?: FieldFormat;\n envelope: EncryptedEnvelopeV1;\n rotatedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n/** A scope the caller can read or write secrets in. */\ninterface ScopeInfo {\n scope: SecretScope;\n scopeId: string;\n name?: string;\n}\n/**\n * KMS-issued data key, returned by the secrets service's\n * `/secrets/generate-data-key` KMS proxy endpoint. The plaintext key is\n * returned base64-encoded; callers MUST decode it to a Buffer and zero the\n * Buffer after use — never keep the plaintext as a JS string.\n */\ninterface GeneratedDataKey {\n plaintextKey: string;\n dataKeyCiphertext: string;\n}\n/**\n * Action types recorded in the secret changelog. Append-only.\n */\ndeclare const CHANGELOG_ACTIONS: readonly [\"created\", \"deleted\", \"metadata_updated\", \"field_added\", \"field_rotated\", \"field_removed\", \"tag_added\", \"tag_removed\"];\ntype ChangelogAction = (typeof CHANGELOG_ACTIONS)[number];\n/** Who triggered a changelog entry. */\ninterface ChangelogActor {\n kind: \"user\" | \"agent\" | \"system\";\n id: string;\n}\n/**\n * One audit row from the secret's changelog. Metadata only — never carries\n * field VALUES (old or new). Rolling back a rotated secret is intentionally\n * not supported.\n */\ninterface ChangelogEntry {\n changelogVersion: number;\n action: ChangelogAction;\n fieldKey?: string;\n fieldSensitivity?: FieldSensitivity;\n changedBy: ChangelogActor;\n reason?: string;\n timestamp: string;\n}\n//# sourceMappingURL=secrets.d.ts.map\n//#endregion\n//#region src/index.d.ts\ninterface AgentApiClientConfig {\n apiKey: string;\n apiUrl: string;\n}\ninterface SyncAgentInfo {\n agentId: string;\n tenantId: string;\n displayName: string;\n s3Prefix: string;\n status: \"stale\" | \"syncing\" | \"synced\";\n fileCount?: number;\n totalSize?: number;\n lastSync?: string;\n}\ninterface SyncManifestEntry {\n hash: string;\n size: number;\n modified: string;\n etag?: string;\n storageClass?: string;\n compressed?: boolean;\n}\ninterface SyncManifest {\n version: 1;\n agentId: string;\n lastSync: string;\n files: Record<string, SyncManifestEntry>;\n}\ninterface SyncPresignedUrl {\n path: string;\n url: string;\n expiresAt: string;\n}\ninterface SyncConfirmedUpload {\n filePath: string;\n hash: string;\n size: number;\n storageClass: \"STANDARD\" | \"GLACIER_IR\";\n syncedAt: string;\n}\ninterface SyncReconstructFile {\n path: string;\n size: number;\n url: string;\n storageClass?: string;\n compressed?: boolean;\n}\ninterface SyncReconstructBundle {\n agentId: string;\n mode: \"full\" | \"active\" | \"memory\";\n fileCount: number;\n totalSize: number;\n files: SyncReconstructFile[];\n expiresAt: string;\n}\ninterface SyncAgentStats {\n agentId: string;\n standardBytes: number;\n glacierBytes: number;\n fileCount: number;\n lastSyncAt: string | null;\n}\ninterface SyncFileEntry {\n filePath: string;\n size: number;\n modified: string;\n contentHash: string;\n storageClass?: string;\n compressed?: boolean;\n}\ninterface SyncSessionEntry {\n sessionId: string;\n size: number;\n lastModified: string;\n storageClass?: string;\n isArchived: boolean;\n}\ninterface SyncSessionContent {\n sessionId: string;\n content: string;\n compressed: boolean;\n}\ninterface SharedFileEntry {\n filePath: string;\n fileName: string;\n size: number;\n contentType?: string;\n}\ndeclare class AgentApiClient {\n private readonly apiKey;\n private readonly apiUrl;\n constructor(config: AgentApiClientConfig);\n private request;\n syncRegister(args?: {\n displayName?: string;\n }): Promise<{\n agent: SyncAgentInfo;\n }>;\n syncGetManifest(): Promise<SyncManifest>;\n syncPresign(args: {\n files: {\n path: string;\n operation: \"put\" | \"get\";\n contentType?: string;\n }[];\n }): Promise<{\n urls: SyncPresignedUrl[];\n }>;\n syncConfirmUpload(args: {\n filePath: string;\n hash: string;\n size: number;\n storageClass?: \"STANDARD\" | \"GLACIER_IR\";\n }): Promise<SyncConfirmedUpload>;\n syncReconstruct(args: {\n mode: \"full\" | \"active\" | \"memory\";\n }): Promise<SyncReconstructBundle>;\n syncGetStats(): Promise<SyncAgentStats>;\n syncListFiles(args?: {\n prefix?: string;\n }): Promise<{\n files: SyncFileEntry[];\n }>;\n syncListSessions(): Promise<{\n sessions: SyncSessionEntry[];\n }>;\n syncGetSession(sessionId: string): Promise<SyncSessionContent>;\n syncDeleteFile(filePath: string): Promise<{\n removed: boolean;\n }>;\n sharedListFiles(args: {\n scope: \"org\" | \"team\" | \"project\";\n scopeId: string;\n }): Promise<{\n files: SharedFileEntry[];\n nextCursor: string | null;\n }>;\n sharedDownloadUrl(args: {\n scope: \"org\" | \"team\" | \"project\";\n scopeId: string;\n filePath: string;\n }): Promise<{\n downloadUrl: string;\n expiresIn: number;\n }>;\n listIntegrations(): Promise<IntegrationInstall[]>;\n getIntegrationConfig(integrationId: string): Promise<IntegrationConfigResult>;\n updateIntegrationConfig(integrationId: string, config: Record<string, unknown>): Promise<void>;\n installIntegration(integrationId: string, options?: {\n version?: string;\n config?: Record<string, unknown>;\n }): Promise<IntegrationInstall>;\n removeIntegration(integrationId: string): Promise<IntegrationInstall>;\n getOAuthUrl(provider: string, scopes?: string[]): Promise<{\n url: string;\n provider: string;\n expiresIn: number;\n }>;\n getOAuthStatus(provider: string): Promise<{\n provider: string;\n connected: boolean;\n config?: Record<string, string>;\n }>;\n getRegistry(): Promise<{\n integrations: RegistryEntry[];\n }>;\n getGoogleCredentials(): Promise<{\n accounts?: {\n email: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n enabledServices?: string[];\n isDefault: boolean;\n displayName?: string;\n }[];\n email: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n projectId: string;\n enabledServices?: string[];\n }>;\n disconnectGoogleAccount(email: string): Promise<{\n accounts: {\n email: string;\n displayName?: string;\n isDefault: boolean;\n }[];\n }>;\n setDefaultGoogleAccount(email: string): Promise<{\n accounts: {\n email: string;\n displayName?: string;\n isDefault: boolean;\n }[];\n }>;\n getGoogleChatCredentials(): Promise<{\n email: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n displayName?: string;\n }>;\n getGithubCredentials(): Promise<{\n login: string;\n accessToken: string;\n }>;\n getXeroCredentials(): Promise<{\n accessToken: string;\n accessTokenExpiresAt: string;\n xeroTenantId: string;\n }>;\n refreshXeroToken(): Promise<{\n accessToken: string;\n expiresAt: string;\n }>;\n getNotionCredentials(): Promise<{\n accessToken: string;\n workspaceId: string;\n workspaceName: string;\n }>;\n getAtlassianCredentials(): Promise<{\n accessToken: string;\n refreshToken: string;\n accessTokenExpiresAt: string;\n cloudId: string;\n siteName: string;\n siteUrl: string;\n email: string;\n enabledProducts: string[];\n clientId: string;\n clientSecret: string;\n }>;\n refreshAtlassianToken(): Promise<{\n accessToken: string;\n expiresAt: string;\n }>;\n getMYOBCredentials(): Promise<{\n accessToken: string;\n accessTokenExpiresAt: string;\n myobBusinessId: string;\n clientId: string;\n }>;\n refreshMYOBToken(): Promise<{\n accessToken: string;\n expiresAt: string;\n }>;\n getTeamsCredentials(): Promise<{\n agentId: string;\n tenantId: string;\n azureAppId: string;\n azureBotId: string;\n azureClientSecret: string;\n botDisplayName?: string;\n teamsTenantId?: string;\n serviceUrl?: string;\n }>;\n sendTeamsMessage(data: {\n conversationId: string;\n text?: string;\n adaptiveCard?: Record<string, unknown>;\n }): Promise<{\n ok: boolean;\n activityId: string;\n }>;\n listTeamsChannels(): Promise<{\n channels: {\n id: string;\n name: string;\n description?: string;\n }[];\n }>;\n presignAttachments(files: {\n filename: string;\n mimeType: string;\n size: number;\n }[]): Promise<{\n attachments: {\n id: string;\n uploadUrl: string;\n downloadUrl: string;\n s3Key: string;\n expiresAt: string;\n }[];\n }>;\n recordActivity(data: {\n userId?: string;\n channel: string;\n role: \"user\" | \"assistant\";\n }): Promise<{\n recorded: boolean;\n }>;\n /**\n * Mint a fresh AES-256 data key for a specific (secret, field) pair. The\n * encryption context is rebuilt server-side from `auth.tenantId` + the body\n * fields including `fieldKey`; the agent cannot forge context for a scope\n * or field it doesn't own. Legacy single-envelope secrets are migrated to\n * `field#value` rows by the data migration, so call with `fieldKey: \"value\"`\n * to reach them.\n */\n generateSecretDataKey(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n }): Promise<GeneratedDataKey>;\n /**\n * Unwrap a wrapped data key so the agent can decrypt the envelope locally.\n * `fieldKey` MUST match the value supplied when the data key was generated\n * (it's bound into KMS encryption context); mismatch fails with\n * `InvalidCiphertextException`.\n */\n decryptSecretDataKey(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n dataKeyCiphertext: string;\n }): Promise<{\n plaintextKey: string;\n }>;\n /**\n * Create a new secret with one or more fields. Encrypted fields must arrive\n * pre-sealed (the agent has already obtained per-field data keys via\n * `generateSecretDataKey({ ..., fieldKey })` and AES-encrypted locally).\n * Plaintext fields ship the value inline.\n */\n createSecret(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n secretName: string;\n category?: SecretCategory;\n description?: string;\n tags?: string[];\n fields: {\n key: string;\n format?: FieldFormat;\n sensitivity: FieldSensitivity;\n value?: string;\n envelope?: EncryptedEnvelopeV1;\n }[];\n reason?: string;\n }): Promise<SecretAggregate>;\n /** Fetch the secret aggregate plus per-field encrypted envelopes. */\n getSecret(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n }): Promise<{\n aggregate: SecretAggregate;\n envelopes: FieldEnvelope[];\n }>;\n /** Fetch one field. Plaintext: value inline. Encrypted: envelope. */\n getSecretField(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n }): Promise<{\n key: string;\n sensitivity: FieldSensitivity;\n format?: FieldFormat;\n value?: string;\n envelope?: EncryptedEnvelopeV1;\n rotatedAt?: string;\n createdAt: string;\n updatedAt: string;\n }>;\n /** Add OR rotate one field. */\n setSecretField(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n sensitivity: FieldSensitivity;\n format?: FieldFormat;\n value?: string;\n envelope?: EncryptedEnvelopeV1;\n reason?: string;\n }): Promise<{\n fieldKey: string;\n rotated: boolean;\n }>;\n /** Remove one field. */\n removeSecretField(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n }): Promise<void>;\n /** Update secret-level metadata (name/description/tags/category). */\n updateSecretMetadata(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n secretName?: string;\n description?: string;\n tags?: string[];\n category?: SecretCategory;\n reason?: string;\n }): Promise<SecretAggregate>;\n /** List metadata for secrets in a scope. Optional filters route through the byFacet GSI. */\n listSecrets(args: {\n scope: SecretScope;\n scopeId: string;\n category?: SecretCategory;\n tag?: string;\n fieldKey?: string;\n }): Promise<SecretMetadata[]>;\n /** Bounded changelog read — metadata-only audit entries. */\n getSecretHistory(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n limit?: number;\n cursor?: string;\n }): Promise<{\n entries: ChangelogEntry[];\n nextCursor?: string;\n }>;\n /** Delete a secret (and all its field rows + tag rows + changelog rows). */\n deleteSecret(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n }): Promise<void>;\n /** Enumerate scopes (org/team/project/agent) this agent can access. */\n listSecretScopes(): Promise<ScopeInfo[]>;\n resolveIdentity(args: {\n provider: string;\n platformId: string;\n kind?: \"user\" | \"agent\" | \"service\" | \"bot\" | \"workspace\";\n displayName?: string;\n }): Promise<{\n identityId: string | null;\n status: string;\n accessAllowed: boolean;\n created?: boolean;\n reason?: string;\n }>;\n searchIdentities(args?: {\n q?: string;\n status?: string;\n limit?: number;\n }): Promise<{\n identities: unknown[];\n }>;\n getIdentityContext(identityId: string): Promise<{\n context: unknown;\n }>;\n mergeIdentities(survivorId: string, args: {\n mergedId: string;\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n error?: string;\n }>;\n unmergeIdentity(identityId: string, args: {\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n error?: string;\n }>;\n addIdentityNote(identityId: string, args: {\n content: string;\n category?: string;\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n noteId: string | null;\n }>;\n tagIdentity(identityId: string, args: {\n tag: string;\n action: \"add\" | \"remove\";\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n }>;\n getIdentityChangelog(identityId: string, args?: {\n limit?: number;\n }): Promise<{\n entries: unknown[];\n }>;\n rollbackIdentity(identityId: string, args: {\n targetVersion: number;\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n entry?: unknown;\n }>;\n requestIdentityVerification(args: {\n claimedIdentityId: string;\n requestingIdentityId: string;\n requestingProvider: string;\n requestingPlatformId: string;\n preferredChannel?: \"mobile\" | \"email\";\n /**\n * Phase 2: agent-supplied contact endpoint. When provided, the top-level\n * `preferredChannel` is ignored — the contact's channel wins.\n */\n contact?: {\n channel: \"email\" | \"mobile\";\n value: string;\n };\n }): Promise<{\n verificationId: string;\n channel: string;\n deliveredTo: string;\n expiresAt: string;\n availableChannels: {\n channel: string;\n deliveredTo: string;\n }[];\n } | {\n error: string;\n }>;\n confirmIdentityVerification(args: {\n claimedIdentityId: string;\n verificationId: string;\n phrase: string;\n }): Promise<{\n verified: boolean;\n identityId?: string;\n /** Phase 2: how the confirm resolved — Scenario A vs B. */\n action?: \"merged\" | \"contact_verified\";\n error?: string;\n }>;\n /**\n * Update display-shape fields on an Identity. Body excludes `email` /\n * `phone` / `title` / `company` / `metadata` per Section D4 — contacts go\n * via the verify flow, title/company live on OrgMembership, metadata is\n * not agent-writable.\n */\n updateIdentity(identityId: string, args: {\n name?: string;\n avatarUrl?: string;\n timezone?: string;\n locale?: string;\n }): Promise<{\n ok: boolean;\n }>;\n /**\n * Phase 2 (Section H): server-side verification of a Google Chat sender via\n * the agent's existing Google OAuth credentials. Returns the resolved\n * identity (created or matched via Scenario-B email enrichment).\n */\n resolveGoogleChatSender(args: {\n senderUserId: string;\n spaceId?: string;\n }): Promise<{\n identityId: string | null;\n status: string;\n accessAllowed: boolean;\n }>;\n memorySearch(query: string, opts?: {\n limit?: number;\n topic?: string;\n subtopic?: string;\n tag?: string;\n includeKnowledge?: boolean;\n }): Promise<{\n facts: {\n subject: string;\n predicate: string;\n object: string;\n since: string;\n confidence: number;\n }[];\n memories: {\n id: string;\n text: string;\n topic: string;\n subtopic: string;\n tag: string;\n importance: number;\n timestamp: number;\n score: number;\n }[];\n }>;\n memoryStore(text: string, opts?: {\n topic?: string;\n subtopic?: string;\n tag?: string;\n importance?: number;\n }): Promise<{\n memoryId: string;\n }>;\n memoryIngest(sessionKey: string, messages: {\n role: string;\n content: string;\n index: number;\n timestamp?: string;\n }[], metadata?: {\n channelId?: string;\n userId?: string;\n userName?: string;\n }): Promise<{\n queued: boolean;\n messageCount: number;\n }>;\n memoryLoadContext(tier?: number, topicHint?: string): Promise<{\n formatted: string;\n [key: string]: unknown;\n }>;\n memoryLookupEntity(subject: string): Promise<{\n subject: string;\n triples: {\n tripleId: string;\n predicate: string;\n object: string;\n validFrom: string;\n validTo?: string;\n confidence: number;\n }[];\n }>;\n memoryNavigate(): Promise<{\n topics: {\n name: string;\n tripleCount: number;\n subtopics: string[];\n }[];\n cursor: string | null;\n }>;\n memoryDelete(memoryId: string): Promise<{\n deleted: boolean;\n }>;\n memoryStats(): Promise<{\n vectorCount: number;\n tripleCount: number;\n storageEstimateBytes: number;\n lastIngestionAt?: string;\n }>;\n searchWeb(params: {\n query: string;\n count?: number;\n offset?: number;\n country?: string;\n freshness?: string;\n }): Promise<unknown>;\n searchImages(params: {\n query: string;\n count?: number;\n }): Promise<unknown>;\n searchNews(params: {\n query: string;\n count?: number;\n freshness?: string;\n }): Promise<unknown>;\n registerDatabaseCredentials(): Promise<{\n connectionString: string;\n username: string;\n password: string;\n databases: string[];\n }>;\n reportDatabaseAudit(entry: {\n database: string;\n collection: string;\n operation: string;\n summary?: string;\n }): Promise<void>;\n}\n//# sourceMappingURL=index.d.ts.map\n//#endregion\nexport { AgentApiClient, AgentApiClientConfig, type ChangelogAction, type ChangelogActor, type ChangelogEntry, type EncryptedEnvelopeV1, type Field, type FieldEnvelope, type FieldFormat, type FieldSensitivity, type FieldView, type GeneratedDataKey, type IntegrationConfigResult, type IntegrationConfigSchemaField, type IntegrationInstall, type RegistryEntry, type ScopeInfo, type SecretAggregate, type SecretCategory, type SecretMetadata, type SecretScope, SharedFileEntry, SyncAgentInfo, SyncAgentStats, SyncConfirmedUpload, SyncFileEntry, SyncManifest, SyncManifestEntry, SyncPresignedUrl, SyncReconstructBundle, SyncReconstructFile, SyncSessionContent, SyncSessionEntry };\n//# sourceMappingURL=index.d.ts.map"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":["ResourceScope","IntegrationVisibility","IntegrationScope","IntegrationDesiredStatus","IntegrationActualStatus","IntegrationInstall","Record","IntegrationConfigSchemaField","IntegrationConfigResult","RegistryEntry","SecretScope","EncryptedEnvelopeV1","FIELD_FORMATS","FieldFormat","FIELD_SENSITIVITIES","FieldSensitivity","Field","SECRET_CATEGORIES","SecretCategory","FieldView","SecretAggregate","SecretMetadata","FieldEnvelope","ScopeInfo","GeneratedDataKey","CHANGELOG_ACTIONS","ChangelogAction","ChangelogActor","ChangelogEntry","AgentApiClientConfig","SyncAgentInfo","SyncManifestEntry","SyncManifest","SyncPresignedUrl","SyncConfirmedUpload","SyncReconstructFile","SyncReconstructBundle","SyncAgentStats","SyncFileEntry","SyncSessionEntry","SyncSessionContent","SharedFileEntry","AgentApiClient","Promise"],"sources":["../src/manifest.ts","../src/ignore.ts","../../agent-api-client/dist/index.d.ts","../src/sync-engine.ts","../src/watcher.ts","../src/uploader.ts","../src/downloader.ts","../src/retry.ts","../src/shared-sync.ts"],"sourcesContent":["//#region ../../packages-internal/types/dist/access.d.ts\n\n/**\n * The four resource scopes at which a permission can apply.\n * Order is meaningful: broader scopes first (`org`) → narrower last (`agent`).\n *\n * `IntegrationScope` in integration.ts and `SecretScope` in secrets.ts are\n * intentional aliases of this same enum — there is only one concept of\n * \"scope\" in Alfe.\n */\ndeclare const ResourceScope: {\n readonly Org: \"org\";\n readonly Team: \"team\";\n readonly Project: \"project\";\n readonly Agent: \"agent\";\n};\ntype ResourceScope = (typeof ResourceScope)[keyof typeof ResourceScope];\n/** Ordered tuple of resource scope string values (broad → narrow). */\n//#endregion\n//#region ../../packages-internal/types/dist/integration.d.ts\n/** Controls where an integration appears: public (everyone), hidden (nowhere) */\ndeclare const IntegrationVisibility: {\n readonly Public: \"public\";\n readonly Hidden: \"hidden\";\n};\ntype IntegrationVisibility = (typeof IntegrationVisibility)[keyof typeof IntegrationVisibility];\n/** Scope at which an integration is installed */\ndeclare const IntegrationScope: {\n readonly Org: \"org\";\n readonly Team: \"team\";\n readonly Project: \"project\";\n readonly Agent: \"agent\";\n};\ntype IntegrationScope = ResourceScope;\ndeclare const IntegrationDesiredStatus: {\n readonly Active: \"active\";\n readonly Removed: \"removed\";\n};\ntype IntegrationDesiredStatus = (typeof IntegrationDesiredStatus)[keyof typeof IntegrationDesiredStatus];\ndeclare const IntegrationActualStatus: {\n readonly Installing: \"installing\";\n readonly Active: \"active\";\n readonly Error: \"error\";\n readonly Removing: \"removing\";\n readonly Inactive: \"inactive\";\n readonly Unknown: \"unknown\";\n};\ntype IntegrationActualStatus = (typeof IntegrationActualStatus)[keyof typeof IntegrationActualStatus];\ninterface IntegrationInstall {\n scope: IntegrationScope;\n scopeId: string;\n integrationId: string;\n tenantId: string;\n desiredStatus: IntegrationDesiredStatus;\n actualStatus: IntegrationActualStatus;\n version: string;\n config: Record<string, unknown>;\n errorMessage: string;\n installedAt: string;\n updatedAt: string;\n}\n/** @deprecated Use IntegrationInstall instead */\n\ninterface IntegrationConfigSchemaField {\n key: string;\n label: string;\n type: string;\n description?: string;\n required?: boolean;\n default?: string | number | boolean;\n options?: string[];\n select_options?: {\n value: string;\n label: string;\n }[];\n oauth_provider?: string;\n oauth_scopes?: string[];\n oauth_integration_id?: string;\n editable?: string;\n hidden?: boolean;\n}\ninterface IntegrationConfigResult {\n integrationId: string;\n config: Record<string, unknown>;\n configSchema: IntegrationConfigSchemaField[];\n}\ninterface RegistryEntry {\n id: string;\n name: string;\n description: string;\n versions: string[];\n latest: string;\n repository: string;\n commit: string;\n icon?: string;\n author?: {\n name: string;\n url?: string;\n } | string;\n pricing?: {\n type: \"free\" | \"paid\" | \"usage\";\n price?: number;\n currency?: string;\n interval?: \"month\" | \"year\";\n description?: string;\n };\n features?: string[];\n preview_images?: string[];\n config_schema?: IntegrationConfigSchemaField[];\n supported_agents?: string[];\n /** Scopes where this integration can be installed */\n supported_scopes?: IntegrationScope[];\n /** Visibility status — controls where integration appears */\n visibility?: IntegrationVisibility;\n}\n//# sourceMappingURL=integration.d.ts.map\n//#endregion\n//#region ../../packages-internal/types/dist/secrets.d.ts\n/** Scope levels at which a secret can be owned. Aliased to ResourceScope. */\ntype SecretScope = ResourceScope;\n/**\n * v1 encrypted envelope as persisted by services/secrets and exchanged with\n * agents. Values are AES-256-GCM ciphertext; iv/authTag/ciphertext/dataKeyCiphertext\n * are all base64-encoded.\n */\ninterface EncryptedEnvelopeV1 {\n version: 1;\n iv: string;\n ciphertext: string;\n authTag: string;\n dataKeyCiphertext: string;\n}\n/**\n * Display/validation hint for a field's value. `\"json\"` signals that the\n * string is a JSON-stringified payload that consumers should `JSON.parse`.\n */\ndeclare const FIELD_FORMATS: readonly [\"text\", \"email\", \"url\", \"phone\", \"date\", \"number\", \"json\"];\ntype FieldFormat = (typeof FIELD_FORMATS)[number];\n/**\n * Whether a field is stored in plaintext (visible to anyone with read access)\n * or encrypted (requires KMS + the right encryption context to read).\n */\ndeclare const FIELD_SENSITIVITIES: readonly [\"plaintext\", \"encrypted\"];\ntype FieldSensitivity = (typeof FIELD_SENSITIVITIES)[number];\n/**\n * A field on a secret. `value` is always a string at the wire; for encrypted\n * fields it's the plaintext at the API edge (the service encrypts before\n * persistence). Reads from the dashboard omit `value` for encrypted fields;\n * agents get a `FieldEnvelope` instead and decrypt locally.\n */\ninterface Field {\n key: string;\n format?: FieldFormat;\n sensitivity: FieldSensitivity;\n value: string;\n}\n/**\n * Secret category — drives icon/template/filter behaviour. Defaults to\n * `\"other\"` for migrated rows.\n */\ndeclare const SECRET_CATEGORIES: readonly [\"login\", \"api_key\", \"database\", \"ssh_key\", \"certificate\", \"secure_note\", \"credit_card\", \"identity\", \"wifi\", \"other\"];\ntype SecretCategory = (typeof SECRET_CATEGORIES)[number];\n/**\n * One field as exposed to readers. Encrypted fields have no `value` on the\n * dashboard read path; the agent-side aggregate carries `envelope` instead.\n */\ninterface FieldView {\n key: string;\n format?: FieldFormat;\n sensitivity: FieldSensitivity;\n /** Present for `sensitivity: \"plaintext\"` only. */\n value?: string;\n /** Present for `sensitivity: \"encrypted\"` on agent-side reads only. */\n envelope?: EncryptedEnvelopeV1;\n /** Plaintext fields that opt into `format: \"json\"` are pre-parsed for callers. */\n parsedValue?: unknown;\n rotatedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n/** A secret as assembled from its multi-row aggregate. */\ninterface SecretAggregate {\n secretId: string;\n secretName: string;\n description?: string;\n tags: string[];\n category: SecretCategory;\n fields: FieldView[];\n changelogVersion: number;\n createdAt: string;\n updatedAt: string;\n}\n/** Metadata-only projection — used by list endpoints. */\ninterface SecretMetadata {\n secretId: string;\n secretName: string;\n description?: string;\n tags: string[];\n category: SecretCategory;\n fieldKeys: string[];\n changelogVersion: number;\n createdAt: string;\n updatedAt: string;\n}\n/**\n * Per-field encrypted envelope returned to agents on the agent-side aggregate.\n * Agents decrypt locally using a data key fetched from `/decrypt-data-key`.\n */\ninterface FieldEnvelope {\n key: string;\n format?: FieldFormat;\n envelope: EncryptedEnvelopeV1;\n rotatedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n/** A scope the caller can read or write secrets in. */\ninterface ScopeInfo {\n scope: SecretScope;\n scopeId: string;\n name?: string;\n}\n/**\n * KMS-issued data key, returned by the secrets service's\n * `/secrets/generate-data-key` KMS proxy endpoint. The plaintext key is\n * returned base64-encoded; callers MUST decode it to a Buffer and zero the\n * Buffer after use — never keep the plaintext as a JS string.\n */\ninterface GeneratedDataKey {\n plaintextKey: string;\n dataKeyCiphertext: string;\n}\n/**\n * Action types recorded in the secret changelog. Append-only.\n */\ndeclare const CHANGELOG_ACTIONS: readonly [\"created\", \"deleted\", \"metadata_updated\", \"field_added\", \"field_rotated\", \"field_removed\", \"tag_added\", \"tag_removed\"];\ntype ChangelogAction = (typeof CHANGELOG_ACTIONS)[number];\n/** Who triggered a changelog entry. */\ninterface ChangelogActor {\n kind: \"user\" | \"agent\" | \"system\";\n id: string;\n}\n/**\n * One audit row from the secret's changelog. Metadata only — never carries\n * field VALUES (old or new). Rolling back a rotated secret is intentionally\n * not supported.\n */\ninterface ChangelogEntry {\n changelogVersion: number;\n action: ChangelogAction;\n fieldKey?: string;\n fieldSensitivity?: FieldSensitivity;\n changedBy: ChangelogActor;\n reason?: string;\n timestamp: string;\n}\n//# sourceMappingURL=secrets.d.ts.map\n//#endregion\n//#region src/index.d.ts\ninterface AgentApiClientConfig {\n apiKey: string;\n apiUrl: string;\n}\ninterface SyncAgentInfo {\n agentId: string;\n tenantId: string;\n displayName: string;\n s3Prefix: string;\n status: \"stale\" | \"syncing\" | \"synced\";\n fileCount?: number;\n totalSize?: number;\n lastSync?: string;\n}\ninterface SyncManifestEntry {\n hash: string;\n size: number;\n modified: string;\n etag?: string;\n storageClass?: string;\n compressed?: boolean;\n}\ninterface SyncManifest {\n version: 1;\n agentId: string;\n lastSync: string;\n files: Record<string, SyncManifestEntry>;\n}\ninterface SyncPresignedUrl {\n path: string;\n url: string;\n expiresAt: string;\n}\ninterface SyncConfirmedUpload {\n filePath: string;\n hash: string;\n size: number;\n storageClass: \"STANDARD\" | \"GLACIER_IR\";\n syncedAt: string;\n}\ninterface SyncReconstructFile {\n path: string;\n size: number;\n url: string;\n storageClass?: string;\n compressed?: boolean;\n}\ninterface SyncReconstructBundle {\n agentId: string;\n mode: \"full\" | \"active\" | \"memory\";\n fileCount: number;\n totalSize: number;\n files: SyncReconstructFile[];\n expiresAt: string;\n}\ninterface SyncAgentStats {\n agentId: string;\n standardBytes: number;\n glacierBytes: number;\n fileCount: number;\n lastSyncAt: string | null;\n}\ninterface SyncFileEntry {\n filePath: string;\n size: number;\n modified: string;\n contentHash: string;\n storageClass?: string;\n compressed?: boolean;\n}\ninterface SyncSessionEntry {\n sessionId: string;\n size: number;\n lastModified: string;\n storageClass?: string;\n isArchived: boolean;\n}\ninterface SyncSessionContent {\n sessionId: string;\n content: string;\n compressed: boolean;\n}\ninterface SharedFileEntry {\n filePath: string;\n fileName: string;\n size: number;\n contentType?: string;\n}\ndeclare class AgentApiClient {\n private readonly apiKey;\n private readonly apiUrl;\n constructor(config: AgentApiClientConfig);\n private request;\n syncRegister(args?: {\n displayName?: string;\n }): Promise<{\n agent: SyncAgentInfo;\n }>;\n syncGetManifest(): Promise<SyncManifest>;\n syncPresign(args: {\n files: {\n path: string;\n operation: \"put\" | \"get\";\n contentType?: string;\n }[];\n }): Promise<{\n urls: SyncPresignedUrl[];\n }>;\n syncConfirmUpload(args: {\n filePath: string;\n hash: string;\n size: number;\n storageClass?: \"STANDARD\" | \"GLACIER_IR\";\n }): Promise<SyncConfirmedUpload>;\n syncReconstruct(args: {\n mode: \"full\" | \"active\" | \"memory\";\n }): Promise<SyncReconstructBundle>;\n syncGetStats(): Promise<SyncAgentStats>;\n syncListFiles(args?: {\n prefix?: string;\n }): Promise<{\n files: SyncFileEntry[];\n }>;\n syncListSessions(): Promise<{\n sessions: SyncSessionEntry[];\n }>;\n syncGetSession(sessionId: string): Promise<SyncSessionContent>;\n syncDeleteFile(filePath: string): Promise<{\n removed: boolean;\n }>;\n sharedListFiles(args: {\n scope: \"org\" | \"team\" | \"project\";\n scopeId: string;\n }): Promise<{\n files: SharedFileEntry[];\n nextCursor: string | null;\n }>;\n sharedDownloadUrl(args: {\n scope: \"org\" | \"team\" | \"project\";\n scopeId: string;\n filePath: string;\n }): Promise<{\n downloadUrl: string;\n expiresIn: number;\n }>;\n listIntegrations(): Promise<IntegrationInstall[]>;\n getIntegrationConfig(integrationId: string): Promise<IntegrationConfigResult>;\n updateIntegrationConfig(integrationId: string, config: Record<string, unknown>): Promise<void>;\n installIntegration(integrationId: string, options?: {\n version?: string;\n config?: Record<string, unknown>;\n }): Promise<IntegrationInstall>;\n removeIntegration(integrationId: string): Promise<IntegrationInstall>;\n getOAuthUrl(provider: string, scopes?: string[]): Promise<{\n url: string;\n provider: string;\n expiresIn: number;\n }>;\n getOAuthStatus(provider: string): Promise<{\n provider: string;\n connected: boolean;\n config?: Record<string, string>;\n }>;\n getRegistry(): Promise<{\n integrations: RegistryEntry[];\n }>;\n getGoogleCredentials(): Promise<{\n accounts?: {\n email: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n enabledServices?: string[];\n isDefault: boolean;\n displayName?: string;\n }[];\n email: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n projectId: string;\n enabledServices?: string[];\n }>;\n disconnectGoogleAccount(email: string): Promise<{\n accounts: {\n email: string;\n displayName?: string;\n isDefault: boolean;\n }[];\n }>;\n setDefaultGoogleAccount(email: string): Promise<{\n accounts: {\n email: string;\n displayName?: string;\n isDefault: boolean;\n }[];\n }>;\n getGoogleChatCredentials(): Promise<{\n email: string;\n refreshToken: string;\n clientId: string;\n clientSecret: string;\n displayName?: string;\n }>;\n getGithubCredentials(): Promise<{\n login: string;\n accessToken: string;\n }>;\n getXeroCredentials(): Promise<{\n accessToken: string;\n accessTokenExpiresAt: string;\n xeroTenantId: string;\n }>;\n refreshXeroToken(): Promise<{\n accessToken: string;\n expiresAt: string;\n }>;\n getNotionCredentials(): Promise<{\n accessToken: string;\n workspaceId: string;\n workspaceName: string;\n }>;\n getAtlassianCredentials(): Promise<{\n accessToken: string;\n refreshToken: string;\n accessTokenExpiresAt: string;\n cloudId: string;\n siteName: string;\n siteUrl: string;\n email: string;\n enabledProducts: string[];\n clientId: string;\n clientSecret: string;\n }>;\n refreshAtlassianToken(): Promise<{\n accessToken: string;\n expiresAt: string;\n }>;\n getMYOBCredentials(): Promise<{\n accessToken: string;\n accessTokenExpiresAt: string;\n myobBusinessId: string;\n clientId: string;\n }>;\n refreshMYOBToken(): Promise<{\n accessToken: string;\n expiresAt: string;\n }>;\n getTeamsCredentials(): Promise<{\n agentId: string;\n tenantId: string;\n azureAppId: string;\n azureBotId: string;\n azureClientSecret: string;\n botDisplayName?: string;\n teamsTenantId?: string;\n serviceUrl?: string;\n }>;\n sendTeamsMessage(data: {\n conversationId: string;\n text?: string;\n adaptiveCard?: Record<string, unknown>;\n }): Promise<{\n ok: boolean;\n activityId: string;\n }>;\n listTeamsChannels(): Promise<{\n channels: {\n id: string;\n name: string;\n description?: string;\n }[];\n }>;\n presignAttachments(files: {\n filename: string;\n mimeType: string;\n size: number;\n }[]): Promise<{\n attachments: {\n id: string;\n uploadUrl: string;\n downloadUrl: string;\n s3Key: string;\n expiresAt: string;\n }[];\n }>;\n recordActivity(data: {\n userId?: string;\n channel: string;\n role: \"user\" | \"assistant\";\n }): Promise<{\n recorded: boolean;\n }>;\n /**\n * Mint a fresh AES-256 data key for a specific (secret, field) pair. The\n * encryption context is rebuilt server-side from `auth.tenantId` + the body\n * fields including `fieldKey`; the agent cannot forge context for a scope\n * or field it doesn't own. Legacy single-envelope secrets are migrated to\n * `field#value` rows by the data migration, so call with `fieldKey: \"value\"`\n * to reach them.\n */\n generateSecretDataKey(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n }): Promise<GeneratedDataKey>;\n /**\n * Unwrap a wrapped data key so the agent can decrypt the envelope locally.\n * `fieldKey` MUST match the value supplied when the data key was generated\n * (it's bound into KMS encryption context); mismatch fails with\n * `InvalidCiphertextException`.\n */\n decryptSecretDataKey(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n dataKeyCiphertext: string;\n }): Promise<{\n plaintextKey: string;\n }>;\n /**\n * Create a new secret with one or more fields. Encrypted fields must arrive\n * pre-sealed (the agent has already obtained per-field data keys via\n * `generateSecretDataKey({ ..., fieldKey })` and AES-encrypted locally).\n * Plaintext fields ship the value inline.\n */\n createSecret(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n secretName: string;\n category?: SecretCategory;\n description?: string;\n tags?: string[];\n fields: {\n key: string;\n format?: FieldFormat;\n sensitivity: FieldSensitivity;\n value?: string;\n envelope?: EncryptedEnvelopeV1;\n }[];\n reason?: string;\n }): Promise<SecretAggregate>;\n /** Fetch the secret aggregate plus per-field encrypted envelopes. */\n getSecret(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n }): Promise<{\n aggregate: SecretAggregate;\n envelopes: FieldEnvelope[];\n }>;\n /** Fetch one field. Plaintext: value inline. Encrypted: envelope. */\n getSecretField(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n }): Promise<{\n key: string;\n sensitivity: FieldSensitivity;\n format?: FieldFormat;\n value?: string;\n envelope?: EncryptedEnvelopeV1;\n rotatedAt?: string;\n createdAt: string;\n updatedAt: string;\n }>;\n /** Add OR rotate one field. */\n setSecretField(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n sensitivity: FieldSensitivity;\n format?: FieldFormat;\n value?: string;\n envelope?: EncryptedEnvelopeV1;\n reason?: string;\n }): Promise<{\n fieldKey: string;\n rotated: boolean;\n }>;\n /** Remove one field. */\n removeSecretField(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n fieldKey: string;\n }): Promise<void>;\n /** Update secret-level metadata (name/description/tags/category). */\n updateSecretMetadata(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n secretName?: string;\n description?: string;\n tags?: string[];\n category?: SecretCategory;\n reason?: string;\n }): Promise<SecretAggregate>;\n /** List metadata for secrets in a scope. Optional filters route through the byFacet GSI. */\n listSecrets(args: {\n scope: SecretScope;\n scopeId: string;\n category?: SecretCategory;\n tag?: string;\n fieldKey?: string;\n }): Promise<SecretMetadata[]>;\n /** Bounded changelog read — metadata-only audit entries. */\n getSecretHistory(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n limit?: number;\n cursor?: string;\n }): Promise<{\n entries: ChangelogEntry[];\n nextCursor?: string;\n }>;\n /** Delete a secret (and all its field rows + tag rows + changelog rows). */\n deleteSecret(args: {\n scope: SecretScope;\n scopeId: string;\n secretId: string;\n }): Promise<void>;\n /** Enumerate scopes (org/team/project/agent) this agent can access. */\n listSecretScopes(): Promise<ScopeInfo[]>;\n resolveIdentity(args: {\n provider: string;\n platformId: string;\n kind?: \"user\" | \"agent\" | \"service\" | \"bot\" | \"workspace\";\n displayName?: string;\n }): Promise<{\n identityId: string | null;\n status: string;\n created?: boolean;\n reason?: string;\n /**\n * Flattened auriclabs permission strings for the resolved identity\n * (scope-prefixed where applicable). Empty array on miss / org service\n * outage — the runtime gate fails closed in that case.\n */\n permissions: string[];\n }>;\n searchIdentities(args?: {\n q?: string;\n status?: string;\n limit?: number;\n }): Promise<{\n identities: unknown[];\n }>;\n getIdentityContext(identityId: string): Promise<{\n context: unknown;\n }>;\n mergeIdentities(survivorId: string, args: {\n mergedId: string;\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n error?: string;\n }>;\n unmergeIdentity(identityId: string, args: {\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n error?: string;\n }>;\n addIdentityNote(identityId: string, args: {\n content: string;\n category?: string;\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n noteId: string | null;\n }>;\n tagIdentity(identityId: string, args: {\n tag: string;\n action: \"add\" | \"remove\";\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n }>;\n getIdentityChangelog(identityId: string, args?: {\n limit?: number;\n }): Promise<{\n entries: unknown[];\n }>;\n rollbackIdentity(identityId: string, args: {\n targetVersion: number;\n changedBy: {\n type: string;\n id: string;\n name?: string;\n };\n }): Promise<{\n ok: boolean;\n entry?: unknown;\n }>;\n requestIdentityVerification(args: {\n claimedIdentityId: string;\n requestingIdentityId: string;\n requestingProvider: string;\n requestingPlatformId: string;\n preferredChannel?: \"mobile\" | \"email\";\n /**\n * Phase 2: agent-supplied contact endpoint. When provided, the top-level\n * `preferredChannel` is ignored — the contact's channel wins.\n */\n contact?: {\n channel: \"email\" | \"mobile\";\n value: string;\n };\n }): Promise<{\n verificationId: string;\n channel: string;\n deliveredTo: string;\n expiresAt: string;\n availableChannels: {\n channel: string;\n deliveredTo: string;\n }[];\n } | {\n error: string;\n }>;\n confirmIdentityVerification(args: {\n claimedIdentityId: string;\n verificationId: string;\n phrase: string;\n }): Promise<{\n verified: boolean;\n identityId?: string;\n /** Phase 2: how the confirm resolved — Scenario A vs B. */\n action?: \"merged\" | \"contact_verified\";\n error?: string;\n }>;\n /**\n * Update display-shape fields on an Identity. Body excludes `email` /\n * `phone` / `title` / `company` / `metadata` per Section D4 — contacts go\n * via the verify flow, title/company live on OrgMembership, metadata is\n * not agent-writable.\n */\n updateIdentity(identityId: string, args: {\n name?: string;\n avatarUrl?: string;\n timezone?: string;\n locale?: string;\n }): Promise<{\n ok: boolean;\n }>;\n /**\n * Phase 2 (Section H): server-side verification of a Google Chat sender via\n * the agent's existing Google OAuth credentials. Returns the resolved\n * identity (created or matched via Scenario-B email enrichment).\n */\n resolveGoogleChatSender(args: {\n senderUserId: string;\n spaceId?: string;\n }): Promise<{\n identityId: string | null;\n status: string;\n }>;\n memorySearch(query: string, opts?: {\n limit?: number;\n topic?: string;\n subtopic?: string;\n tag?: string;\n includeKnowledge?: boolean;\n }): Promise<{\n facts: {\n subject: string;\n predicate: string;\n object: string;\n since: string;\n confidence: number;\n }[];\n memories: {\n id: string;\n text: string;\n topic: string;\n subtopic: string;\n tag: string;\n importance: number;\n timestamp: number;\n score: number;\n }[];\n }>;\n memoryStore(text: string, opts?: {\n topic?: string;\n subtopic?: string;\n tag?: string;\n importance?: number;\n }): Promise<{\n memoryId: string;\n }>;\n memoryIngest(sessionKey: string, messages: {\n role: string;\n content: string;\n index: number;\n timestamp?: string;\n }[], metadata?: {\n channelId?: string;\n userId?: string;\n userName?: string;\n }): Promise<{\n queued: boolean;\n messageCount: number;\n }>;\n memoryLoadContext(tier?: number, topicHint?: string): Promise<{\n formatted: string;\n [key: string]: unknown;\n }>;\n memoryLookupEntity(subject: string): Promise<{\n subject: string;\n triples: {\n tripleId: string;\n predicate: string;\n object: string;\n validFrom: string;\n validTo?: string;\n confidence: number;\n }[];\n }>;\n memoryNavigate(): Promise<{\n topics: {\n name: string;\n tripleCount: number;\n subtopics: string[];\n }[];\n cursor: string | null;\n }>;\n memoryDelete(memoryId: string): Promise<{\n deleted: boolean;\n }>;\n memoryStats(): Promise<{\n vectorCount: number;\n tripleCount: number;\n storageEstimateBytes: number;\n lastIngestionAt?: string;\n }>;\n memoryLearn(args: {\n text: string;\n source?: string;\n sourceType?: \"file\" | \"url\" | \"inline\";\n metadata?: {\n sessionId?: string;\n channelId?: string;\n userName?: string;\n };\n }): Promise<{\n memoriesStored: number;\n triplesStored: number;\n chunks: number;\n source?: string;\n }>;\n memoryBootstrapStatus(): Promise<{\n synced: boolean;\n syncedAt?: string;\n }>;\n memoryBootstrapStatusMark(): Promise<{\n synced: true;\n syncedAt: string;\n }>;\n searchWeb(params: {\n query: string;\n count?: number;\n offset?: number;\n country?: string;\n freshness?: string;\n }): Promise<unknown>;\n searchImages(params: {\n query: string;\n count?: number;\n }): Promise<unknown>;\n searchNews(params: {\n query: string;\n count?: number;\n freshness?: string;\n }): Promise<unknown>;\n registerDatabaseCredentials(): Promise<{\n connectionString: string;\n username: string;\n password: string;\n databases: string[];\n }>;\n reportDatabaseAudit(entry: {\n database: string;\n collection: string;\n operation: string;\n summary?: string;\n }): Promise<void>;\n}\n//# sourceMappingURL=index.d.ts.map\n//#endregion\nexport { AgentApiClient, AgentApiClientConfig, type ChangelogAction, type ChangelogActor, type ChangelogEntry, type EncryptedEnvelopeV1, type Field, type FieldEnvelope, type FieldFormat, type FieldSensitivity, type FieldView, type GeneratedDataKey, type IntegrationConfigResult, type IntegrationConfigSchemaField, type IntegrationInstall, type RegistryEntry, type ScopeInfo, type SecretAggregate, type SecretCategory, type SecretMetadata, type SecretScope, SharedFileEntry, SyncAgentInfo, SyncAgentStats, SyncConfirmedUpload, SyncFileEntry, SyncManifest, SyncManifestEntry, SyncPresignedUrl, SyncReconstructBundle, SyncReconstructFile, SyncSessionContent, SyncSessionEntry };\n//# sourceMappingURL=index.d.ts.map"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.cts","names":[],"sources":["../src/plugin.ts"],"mappings":";;;AA2CsB;;;;;AAWA;;;;;;;;;;AAsCtB,UAjDU,YAAA,CAiDuB;EA6X3B,IAAA,CAAA,GAAA,EA0RL,MAAA,CAAA,EAAA,IAAA;EAAA,IAAA,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,IAAA;OAnRe,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,IAAA;OAwMQ,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,IAAA;;UAtnBd,oBAAA,CA4pBa;QAAmB,EA3pBhC,MA2pBgC,CAAA,MAAA,EAAA,OAAA,CAAA;cAAgB,CAAA,EAAA,MAAA;EAAA,QAAA,EAAA,MAAA;UAxpBhD;;UAGA,SAAA;UACA;;WAEC;wDAC6C;;;iBAGvC,gCAAgC;iBAChC,gCAAgC;;;UA2BhC,gBAAA;;;;;;;;;;;;;;cA6XX;;;;;gBAOU;kBAwMQ,YAAS;iBAsCV,mBAAmB,mBAAgB"}
1
+ {"version":3,"file":"plugin.d.cts","names":[],"sources":["../src/plugin.ts"],"mappings":";;;AA2CsB;;;;;AAWA;;;;;;;;;;AAsCtB,UAjDU,YAAA,CAiDuB;EA6X3B,IAAA,CAAA,GAAA,EAqSL,MAAA,CAAA,EAAA,IAAA;EAAA,IAAA,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,IAAA;OA9Re,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,IAAA;OAmNQ,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,IAAA;;UAjoBd,oBAAA,CAuqBa;QAAmB,EAtqBhC,MAsqBgC,CAAA,MAAA,EAAA,OAAA,CAAA;cAAgB,CAAA,EAAA,MAAA;EAAA,QAAA,EAAA,MAAA;UAnqBhD;;UAGA,SAAA;UACA;;WAEC;wDAC6C;;;iBAGvC,gCAAgC;iBAChC,gCAAgC;;;UA2BhC,gBAAA;;;;;;;;;;;;;;cA6XX;;;;;gBAOU;kBAmNQ,YAAS;iBAsCV,mBAAmB,mBAAgB"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","names":[],"sources":["../src/plugin.ts"],"mappings":";;;AA2CsB;;;;;AAWA;;;;;;;;;;AAsCtB,UAjDU,YAAA,CAiDuB;EA6X3B,IAAA,CAAA,GAAA,EA0RL,MAAA,CAAA,EAAA,IAAA;EAAA,IAAA,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,IAAA;OAnRe,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,IAAA;OAwMQ,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,IAAA;;UAtnBd,oBAAA,CA4pBa;QAAmB,EA3pBhC,MA2pBgC,CAAA,MAAA,EAAA,OAAA,CAAA;cAAgB,CAAA,EAAA,MAAA;EAAA,QAAA,EAAA,MAAA;UAxpBhD;;UAGA,SAAA;UACA;;WAEC;wDAC6C;;;iBAGvC,gCAAgC;iBAChC,gCAAgC;;;UA2BhC,gBAAA;;;;;;;;;;;;;;cA6XX;;;;;gBAOU;kBAwMQ,YAAS;iBAsCV,mBAAmB,mBAAgB"}
1
+ {"version":3,"file":"plugin.d.ts","names":[],"sources":["../src/plugin.ts"],"mappings":";;;AA2CsB;;;;;AAWA;;;;;;;;;;AAsCtB,UAjDU,YAAA,CAiDuB;EA6X3B,IAAA,CAAA,GAAA,EAqSL,MAAA,CAAA,EAAA,IAAA;EAAA,IAAA,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,IAAA;OA9Re,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,IAAA;OAmNQ,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,IAAA;;UAjoBd,oBAAA,CAuqBa;QAAmB,EAtqBhC,MAsqBgC,CAAA,MAAA,EAAA,OAAA,CAAA;cAAgB,CAAA,EAAA,MAAA;EAAA,QAAA,EAAA,MAAA;UAnqBhD;;UAGA,SAAA;UACA;;WAEC;wDAC6C;;;iBAGvC,gCAAgC;iBAChC,gCAAgC;;;UA2BhC,gBAAA;;;;;;;;;;;;;;cA6XX;;;;;gBAOU;kBAmNQ,YAAS;iBAsCV,mBAAmB,mBAAgB"}
package/dist/plugin2.cjs CHANGED
@@ -564,25 +564,32 @@ const plugin = {
564
564
  client
565
565
  });
566
566
  log.info("Sync engine initialized");
567
- if (syncSchedule === "realtime") try {
568
- stopWatcher = await startWatcher({
569
- workspacePath,
570
- debounceMs: 2e3,
571
- onChanges: async (paths) => {
572
- if (!syncEngine) return;
573
- log.debug(`Realtime sync: ${String(paths.length)} file(s) changed`);
574
- try {
575
- lastSyncResult = await syncEngine.push(paths, { quiet: true });
576
- } catch (err) {
577
- log.error(`Realtime push failed: ${err instanceof Error ? err.message : String(err)}`);
567
+ if (syncSchedule === "realtime") {
568
+ try {
569
+ lastSyncResult = await syncEngine.push(void 0, { quiet: true });
570
+ log.info("Initial workspace push complete");
571
+ } catch (err) {
572
+ log.warn(`Initial workspace push failed: ${err instanceof Error ? err.message : String(err)}`);
573
+ }
574
+ try {
575
+ stopWatcher = await startWatcher({
576
+ workspacePath,
577
+ debounceMs: 2e3,
578
+ onChanges: async (paths) => {
579
+ if (!syncEngine) return;
580
+ log.debug(`Realtime sync: ${String(paths.length)} file(s) changed`);
581
+ try {
582
+ lastSyncResult = await syncEngine.push(paths, { quiet: true });
583
+ } catch (err) {
584
+ log.error(`Realtime push failed: ${err instanceof Error ? err.message : String(err)}`);
585
+ }
578
586
  }
579
- }
580
- });
581
- log.info("File watcher started for realtime sync");
582
- } catch (err) {
583
- log.warn(`Failed to start file watcher: ${err instanceof Error ? err.message : String(err)}`);
584
- }
585
- else setupSchedule(syncSchedule, log);
587
+ });
588
+ log.info("File watcher started for realtime sync");
589
+ } catch (err) {
590
+ log.warn(`Failed to start file watcher: ${err instanceof Error ? err.message : String(err)}`);
591
+ }
592
+ } else setupSchedule(syncSchedule, log);
586
593
  daemonIpcClient = await connectToDaemon(socketPath, log);
587
594
  let registered = null;
588
595
  try {
package/dist/plugin2.js CHANGED
@@ -564,25 +564,32 @@ const plugin = {
564
564
  client
565
565
  });
566
566
  log.info("Sync engine initialized");
567
- if (syncSchedule === "realtime") try {
568
- stopWatcher = await startWatcher({
569
- workspacePath,
570
- debounceMs: 2e3,
571
- onChanges: async (paths) => {
572
- if (!syncEngine) return;
573
- log.debug(`Realtime sync: ${String(paths.length)} file(s) changed`);
574
- try {
575
- lastSyncResult = await syncEngine.push(paths, { quiet: true });
576
- } catch (err) {
577
- log.error(`Realtime push failed: ${err instanceof Error ? err.message : String(err)}`);
567
+ if (syncSchedule === "realtime") {
568
+ try {
569
+ lastSyncResult = await syncEngine.push(void 0, { quiet: true });
570
+ log.info("Initial workspace push complete");
571
+ } catch (err) {
572
+ log.warn(`Initial workspace push failed: ${err instanceof Error ? err.message : String(err)}`);
573
+ }
574
+ try {
575
+ stopWatcher = await startWatcher({
576
+ workspacePath,
577
+ debounceMs: 2e3,
578
+ onChanges: async (paths) => {
579
+ if (!syncEngine) return;
580
+ log.debug(`Realtime sync: ${String(paths.length)} file(s) changed`);
581
+ try {
582
+ lastSyncResult = await syncEngine.push(paths, { quiet: true });
583
+ } catch (err) {
584
+ log.error(`Realtime push failed: ${err instanceof Error ? err.message : String(err)}`);
585
+ }
578
586
  }
579
- }
580
- });
581
- log.info("File watcher started for realtime sync");
582
- } catch (err) {
583
- log.warn(`Failed to start file watcher: ${err instanceof Error ? err.message : String(err)}`);
584
- }
585
- else setupSchedule(syncSchedule, log);
587
+ });
588
+ log.info("File watcher started for realtime sync");
589
+ } catch (err) {
590
+ log.warn(`Failed to start file watcher: ${err instanceof Error ? err.message : String(err)}`);
591
+ }
592
+ } else setupSchedule(syncSchedule, log);
586
593
  daemonIpcClient = await connectToDaemon(socketPath, log);
587
594
  let registered = null;
588
595
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin2.js","names":["resolveAlfeConfig","alfeConfigExists"],"sources":["../src/watcher.ts","../src/shared-sync.ts","../src/plugin.ts"],"sourcesContent":["/**\n * AlfeSync watcher — recursive file watcher with debounce and ignore support.\n *\n * Uses chokidar to watch the workspace root, debounces per-file changes\n * by 2 seconds, and emits batches of changed paths.\n */\n\nimport { watch } from \"chokidar\";\nimport { relative } from \"node:path\";\nimport { loadIgnorePatterns, shouldIgnore } from \"./ignore.js\";\n\nexport interface WatcherOptions {\n workspacePath: string;\n /** Debounce delay per file in milliseconds. Default: 2000 */\n debounceMs?: number;\n /** Callback invoked with batches of changed relative paths */\n onChanges: (paths: string[]) => void | Promise<void>;\n}\n\n/**\n * Start watching a workspace for file changes.\n *\n * Returns a cleanup function to stop watching.\n */\nexport async function startWatcher(\n options: WatcherOptions,\n): Promise<() => Promise<void>> {\n const { workspacePath, debounceMs = 2000, onChanges } = options;\n const ignorePatterns = await loadIgnorePatterns(workspacePath);\n\n // Pending changes map: relativePath → timeout handle\n const pending = new Map<string, ReturnType<typeof setTimeout>>();\n // Batch accumulator for flushing\n let batchPaths = new Set<string>();\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n function scheduleBatch() {\n if (flushTimer) return;\n flushTimer = setTimeout(() => {\n flushTimer = null;\n if (batchPaths.size === 0) return;\n\n const paths = [...batchPaths];\n batchPaths = new Set();\n void onChanges(paths);\n }, debounceMs);\n }\n\n function handleChange(absolutePath: string) {\n const relativePath = relative(workspacePath, absolutePath);\n\n // Skip ignored files\n if (shouldIgnore(relativePath, ignorePatterns)) return;\n\n // Clear existing timer for this file\n const existingTimer = pending.get(relativePath);\n if (existingTimer) clearTimeout(existingTimer);\n\n // Debounce: wait before adding to batch\n const timer = setTimeout(() => {\n pending.delete(relativePath);\n batchPaths.add(relativePath);\n scheduleBatch();\n }, debounceMs);\n\n pending.set(relativePath, timer);\n }\n\n const watcher = watch(workspacePath, {\n persistent: true,\n ignoreInitial: true,\n followSymlinks: false,\n depth: undefined, // unlimited depth\n ignored: [\n \"**/node_modules/**\",\n \"**/.alfesync/**\",\n \"**/.git/**\",\n \"**/.sst/**\",\n ],\n });\n\n watcher.on(\"add\", handleChange);\n watcher.on(\"change\", handleChange);\n watcher.on(\"unlink\", handleChange);\n\n // Return cleanup function\n return async () => {\n // Clear all pending timers\n for (const timer of pending.values()) {\n clearTimeout(timer);\n }\n pending.clear();\n\n if (flushTimer) {\n clearTimeout(flushTimer);\n flushTimer = null;\n }\n\n await watcher.close();\n };\n}\n","/**\n * Shared file sync — mirrors org/team/project files to a `shared/`\n * directory in the agent's workspace, organised by scope:\n *\n * shared/org/<files…>\n * shared/teams/<scopeId>/<files…>\n * shared/projects/<scopeId>/<files…>\n *\n * Backed by the agent self-service API (`AgentApiClient.sharedListFiles`,\n * `AgentApiClient.sharedDownloadUrl`).\n */\n\nimport { join, dirname, normalize, sep } from \"node:path\";\nimport { mkdir, writeFile, unlink, rm } from \"node:fs/promises\";\nimport type { AgentApiClient } from \"@alfe.ai/agent-api-client\";\n\nconst MAX_SHARED_FILE_SIZE = 100 * 1024 * 1024; // 100 MB\n\n/** Throw if `resolvedPath` would escape `baseDir`. */\nfunction assertContained(baseDir: string, resolvedPath: string): void {\n const normalizedBase = normalize(baseDir) + sep;\n const normalizedPath = normalize(resolvedPath);\n if (\n !normalizedPath.startsWith(normalizedBase) &&\n normalizedPath !== normalize(baseDir)\n ) {\n throw new Error(`Path traversal blocked: ${resolvedPath} escapes ${baseDir}`);\n }\n}\n\nexport interface SharedScope {\n scopeType: \"team\" | \"project\" | \"org\";\n scopeId: string;\n name: string;\n}\n\nexport interface SharedSyncConfig {\n workspacePath: string;\n client: AgentApiClient;\n}\n\ninterface PluginLogger {\n info(msg: string): void;\n warn(msg: string): void;\n error(msg: string): void;\n debug(msg: string): void;\n}\n\nexport interface SharedSyncEngine {\n initialize(scopes: SharedScope[]): Promise<void>;\n updateScopes(scopes: SharedScope[]): Promise<void>;\n handleNotification(filePath: string, eventType: \"created\" | \"deleted\"): Promise<void>;\n fullSync(): Promise<void>;\n getScopes(): SharedScope[];\n}\n\nexport function createSharedSyncEngine(\n config: SharedSyncConfig,\n log: PluginLogger,\n): SharedSyncEngine {\n let activeScopes: SharedScope[] = [];\n const sharedDir = join(config.workspacePath, \"shared\");\n\n function scopeDir(scope: SharedScope): string {\n if (scope.scopeType === \"org\") return join(sharedDir, \"org\");\n const plural = scope.scopeType === \"team\" ? \"teams\" : \"projects\";\n return join(sharedDir, plural, scope.scopeId);\n }\n\n async function downloadFile(\n scope: SharedScope,\n filePath: string,\n localPath: string,\n ): Promise<void> {\n assertContained(scopeDir(scope), localPath);\n\n const { downloadUrl } = await config.client.sharedDownloadUrl({\n scope: scope.scopeType,\n scopeId: scope.scopeId,\n filePath,\n });\n\n // Presigned URL → S3 directly (raw fetch is the right tool here).\n const response = await fetch(downloadUrl);\n if (!response.ok) {\n throw new Error(`Download failed: HTTP ${String(response.status)}`);\n }\n\n const contentLength = parseInt(\n response.headers.get(\"content-length\") ?? \"0\",\n 10,\n );\n if (contentLength > MAX_SHARED_FILE_SIZE) {\n throw new Error(\n `File too large: ${String(contentLength)} bytes exceeds ${String(MAX_SHARED_FILE_SIZE)} limit`,\n );\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n if (buffer.length > MAX_SHARED_FILE_SIZE) {\n throw new Error(`Downloaded file exceeds size limit: ${String(buffer.length)} bytes`);\n }\n\n await mkdir(dirname(localPath), { recursive: true });\n await writeFile(localPath, buffer);\n }\n\n async function syncScope(scope: SharedScope): Promise<void> {\n const dir = scopeDir(scope);\n await mkdir(dir, { recursive: true });\n\n try {\n const { files } = await config.client.sharedListFiles({\n scope: scope.scopeType,\n scopeId: scope.scopeId,\n });\n\n for (const file of files) {\n const localPath = join(dir, file.filePath);\n try {\n await downloadFile(scope, file.filePath, localPath);\n log.debug(\n `Shared sync: downloaded ${scope.scopeType}/${scope.scopeId}/${file.filePath}`,\n );\n } catch (err: unknown) {\n log.error(\n `Shared sync: failed to download ${file.filePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n } catch (err: unknown) {\n log.error(\n `Shared sync: failed to list files for ${scope.scopeType}/${scope.scopeId}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n function parseScopedPath(\n filePath: string,\n ): { scope: SharedScope; relativePath: string } | null {\n if (filePath.includes(\"..\")) return null;\n\n const orgMatch = /^shared\\/org\\/(.+)$/.exec(filePath);\n if (orgMatch) {\n const scope = activeScopes.find((s) => s.scopeType === \"org\");\n if (scope) return { scope, relativePath: orgMatch[1] };\n }\n\n const teamMatch = /^shared\\/teams\\/([^/]+)\\/(.+)$/.exec(filePath);\n if (teamMatch) {\n const scope = activeScopes.find(\n (s) => s.scopeType === \"team\" && s.scopeId === teamMatch[1],\n );\n if (scope) return { scope, relativePath: teamMatch[2] };\n }\n\n const projectMatch = /^shared\\/projects\\/([^/]+)\\/(.+)$/.exec(filePath);\n if (projectMatch) {\n const scope = activeScopes.find(\n (s) => s.scopeType === \"project\" && s.scopeId === projectMatch[1],\n );\n if (scope) return { scope, relativePath: projectMatch[2] };\n }\n\n return null;\n }\n\n return {\n async initialize(scopes: SharedScope[]): Promise<void> {\n activeScopes = [...scopes];\n log.info(`Shared sync: initializing with ${String(scopes.length)} scope(s)`);\n await mkdir(sharedDir, { recursive: true });\n for (const scope of scopes) {\n await syncScope(scope);\n }\n log.info(\"Shared sync: initialization complete\");\n },\n\n async updateScopes(newScopes: SharedScope[]): Promise<void> {\n const oldIds = new Set(activeScopes.map((s) => `${s.scopeType}:${s.scopeId}`));\n const newIds = new Set(newScopes.map((s) => `${s.scopeType}:${s.scopeId}`));\n\n for (const scope of activeScopes) {\n const key = `${scope.scopeType}:${scope.scopeId}`;\n if (!newIds.has(key)) {\n const dir = scopeDir(scope);\n try {\n await rm(dir, { recursive: true, force: true });\n log.info(`Shared sync: removed scope directory ${dir}`);\n } catch (err: unknown) {\n log.warn(\n `Shared sync: failed to remove ${dir}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n\n for (const scope of newScopes) {\n const key = `${scope.scopeType}:${scope.scopeId}`;\n if (!oldIds.has(key)) {\n log.info(\n `Shared sync: new scope ${scope.scopeType}/${scope.scopeId} — syncing files`,\n );\n await syncScope(scope);\n }\n }\n\n activeScopes = [...newScopes];\n },\n\n async handleNotification(\n filePath: string,\n eventType: \"created\" | \"deleted\",\n ): Promise<void> {\n const parsed = parseScopedPath(filePath);\n if (!parsed) {\n log.debug(`Shared sync: ignoring notification for unknown path: ${filePath}`);\n return;\n }\n\n const dir = scopeDir(parsed.scope);\n const localPath = join(dir, parsed.relativePath);\n\n try {\n assertContained(dir, localPath);\n } catch {\n log.warn(`Shared sync: path traversal blocked for ${filePath}`);\n return;\n }\n\n if (eventType === \"deleted\") {\n try {\n await unlink(localPath);\n log.debug(`Shared sync: deleted ${filePath}`);\n } catch {\n // idempotent — file may not exist locally on out-of-order events\n }\n return;\n }\n\n try {\n await downloadFile(parsed.scope, parsed.relativePath, localPath);\n log.debug(`Shared sync: pulled ${filePath}`);\n } catch (err: unknown) {\n log.error(\n `Shared sync: failed to pull ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n },\n\n async fullSync(): Promise<void> {\n log.info(`Shared sync: full sync across ${String(activeScopes.length)} scope(s)`);\n for (const scope of activeScopes) {\n await syncScope(scope);\n }\n },\n\n getScopes(): SharedScope[] {\n return [...activeScopes];\n },\n };\n}\n","/**\n * @alfe.ai/openclaw-sync — OpenClaw Sync plugin.\n *\n * Wraps the sync engine as a lifecycle-managed integration. Same shape as\n * @alfe.ai/openclaw-memory-cloud / -secrets / -google: one AgentApiClient\n * is constructed in `activate()` and reused for every API call. The agent's\n * identity is resolved server-side from the API key — the plugin never\n * touches `/auth/validate`, never plumbs an `agentId` around, never writes\n * a `.alfesync/` directory.\n *\n * Lifecycle:\n * - activate(api): construct client, start sync engine + watcher\n * - deactivate(api): stop watcher, drop relay connections, clean up\n * - configure(api, config): swap schedule/scope at runtime\n *\n * Registers gateway RPC methods: `sync.now`, `sync.status`.\n */\n\nimport { createRequire } from 'node:module';\nimport {\n resolveConfig as resolveAlfeConfig,\n configExists as alfeConfigExists,\n DEFAULT_SOCKET_PATH,\n DEFAULT_WORKSPACE_PATH,\n type ResolvedConfig as AlfeResolvedConfig,\n} from '@alfe.ai/config';\nimport { AgentApiClient, type SyncAgentInfo } from '@alfe.ai/agent-api-client';\n\nimport { createSyncEngine, type SyncEngine, type SyncResult } from './sync-engine.js';\nimport { startWatcher } from './watcher.js';\nimport { createSharedSyncEngine, type SharedSyncEngine, type SharedScope } from './shared-sync.js';\n\nconst require = createRequire(import.meta.url);\nconst pkg = require('../package.json') as { version: string };\n\n// ── Constants ───────────────────────────────────────────────\nconst SYNC_CAPABILITIES = ['sync.push', 'sync.pull', 'sync.fullSync'] as const;\nconst SYNC_RELAY_RECONNECT_BASE_MS = 1000;\nconst SYNC_RELAY_RECONNECT_MAX_MS = 30000;\nconst SYNC_RELAY_DEBOUNCE_MS = 500;\n\n// ── Types ───────────────────────────────────────────────────\n\ninterface PluginLogger {\n info(msg: string): void;\n warn(msg: string): void;\n error(msg: string): void;\n debug(msg: string): void;\n}\n\ninterface PluginServiceContext {\n config: Record<string, unknown>;\n workspaceDir?: string;\n stateDir: string;\n logger: PluginLogger;\n}\n\ninterface PluginApi {\n logger: PluginLogger;\n registrationMode?: 'full' | 'setup-only' | 'setup-runtime' | 'cli-metadata';\n config?: SyncPluginConfig;\n registerGatewayMethod?: (name: string, handler: () => Promise<unknown>) => void;\n registerService?(service: {\n id: string;\n start: (ctx: PluginServiceContext) => void | Promise<void>;\n stop?: (ctx: PluginServiceContext) => void | Promise<void>;\n }): void;\n}\n\ninterface IpcClient {\n on(event: string, handler: (...args: unknown[]) => void): void;\n request(method: string, params: unknown): Promise<{ ok: boolean; error?: { message: string } }>;\n start(): void;\n stop(): void;\n}\n\ninterface SyncRelaySocket {\n on(event: string, handler: (...args: never[]) => void): void;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n}\n\ninterface RelayMessage {\n type: string;\n status?: string;\n agentId?: string;\n message?: string;\n filePath?: string;\n etag?: string;\n eventType?: string;\n}\n\nexport interface SyncPluginConfig {\n /** Workspace path to sync. Defaults to the resolved Alfe workspace. */\n workspacePath?: string;\n /** Sync scope — which data categories to sync. */\n syncScope?: ('config' | 'conversations' | 'memory')[];\n /** Sync schedule — how often to auto-sync. */\n syncSchedule?: 'realtime' | 'hourly' | 'daily' | 'weekly';\n /** IPC socket path override. */\n socketPath?: string;\n /** Sync relay URL override (default: derived from apiUrl). */\n syncRelayUrl?: string;\n /** Enable shared file sync for org/team/project scopes. Default: true. */\n sharedSync?: boolean;\n}\n\n// ── Plugin State ────────────────────────────────────────────\n\nlet client: AgentApiClient | null = null;\nlet agentId: string | null = null;\nlet syncEngine: SyncEngine | null = null;\nlet sharedSyncEngine: SharedSyncEngine | null = null;\nlet stopWatcher: (() => Promise<void>) | null = null;\nlet daemonIpcClient: IpcClient | null = null;\nlet scheduledInterval: ReturnType<typeof setInterval> | null = null;\nlet currentConfig: SyncPluginConfig = {};\nlet lastSyncResult: SyncResult | null = null;\nlet syncRelayWs: SyncRelaySocket | null = null;\nlet syncRelayReconnectTimer: ReturnType<typeof setTimeout> | null = null;\nlet syncRelayReconnectAttempt = 0;\nlet syncRelayDebounceTimer: ReturnType<typeof setTimeout> | null = null;\nconst syncRelayPendingPaths = new Map<\n string,\n { etag?: string; eventType: 'created' | 'deleted' }\n>();\n\n// ── Schedule Helpers ────────────────────────────────────────\n\nconst SCHEDULE_INTERVALS_MS: Record<string, number> = {\n hourly: 60 * 60 * 1000,\n daily: 24 * 60 * 60 * 1000,\n weekly: 7 * 24 * 60 * 60 * 1000,\n};\n\nfunction clearSchedule() {\n if (scheduledInterval) {\n clearInterval(scheduledInterval);\n scheduledInterval = null;\n }\n}\n\nfunction setupSchedule(schedule: string, log: PluginLogger) {\n clearSchedule();\n if (schedule === 'realtime') {\n log.info('Sync schedule: realtime (file watcher active)');\n return;\n }\n\n const intervalMs = SCHEDULE_INTERVALS_MS[schedule];\n if (!intervalMs) {\n log.warn(`Unknown sync schedule: ${schedule}, defaulting to hourly`);\n setupSchedule('hourly', log);\n return;\n }\n\n log.info(`Sync schedule: ${schedule} (every ${String(intervalMs / 1000)}s)`);\n scheduledInterval = setInterval(() => {\n if (!syncEngine) return;\n const engine = syncEngine;\n void (async () => {\n try {\n log.info(`Scheduled sync (${schedule}) starting...`);\n lastSyncResult = await engine.fullSync({ quiet: true });\n log.info(\n `Scheduled sync complete: ${String(lastSyncResult.pushed)} pushed, ${String(lastSyncResult.pulled)} pulled`,\n );\n } catch (err: unknown) {\n log.error(`Scheduled sync failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n })();\n }, intervalMs);\n}\n\n// ── Daemon IPC ──────────────────────────────────────────────\n\nasync function connectToDaemon(socketPath: string, log: PluginLogger): Promise<IpcClient | null> {\n try {\n const modPath = '@alfe.ai/openclaw';\n const mod = (await import(/* webpackIgnore: true */ modPath)) as {\n IPCClient: new (socketPath: string, log: PluginLogger) => IpcClient;\n };\n const ipc = new mod.IPCClient(socketPath, log);\n\n ipc.on('connected', () => {\n void (async () => {\n log.info('Connected to Alfe daemon — registering sync capabilities...');\n const response = await ipc.request('capability.register', {\n plugin: '@alfe.ai/openclaw-sync',\n capabilities: [...SYNC_CAPABILITIES],\n });\n if (response.ok) {\n log.info('Sync capabilities registered with daemon');\n } else {\n log.warn(`Failed to register sync capabilities: ${response.error?.message ?? 'unknown'}`);\n }\n })();\n });\n\n ipc.on('disconnected', (...args: unknown[]) => {\n const reason = typeof args[0] === 'string' ? args[0] : String(args[0]);\n log.warn(`Disconnected from Alfe daemon: ${reason}`);\n });\n\n ipc.on('message', (...args: unknown[]) => {\n const msg = args[0] as Record<string, unknown> | undefined;\n if (msg?.type === 'SYNC_NOW' || msg?.command === 'SYNC_NOW') {\n log.info('Received SYNC_NOW command — triggering immediate sync...');\n if (syncEngine) {\n const engine = syncEngine;\n void (async () => {\n try {\n lastSyncResult = await engine.fullSync({ quiet: true });\n log.info(\n `SYNC_NOW complete: ${String(lastSyncResult.pushed)} pushed, ${String(lastSyncResult.pulled)} pulled`,\n );\n } catch (err: unknown) {\n log.error(`SYNC_NOW failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n })();\n }\n }\n\n if (msg?.type === 'SHARED_SCOPES') {\n const scopes = msg.scopes as SharedScope[] | undefined;\n const engine = sharedSyncEngine;\n if (scopes && engine) {\n log.info(`Received SHARED_SCOPES update: ${String(scopes.length)} scope(s)`);\n void (async () => {\n try {\n await engine.updateScopes(scopes);\n } catch (err: unknown) {\n log.error(\n `SHARED_SCOPES update failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n })();\n }\n }\n });\n\n ipc.on('error', (...args: unknown[]) => {\n const err = args[0];\n log.debug(`Daemon IPC error: ${err instanceof Error ? err.message : String(err)}`);\n });\n\n ipc.start();\n return ipc;\n } catch {\n log.info('Alfe daemon not available — Sync plugin running standalone');\n return null;\n }\n}\n\n// ── Sync Relay Connection ───────────────────────────────────\n\nfunction clearSyncRelayReconnect() {\n if (syncRelayReconnectTimer) {\n clearTimeout(syncRelayReconnectTimer);\n syncRelayReconnectTimer = null;\n }\n}\n\nfunction clearSyncRelayDebounce() {\n if (syncRelayDebounceTimer) {\n clearTimeout(syncRelayDebounceTimer);\n syncRelayDebounceTimer = null;\n }\n}\n\nasync function processPendingNotifications(log: PluginLogger) {\n if (syncRelayPendingPaths.size === 0) return;\n\n const entries = new Map(syncRelayPendingPaths);\n syncRelayPendingPaths.clear();\n\n const sharedEntries = new Map<string, { etag?: string; eventType: 'created' | 'deleted' }>();\n const privateEntries = new Map<string, { etag?: string; eventType: 'created' | 'deleted' }>();\n\n for (const [filePath, info] of entries) {\n if (filePath.startsWith('shared/')) {\n sharedEntries.set(filePath, info);\n } else {\n privateEntries.set(filePath, info);\n }\n }\n\n if (sharedEntries.size > 0 && sharedSyncEngine) {\n for (const [filePath, info] of sharedEntries) {\n try {\n await sharedSyncEngine.handleNotification(filePath, info.eventType);\n } catch (err: unknown) {\n log.error(\n `Shared sync relay: failed ${info.eventType} ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n\n if (privateEntries.size > 0 && syncEngine) {\n const engine = syncEngine;\n const toPull: string[] = [];\n const toDelete: string[] = [];\n\n for (const [filePath, info] of privateEntries) {\n if (info.eventType === 'deleted') {\n toDelete.push(filePath);\n } else {\n toPull.push(filePath);\n }\n }\n\n for (const filePath of toDelete) {\n try {\n await engine.removeLocalFile(filePath, { quiet: true });\n log.debug(`Sync relay: deleted ${filePath}`);\n } catch (err: unknown) {\n log.error(\n `Sync relay: failed to delete ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n if (toPull.length > 0) {\n try {\n const result = await engine.pullFiles(toPull, { quiet: true });\n if (result.pulled > 0) log.info(`Sync relay: pulled ${String(result.pulled)} file(s)`);\n if (result.errors > 0) log.warn(`Sync relay: ${String(result.errors)} pull error(s)`);\n } catch (err: unknown) {\n log.error(`Sync relay: pull failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n }\n}\n\nasync function connectToSyncRelay(\n relayUrl: string,\n token: string,\n agentIdForSubscribe: string,\n log: PluginLogger,\n): Promise<SyncRelaySocket | null> {\n try {\n const { default: WebSocket } = await import('ws');\n\n const wsUrl = `${relayUrl}?token=${encodeURIComponent(token)}`;\n const ws = new WebSocket(wsUrl);\n\n ws.on('open', () => {\n log.info('Connected to Sync Relay');\n syncRelayReconnectAttempt = 0;\n ws.send(JSON.stringify({ type: 'SUBSCRIBE', agentId: agentIdForSubscribe }));\n });\n\n ws.on('message', (data: Buffer | string) => {\n let message: RelayMessage;\n try {\n message = JSON.parse(data.toString()) as RelayMessage;\n } catch {\n return;\n }\n\n switch (message.type) {\n case 'SUBSCRIBE_ACK':\n if (message.status === 'ok') {\n log.info(`Subscribed to sync notifications for agent ${message.agentId ?? agentIdForSubscribe}`);\n const sharedEngine = sharedSyncEngine;\n if (sharedEngine) {\n void (async () => {\n try {\n await sharedEngine.fullSync();\n log.info('Shared sync: reconnect full sync complete');\n } catch (err: unknown) {\n log.error(\n `Shared sync: reconnect full sync failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n })();\n }\n } else {\n log.warn(`Sync relay subscribe failed: ${message.message ?? 'unknown'}`);\n }\n break;\n\n case 'FILE_CHANGED':\n if (message.filePath) {\n syncRelayPendingPaths.set(message.filePath, {\n etag: message.etag,\n eventType: message.eventType === 'deleted' ? 'deleted' : 'created',\n });\n }\n clearSyncRelayDebounce();\n syncRelayDebounceTimer = setTimeout(\n () => void processPendingNotifications(log),\n SYNC_RELAY_DEBOUNCE_MS,\n );\n break;\n\n case 'PING':\n try {\n ws.send(JSON.stringify({ type: 'PONG' }));\n } catch {\n // ignore\n }\n break;\n }\n });\n\n ws.on('close', (code: number) => {\n log.info(`Sync Relay disconnected (code=${String(code)})`);\n syncRelayWs = null;\n scheduleSyncRelayReconnect(relayUrl, token, agentIdForSubscribe, log);\n });\n\n ws.on('error', (err: Error) => {\n log.debug(`Sync Relay error: ${err.message}`);\n });\n\n return ws as SyncRelaySocket;\n } catch (err: unknown) {\n log.debug(`Failed to connect to Sync Relay: ${err instanceof Error ? err.message : String(err)}`);\n scheduleSyncRelayReconnect(relayUrl, token, agentIdForSubscribe, log);\n return null;\n }\n}\n\nfunction scheduleSyncRelayReconnect(\n relayUrl: string,\n token: string,\n agentIdForSubscribe: string,\n log: PluginLogger,\n) {\n clearSyncRelayReconnect();\n const delay = Math.min(\n SYNC_RELAY_RECONNECT_BASE_MS * Math.pow(2, syncRelayReconnectAttempt),\n SYNC_RELAY_RECONNECT_MAX_MS,\n );\n syncRelayReconnectAttempt++;\n log.debug(\n `Reconnecting to Sync Relay in ${String(delay)}ms (attempt ${String(syncRelayReconnectAttempt)})`,\n );\n\n syncRelayReconnectTimer = setTimeout(() => {\n void (async () => {\n syncRelayWs = await connectToSyncRelay(relayUrl, token, agentIdForSubscribe, log);\n })();\n }, delay);\n}\n\nfunction disconnectSyncRelay() {\n clearSyncRelayReconnect();\n clearSyncRelayDebounce();\n syncRelayPendingPaths.clear();\n\n if (syncRelayWs) {\n try {\n syncRelayWs.send(JSON.stringify({ type: 'UNSUBSCRIBE' }));\n syncRelayWs.close(1000, 'Plugin deactivating');\n } catch {\n // ignore\n }\n syncRelayWs = null;\n }\n}\n\nfunction deriveRelayUrl(apiUrl: string): string {\n if (apiUrl.includes('dev.alfe.ai')) return 'wss://sync.dev.alfe.ai/ws';\n if (apiUrl.includes('demo.alfe.ai')) return 'wss://sync.demo.alfe.ai/ws';\n if (apiUrl.includes('test.alfe.ai')) return 'wss://sync.test.alfe.ai/ws';\n return 'wss://sync.alfe.ai/ws';\n}\n\n// ── Plugin Definition ───────────────────────────────────────\n\nconst plugin = {\n id: '@alfe.ai/openclaw-sync',\n name: 'Alfe Sync Plugin',\n description:\n 'Back up agent configuration, conversations, and memory to the cloud with scheduled or real-time sync.',\n version: pkg.version,\n\n activate(api: PluginApi) {\n const log = api.logger;\n\n const pluginConfig: SyncPluginConfig = api.config ?? {};\n currentConfig = pluginConfig;\n\n let alfeConfig: { workspacePath: string; socketPath: string } | null = null;\n try {\n alfeConfig = resolveAlfeConfig();\n } catch {\n // alfe login hasn't run; logged below\n }\n\n const workspacePath =\n pluginConfig.workspacePath ?? alfeConfig?.workspacePath ?? DEFAULT_WORKSPACE_PATH;\n\n const syncScope = pluginConfig.syncScope ?? ['config', 'conversations', 'memory'];\n const syncSchedule = pluginConfig.syncSchedule ?? 'daily';\n const socketPath =\n pluginConfig.socketPath ?? alfeConfig?.socketPath ?? DEFAULT_SOCKET_PATH;\n\n const startSyncService = async () => {\n if ((globalThis as Record<string, unknown>).__alfeSyncPluginActivated === true) {\n log.debug('Alfe Sync plugin already activated — skipping duplicate');\n return;\n }\n (globalThis as Record<string, unknown>).__alfeSyncPluginActivated = true;\n log.info('Alfe Sync plugin activating...');\n log.info(`Sync scope: ${syncScope.join(', ')}`);\n log.info(`Sync schedule: ${syncSchedule}`);\n log.info(`Workspace: ${workspacePath}`);\n\n // Sync needs `~/.alfe/config.toml` (the existing `alfe login` config).\n // Identity (agentId / tenantId) is resolved server-side from the API\n // key on every AgentApiClient call.\n if (!alfeConfigExists()) {\n log.info('Sync skipped — no Alfe config found. Run `alfe login` to enable.');\n return;\n }\n\n let syncCfg: AlfeResolvedConfig;\n try {\n syncCfg = resolveAlfeConfig();\n } catch (err: unknown) {\n log.warn(\n `Sync skipped — failed to resolve credentials from ~/.alfe/config.toml: ${err instanceof Error ? err.message : String(err)}`,\n );\n return;\n }\n\n client = new AgentApiClient({ apiKey: syncCfg.apiKey, apiUrl: syncCfg.apiUrl });\n syncEngine = createSyncEngine({ workspacePath, client });\n log.info('Sync engine initialized');\n\n // Realtime mode → file watcher\n if (syncSchedule === 'realtime') {\n try {\n stopWatcher = await startWatcher({\n workspacePath,\n debounceMs: 2000,\n onChanges: async (paths) => {\n if (!syncEngine) return;\n log.debug(`Realtime sync: ${String(paths.length)} file(s) changed`);\n try {\n lastSyncResult = await syncEngine.push(paths, { quiet: true });\n } catch (err: unknown) {\n log.error(`Realtime push failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n });\n log.info('File watcher started for realtime sync');\n } catch (err: unknown) {\n log.warn(`Failed to start file watcher: ${err instanceof Error ? err.message : String(err)}`);\n }\n } else {\n setupSchedule(syncSchedule, log);\n }\n\n // Daemon IPC (for SYNC_NOW + SHARED_SCOPES messages)\n daemonIpcClient = await connectToDaemon(socketPath, log);\n\n // Register with the sync service to materialize the SyncAgent record\n // and learn our own agentId for relay subscription.\n let registered: SyncAgentInfo | null = null;\n try {\n const result = await client.syncRegister();\n registered = result.agent;\n agentId = registered.agentId;\n } catch (err: unknown) {\n log.warn(`Sync register failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Sync relay (real-time file change notifications)\n if (registered) {\n try {\n const relayUrl = pluginConfig.syncRelayUrl ?? deriveRelayUrl(syncCfg.apiUrl);\n syncRelayWs = await connectToSyncRelay(\n relayUrl,\n syncCfg.apiKey,\n registered.agentId,\n log,\n );\n } catch (err: unknown) {\n log.debug(\n `Sync Relay connection skipped: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // Shared sync (org/team/project scopes pushed by gateway)\n if (pluginConfig.sharedSync !== false) {\n try {\n sharedSyncEngine = createSharedSyncEngine({ workspacePath, client }, log);\n log.info('Shared sync engine created — waiting for SHARED_SCOPES from gateway');\n } catch (err: unknown) {\n log.debug(\n `Shared sync engine skipped: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n };\n\n const stopSyncService = async () => {\n (globalThis as Record<string, unknown>).__alfeSyncPluginActivated = false;\n clearSchedule();\n disconnectSyncRelay();\n\n if (stopWatcher) {\n try {\n await stopWatcher();\n log.info('File watcher stopped');\n } catch (err: unknown) {\n log.debug(`Error stopping watcher: ${err instanceof Error ? err.message : String(err)}`);\n }\n stopWatcher = null;\n }\n\n if (daemonIpcClient) {\n try {\n daemonIpcClient.stop();\n log.info('Disconnected from Alfe daemon');\n } catch (err: unknown) {\n log.debug(`Error disconnecting from daemon: ${err instanceof Error ? err.message : String(err)}`);\n }\n daemonIpcClient = null;\n }\n\n client = null;\n agentId = null;\n syncEngine = null;\n sharedSyncEngine = null;\n lastSyncResult = null;\n currentConfig = {};\n\n log.info('Alfe Sync plugin deactivated');\n };\n\n if (typeof api.registerGatewayMethod === 'function') {\n api.registerGatewayMethod('sync.now', async () => {\n if (!syncEngine) {\n return { ok: false, error: 'Sync engine not initialized — run `alfe login`' };\n }\n try {\n lastSyncResult = await syncEngine.fullSync({ quiet: true });\n return { ok: true, result: lastSyncResult };\n } catch (err: unknown) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n });\n log.info('Registered gateway RPC method: sync.now');\n\n api.registerGatewayMethod('sync.status', () =>\n Promise.resolve({\n ok: true,\n initialized: !!syncEngine,\n agentId,\n schedule: currentConfig.syncSchedule ?? 'daily',\n scope: currentConfig.syncScope ?? ['config', 'conversations', 'memory'],\n lastResult: lastSyncResult,\n watcherActive: !!stopWatcher,\n }),\n );\n log.info('Registered gateway RPC method: sync.status');\n }\n\n if (api.registerService) {\n api.registerService({\n id: 'alfe-sync-engine',\n start: () => startSyncService(),\n stop: () => stopSyncService(),\n });\n } else {\n void startSyncService().catch((err: unknown) => {\n log.error(`Sync plugin async init failed: ${err instanceof Error ? err.message : String(err)}`);\n });\n }\n\n log.info('Alfe Sync plugin activated');\n },\n\n async deactivate(api: PluginApi) {\n (globalThis as Record<string, unknown>).__alfeSyncPluginActivated = false;\n const log = api.logger;\n log.info('Alfe Sync plugin deactivating...');\n\n clearSchedule();\n disconnectSyncRelay();\n\n if (stopWatcher) {\n try {\n await stopWatcher();\n log.info('File watcher stopped');\n } catch (err: unknown) {\n log.debug(`Error stopping watcher: ${err instanceof Error ? err.message : String(err)}`);\n }\n stopWatcher = null;\n }\n\n if (daemonIpcClient) {\n try {\n daemonIpcClient.stop();\n log.info('Disconnected from Alfe daemon');\n } catch (err: unknown) {\n log.debug(`Error disconnecting from daemon: ${err instanceof Error ? err.message : String(err)}`);\n }\n daemonIpcClient = null;\n }\n\n client = null;\n agentId = null;\n syncEngine = null;\n sharedSyncEngine = null;\n lastSyncResult = null;\n currentConfig = {};\n\n log.info('Alfe Sync plugin deactivated');\n },\n\n async configure(api: PluginApi, config: SyncPluginConfig) {\n const log = api.logger;\n log.info('Reconfiguring Alfe Sync plugin...');\n currentConfig = { ...currentConfig, ...config };\n\n if (config.syncSchedule) {\n if (config.syncSchedule === 'realtime' && syncEngine && !stopWatcher) {\n const workspacePath = currentConfig.workspacePath ?? syncEngine.workspacePath;\n stopWatcher = await startWatcher({\n workspacePath,\n debounceMs: 2000,\n onChanges: async (paths) => {\n if (!syncEngine) return;\n try {\n lastSyncResult = await syncEngine.push(paths, { quiet: true });\n } catch (err: unknown) {\n log.error(`Realtime push failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n });\n clearSchedule();\n log.info('Switched to realtime sync');\n } else if (config.syncSchedule !== 'realtime') {\n if (stopWatcher) {\n await stopWatcher();\n stopWatcher = null;\n }\n setupSchedule(config.syncSchedule, log);\n }\n }\n\n if (config.syncScope) {\n log.info(`Updated sync scope: ${config.syncScope.join(', ')}`);\n }\n\n log.info('Alfe Sync plugin reconfigured');\n },\n};\n\nexport default plugin;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAwBA,eAAsB,aACpB,SAC8B;CAC9B,MAAM,EAAE,eAAe,aAAa,KAAM,cAAc;CACxD,MAAM,iBAAiB,MAAM,mBAAmB,cAAc;CAG9D,MAAM,0BAAU,IAAI,KAA4C;CAEhE,IAAI,6BAAa,IAAI,KAAa;CAClC,IAAI,aAAmD;CAEvD,SAAS,gBAAgB;AACvB,MAAI,WAAY;AAChB,eAAa,iBAAiB;AAC5B,gBAAa;AACb,OAAI,WAAW,SAAS,EAAG;GAE3B,MAAM,QAAQ,CAAC,GAAG,WAAW;AAC7B,gCAAa,IAAI,KAAK;AACjB,aAAU,MAAM;KACpB,WAAW;;CAGhB,SAAS,aAAa,cAAsB;EAC1C,MAAM,eAAe,SAAS,eAAe,aAAa;AAG1D,MAAI,aAAa,cAAc,eAAe,CAAE;EAGhD,MAAM,gBAAgB,QAAQ,IAAI,aAAa;AAC/C,MAAI,cAAe,cAAa,cAAc;EAG9C,MAAM,QAAQ,iBAAiB;AAC7B,WAAQ,OAAO,aAAa;AAC5B,cAAW,IAAI,aAAa;AAC5B,kBAAe;KACd,WAAW;AAEd,UAAQ,IAAI,cAAc,MAAM;;CAGlC,MAAM,UAAU,MAAM,eAAe;EACnC,YAAY;EACZ,eAAe;EACf,gBAAgB;EAChB,OAAO,KAAA;EACP,SAAS;GACP;GACA;GACA;GACA;GACD;EACF,CAAC;AAEF,SAAQ,GAAG,OAAO,aAAa;AAC/B,SAAQ,GAAG,UAAU,aAAa;AAClC,SAAQ,GAAG,UAAU,aAAa;AAGlC,QAAO,YAAY;AAEjB,OAAK,MAAM,SAAS,QAAQ,QAAQ,CAClC,cAAa,MAAM;AAErB,UAAQ,OAAO;AAEf,MAAI,YAAY;AACd,gBAAa,WAAW;AACxB,gBAAa;;AAGf,QAAM,QAAQ,OAAO;;;;;;;;;;;;;;;;AClFzB,MAAM,uBAAuB,MAAM,OAAO;;AAG1C,SAAS,gBAAgB,SAAiB,cAA4B;CACpE,MAAM,iBAAiB,UAAU,QAAQ,GAAG;CAC5C,MAAM,iBAAiB,UAAU,aAAa;AAC9C,KACE,CAAC,eAAe,WAAW,eAAe,IAC1C,mBAAmB,UAAU,QAAQ,CAErC,OAAM,IAAI,MAAM,2BAA2B,aAAa,WAAW,UAAU;;AA8BjF,SAAgB,uBACd,QACA,KACkB;CAClB,IAAI,eAA8B,EAAE;CACpC,MAAM,YAAY,KAAK,OAAO,eAAe,SAAS;CAEtD,SAAS,SAAS,OAA4B;AAC5C,MAAI,MAAM,cAAc,MAAO,QAAO,KAAK,WAAW,MAAM;AAE5D,SAAO,KAAK,WADG,MAAM,cAAc,SAAS,UAAU,YACvB,MAAM,QAAQ;;CAG/C,eAAe,aACb,OACA,UACA,WACe;AACf,kBAAgB,SAAS,MAAM,EAAE,UAAU;EAE3C,MAAM,EAAE,gBAAgB,MAAM,OAAO,OAAO,kBAAkB;GAC5D,OAAO,MAAM;GACb,SAAS,MAAM;GACf;GACD,CAAC;EAGF,MAAM,WAAW,MAAM,MAAM,YAAY;AACzC,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,yBAAyB,OAAO,SAAS,OAAO,GAAG;EAGrE,MAAM,gBAAgB,SACpB,SAAS,QAAQ,IAAI,iBAAiB,IAAI,KAC1C,GACD;AACD,MAAI,gBAAgB,qBAClB,OAAM,IAAI,MACR,mBAAmB,OAAO,cAAc,CAAC,iBAAiB,OAAO,qBAAqB,CAAC,QACxF;EAGH,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,aAAa,CAAC;AACxD,MAAI,OAAO,SAAS,qBAClB,OAAM,IAAI,MAAM,uCAAuC,OAAO,OAAO,OAAO,CAAC,QAAQ;AAGvF,QAAM,MAAM,QAAQ,UAAU,EAAE,EAAE,WAAW,MAAM,CAAC;AACpD,QAAM,UAAU,WAAW,OAAO;;CAGpC,eAAe,UAAU,OAAmC;EAC1D,MAAM,MAAM,SAAS,MAAM;AAC3B,QAAM,MAAM,KAAK,EAAE,WAAW,MAAM,CAAC;AAErC,MAAI;GACF,MAAM,EAAE,UAAU,MAAM,OAAO,OAAO,gBAAgB;IACpD,OAAO,MAAM;IACb,SAAS,MAAM;IAChB,CAAC;AAEF,QAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,YAAY,KAAK,KAAK,KAAK,SAAS;AAC1C,QAAI;AACF,WAAM,aAAa,OAAO,KAAK,UAAU,UAAU;AACnD,SAAI,MACF,2BAA2B,MAAM,UAAU,GAAG,MAAM,QAAQ,GAAG,KAAK,WACrE;aACM,KAAc;AACrB,SAAI,MACF,mCAAmC,KAAK,SAAS,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GACtG;;;WAGE,KAAc;AACrB,OAAI,MACF,yCAAyC,MAAM,UAAU,GAAG,MAAM,QAAQ,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAC/H;;;CAIL,SAAS,gBACP,UACqD;AACrD,MAAI,SAAS,SAAS,KAAK,CAAE,QAAO;EAEpC,MAAM,WAAW,sBAAsB,KAAK,SAAS;AACrD,MAAI,UAAU;GACZ,MAAM,QAAQ,aAAa,MAAM,MAAM,EAAE,cAAc,MAAM;AAC7D,OAAI,MAAO,QAAO;IAAE;IAAO,cAAc,SAAS;IAAI;;EAGxD,MAAM,YAAY,iCAAiC,KAAK,SAAS;AACjE,MAAI,WAAW;GACb,MAAM,QAAQ,aAAa,MACxB,MAAM,EAAE,cAAc,UAAU,EAAE,YAAY,UAAU,GAC1D;AACD,OAAI,MAAO,QAAO;IAAE;IAAO,cAAc,UAAU;IAAI;;EAGzD,MAAM,eAAe,oCAAoC,KAAK,SAAS;AACvE,MAAI,cAAc;GAChB,MAAM,QAAQ,aAAa,MACxB,MAAM,EAAE,cAAc,aAAa,EAAE,YAAY,aAAa,GAChE;AACD,OAAI,MAAO,QAAO;IAAE;IAAO,cAAc,aAAa;IAAI;;AAG5D,SAAO;;AAGT,QAAO;EACL,MAAM,WAAW,QAAsC;AACrD,kBAAe,CAAC,GAAG,OAAO;AAC1B,OAAI,KAAK,kCAAkC,OAAO,OAAO,OAAO,CAAC,WAAW;AAC5E,SAAM,MAAM,WAAW,EAAE,WAAW,MAAM,CAAC;AAC3C,QAAK,MAAM,SAAS,OAClB,OAAM,UAAU,MAAM;AAExB,OAAI,KAAK,uCAAuC;;EAGlD,MAAM,aAAa,WAAyC;GAC1D,MAAM,SAAS,IAAI,IAAI,aAAa,KAAK,MAAM,GAAG,EAAE,UAAU,GAAG,EAAE,UAAU,CAAC;GAC9E,MAAM,SAAS,IAAI,IAAI,UAAU,KAAK,MAAM,GAAG,EAAE,UAAU,GAAG,EAAE,UAAU,CAAC;AAE3E,QAAK,MAAM,SAAS,cAAc;IAChC,MAAM,MAAM,GAAG,MAAM,UAAU,GAAG,MAAM;AACxC,QAAI,CAAC,OAAO,IAAI,IAAI,EAAE;KACpB,MAAM,MAAM,SAAS,MAAM;AAC3B,SAAI;AACF,YAAM,GAAG,KAAK;OAAE,WAAW;OAAM,OAAO;OAAM,CAAC;AAC/C,UAAI,KAAK,wCAAwC,MAAM;cAChD,KAAc;AACrB,UAAI,KACF,iCAAiC,IAAI,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAC1F;;;;AAKP,QAAK,MAAM,SAAS,WAAW;IAC7B,MAAM,MAAM,GAAG,MAAM,UAAU,GAAG,MAAM;AACxC,QAAI,CAAC,OAAO,IAAI,IAAI,EAAE;AACpB,SAAI,KACF,0BAA0B,MAAM,UAAU,GAAG,MAAM,QAAQ,kBAC5D;AACD,WAAM,UAAU,MAAM;;;AAI1B,kBAAe,CAAC,GAAG,UAAU;;EAG/B,MAAM,mBACJ,UACA,WACe;GACf,MAAM,SAAS,gBAAgB,SAAS;AACxC,OAAI,CAAC,QAAQ;AACX,QAAI,MAAM,wDAAwD,WAAW;AAC7E;;GAGF,MAAM,MAAM,SAAS,OAAO,MAAM;GAClC,MAAM,YAAY,KAAK,KAAK,OAAO,aAAa;AAEhD,OAAI;AACF,oBAAgB,KAAK,UAAU;WACzB;AACN,QAAI,KAAK,2CAA2C,WAAW;AAC/D;;AAGF,OAAI,cAAc,WAAW;AAC3B,QAAI;AACF,WAAM,OAAO,UAAU;AACvB,SAAI,MAAM,wBAAwB,WAAW;YACvC;AAGR;;AAGF,OAAI;AACF,UAAM,aAAa,OAAO,OAAO,OAAO,cAAc,UAAU;AAChE,QAAI,MAAM,uBAAuB,WAAW;YACrC,KAAc;AACrB,QAAI,MACF,+BAA+B,SAAS,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAC7F;;;EAIL,MAAM,WAA0B;AAC9B,OAAI,KAAK,iCAAiC,OAAO,aAAa,OAAO,CAAC,WAAW;AACjF,QAAK,MAAM,SAAS,aAClB,OAAM,UAAU,MAAM;;EAI1B,YAA2B;AACzB,UAAO,CAAC,GAAG,aAAa;;EAE3B;;;;;;;;;;;;;;;;;;;;;ACnOH,MAAM,MADU,cAAc,OAAO,KAAK,IAAI,CAC1B,kBAAkB;AAGtC,MAAM,oBAAoB;CAAC;CAAa;CAAa;CAAgB;AACrE,MAAM,+BAA+B;AACrC,MAAM,8BAA8B;AACpC,MAAM,yBAAyB;AAsE/B,IAAI,SAAgC;AACpC,IAAI,UAAyB;AAC7B,IAAI,aAAgC;AACpC,IAAI,mBAA4C;AAChD,IAAI,cAA4C;AAChD,IAAI,kBAAoC;AACxC,IAAI,oBAA2D;AAC/D,IAAI,gBAAkC,EAAE;AACxC,IAAI,iBAAoC;AACxC,IAAI,cAAsC;AAC1C,IAAI,0BAAgE;AACpE,IAAI,4BAA4B;AAChC,IAAI,yBAA+D;AACnE,MAAM,wCAAwB,IAAI,KAG/B;AAIH,MAAM,wBAAgD;CACpD,QAAQ,OAAU;CAClB,OAAO,OAAU,KAAK;CACtB,QAAQ,QAAc,KAAK;CAC5B;AAED,SAAS,gBAAgB;AACvB,KAAI,mBAAmB;AACrB,gBAAc,kBAAkB;AAChC,sBAAoB;;;AAIxB,SAAS,cAAc,UAAkB,KAAmB;AAC1D,gBAAe;AACf,KAAI,aAAa,YAAY;AAC3B,MAAI,KAAK,gDAAgD;AACzD;;CAGF,MAAM,aAAa,sBAAsB;AACzC,KAAI,CAAC,YAAY;AACf,MAAI,KAAK,0BAA0B,SAAS,wBAAwB;AACpE,gBAAc,UAAU,IAAI;AAC5B;;AAGF,KAAI,KAAK,kBAAkB,SAAS,UAAU,OAAO,aAAa,IAAK,CAAC,IAAI;AAC5E,qBAAoB,kBAAkB;AACpC,MAAI,CAAC,WAAY;EACjB,MAAM,SAAS;AACf,GAAM,YAAY;AAChB,OAAI;AACF,QAAI,KAAK,mBAAmB,SAAS,eAAe;AACpD,qBAAiB,MAAM,OAAO,SAAS,EAAE,OAAO,MAAM,CAAC;AACvD,QAAI,KACF,4BAA4B,OAAO,eAAe,OAAO,CAAC,WAAW,OAAO,eAAe,OAAO,CAAC,SACpG;YACM,KAAc;AACrB,QAAI,MAAM,0BAA0B,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;MAEvF;IACH,WAAW;;AAKhB,eAAe,gBAAgB,YAAoB,KAA8C;AAC/F,KAAI;EAKF,MAAM,MAAM,KAHC,OAAM,OADH,uBAII,UAAU,YAAY,IAAI;AAE9C,MAAI,GAAG,mBAAmB;AACxB,IAAM,YAAY;AAChB,QAAI,KAAK,8DAA8D;IACvE,MAAM,WAAW,MAAM,IAAI,QAAQ,uBAAuB;KACxD,QAAQ;KACR,cAAc,CAAC,GAAG,kBAAkB;KACrC,CAAC;AACF,QAAI,SAAS,GACX,KAAI,KAAK,2CAA2C;QAEpD,KAAI,KAAK,yCAAyC,SAAS,OAAO,WAAW,YAAY;OAEzF;IACJ;AAEF,MAAI,GAAG,iBAAiB,GAAG,SAAoB;GAC7C,MAAM,SAAS,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK,OAAO,KAAK,GAAG;AACtE,OAAI,KAAK,kCAAkC,SAAS;IACpD;AAEF,MAAI,GAAG,YAAY,GAAG,SAAoB;GACxC,MAAM,MAAM,KAAK;AACjB,OAAI,KAAK,SAAS,cAAc,KAAK,YAAY,YAAY;AAC3D,QAAI,KAAK,2DAA2D;AACpE,QAAI,YAAY;KACd,MAAM,SAAS;AACf,MAAM,YAAY;AAChB,UAAI;AACF,wBAAiB,MAAM,OAAO,SAAS,EAAE,OAAO,MAAM,CAAC;AACvD,WAAI,KACF,sBAAsB,OAAO,eAAe,OAAO,CAAC,WAAW,OAAO,eAAe,OAAO,CAAC,SAC9F;eACM,KAAc;AACrB,WAAI,MAAM,oBAAoB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;SAEjF;;;AAIR,OAAI,KAAK,SAAS,iBAAiB;IACjC,MAAM,SAAS,IAAI;IACnB,MAAM,SAAS;AACf,QAAI,UAAU,QAAQ;AACpB,SAAI,KAAK,kCAAkC,OAAO,OAAO,OAAO,CAAC,WAAW;AAC5E,MAAM,YAAY;AAChB,UAAI;AACF,aAAM,OAAO,aAAa,OAAO;eAC1B,KAAc;AACrB,WAAI,MACF,gCAAgC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GACjF;;SAED;;;IAGR;AAEF,MAAI,GAAG,UAAU,GAAG,SAAoB;GACtC,MAAM,MAAM,KAAK;AACjB,OAAI,MAAM,qBAAqB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;IAClF;AAEF,MAAI,OAAO;AACX,SAAO;SACD;AACN,MAAI,KAAK,6DAA6D;AACtE,SAAO;;;AAMX,SAAS,0BAA0B;AACjC,KAAI,yBAAyB;AAC3B,eAAa,wBAAwB;AACrC,4BAA0B;;;AAI9B,SAAS,yBAAyB;AAChC,KAAI,wBAAwB;AAC1B,eAAa,uBAAuB;AACpC,2BAAyB;;;AAI7B,eAAe,4BAA4B,KAAmB;AAC5D,KAAI,sBAAsB,SAAS,EAAG;CAEtC,MAAM,UAAU,IAAI,IAAI,sBAAsB;AAC9C,uBAAsB,OAAO;CAE7B,MAAM,gCAAgB,IAAI,KAAkE;CAC5F,MAAM,iCAAiB,IAAI,KAAkE;AAE7F,MAAK,MAAM,CAAC,UAAU,SAAS,QAC7B,KAAI,SAAS,WAAW,UAAU,CAChC,eAAc,IAAI,UAAU,KAAK;KAEjC,gBAAe,IAAI,UAAU,KAAK;AAItC,KAAI,cAAc,OAAO,KAAK,iBAC5B,MAAK,MAAM,CAAC,UAAU,SAAS,cAC7B,KAAI;AACF,QAAM,iBAAiB,mBAAmB,UAAU,KAAK,UAAU;UAC5D,KAAc;AACrB,MAAI,MACF,6BAA6B,KAAK,UAAU,GAAG,SAAS,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAC7G;;AAKP,KAAI,eAAe,OAAO,KAAK,YAAY;EACzC,MAAM,SAAS;EACf,MAAM,SAAmB,EAAE;EAC3B,MAAM,WAAqB,EAAE;AAE7B,OAAK,MAAM,CAAC,UAAU,SAAS,eAC7B,KAAI,KAAK,cAAc,UACrB,UAAS,KAAK,SAAS;MAEvB,QAAO,KAAK,SAAS;AAIzB,OAAK,MAAM,YAAY,SACrB,KAAI;AACF,SAAM,OAAO,gBAAgB,UAAU,EAAE,OAAO,MAAM,CAAC;AACvD,OAAI,MAAM,uBAAuB,WAAW;WACrC,KAAc;AACrB,OAAI,MACF,gCAAgC,SAAS,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAC9F;;AAIL,MAAI,OAAO,SAAS,EAClB,KAAI;GACF,MAAM,SAAS,MAAM,OAAO,UAAU,QAAQ,EAAE,OAAO,MAAM,CAAC;AAC9D,OAAI,OAAO,SAAS,EAAG,KAAI,KAAK,sBAAsB,OAAO,OAAO,OAAO,CAAC,UAAU;AACtF,OAAI,OAAO,SAAS,EAAG,KAAI,KAAK,eAAe,OAAO,OAAO,OAAO,CAAC,gBAAgB;WAC9E,KAAc;AACrB,OAAI,MAAM,4BAA4B,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;;;AAMjG,eAAe,mBACb,UACA,OACA,qBACA,KACiC;AACjC,KAAI;EACF,MAAM,EAAE,SAAS,cAAc,MAAM,OAAO;EAG5C,MAAM,KAAK,IAAI,UADD,GAAG,SAAS,SAAS,mBAAmB,MAAM,GAC7B;AAE/B,KAAG,GAAG,cAAc;AAClB,OAAI,KAAK,0BAA0B;AACnC,+BAA4B;AAC5B,MAAG,KAAK,KAAK,UAAU;IAAE,MAAM;IAAa,SAAS;IAAqB,CAAC,CAAC;IAC5E;AAEF,KAAG,GAAG,YAAY,SAA0B;GAC1C,IAAI;AACJ,OAAI;AACF,cAAU,KAAK,MAAM,KAAK,UAAU,CAAC;WAC/B;AACN;;AAGF,WAAQ,QAAQ,MAAhB;IACE,KAAK;AACH,SAAI,QAAQ,WAAW,MAAM;AAC3B,UAAI,KAAK,8CAA8C,QAAQ,WAAW,sBAAsB;MAChG,MAAM,eAAe;AACrB,UAAI,aACF,EAAM,YAAY;AAChB,WAAI;AACF,cAAM,aAAa,UAAU;AAC7B,YAAI,KAAK,4CAA4C;gBAC9C,KAAc;AACrB,YAAI,MACF,4CAA4C,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAC7F;;UAED;WAGN,KAAI,KAAK,gCAAgC,QAAQ,WAAW,YAAY;AAE1E;IAEF,KAAK;AACH,SAAI,QAAQ,SACV,uBAAsB,IAAI,QAAQ,UAAU;MAC1C,MAAM,QAAQ;MACd,WAAW,QAAQ,cAAc,YAAY,YAAY;MAC1D,CAAC;AAEJ,6BAAwB;AACxB,8BAAyB,iBACjB,KAAK,4BAA4B,IAAI,EAC3C,uBACD;AACD;IAEF,KAAK;AACH,SAAI;AACF,SAAG,KAAK,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC,CAAC;aACnC;AAGR;;IAEJ;AAEF,KAAG,GAAG,UAAU,SAAiB;AAC/B,OAAI,KAAK,iCAAiC,OAAO,KAAK,CAAC,GAAG;AAC1D,iBAAc;AACd,8BAA2B,UAAU,OAAO,qBAAqB,IAAI;IACrE;AAEF,KAAG,GAAG,UAAU,QAAe;AAC7B,OAAI,MAAM,qBAAqB,IAAI,UAAU;IAC7C;AAEF,SAAO;UACA,KAAc;AACrB,MAAI,MAAM,oCAAoC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;AACjG,6BAA2B,UAAU,OAAO,qBAAqB,IAAI;AACrE,SAAO;;;AAIX,SAAS,2BACP,UACA,OACA,qBACA,KACA;AACA,0BAAyB;CACzB,MAAM,QAAQ,KAAK,IACjB,+BAA+B,KAAK,IAAI,GAAG,0BAA0B,EACrE,4BACD;AACD;AACA,KAAI,MACF,iCAAiC,OAAO,MAAM,CAAC,cAAc,OAAO,0BAA0B,CAAC,GAChG;AAED,2BAA0B,iBAAiB;AACzC,GAAM,YAAY;AAChB,iBAAc,MAAM,mBAAmB,UAAU,OAAO,qBAAqB,IAAI;MAC/E;IACH,MAAM;;AAGX,SAAS,sBAAsB;AAC7B,0BAAyB;AACzB,yBAAwB;AACxB,uBAAsB,OAAO;AAE7B,KAAI,aAAa;AACf,MAAI;AACF,eAAY,KAAK,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC,CAAC;AACzD,eAAY,MAAM,KAAM,sBAAsB;UACxC;AAGR,gBAAc;;;AAIlB,SAAS,eAAe,QAAwB;AAC9C,KAAI,OAAO,SAAS,cAAc,CAAE,QAAO;AAC3C,KAAI,OAAO,SAAS,eAAe,CAAE,QAAO;AAC5C,KAAI,OAAO,SAAS,eAAe,CAAE,QAAO;AAC5C,QAAO;;AAKT,MAAM,SAAS;CACb,IAAI;CACJ,MAAM;CACN,aACE;CACF,SAAS,IAAI;CAEb,SAAS,KAAgB;EACvB,MAAM,MAAM,IAAI;EAEhB,MAAM,eAAiC,IAAI,UAAU,EAAE;AACvD,kBAAgB;EAEhB,IAAI,aAAmE;AACvE,MAAI;AACF,gBAAaA,eAAmB;UAC1B;EAIR,MAAM,gBACJ,aAAa,iBAAiB,YAAY,iBAAiB;EAE7D,MAAM,YAAY,aAAa,aAAa;GAAC;GAAU;GAAiB;GAAS;EACjF,MAAM,eAAe,aAAa,gBAAgB;EAClD,MAAM,aACJ,aAAa,cAAc,YAAY,cAAc;EAEvD,MAAM,mBAAmB,YAAY;AACnC,OAAK,WAAuC,8BAA8B,MAAM;AAC9E,QAAI,MAAM,0DAA0D;AACpE;;AAED,cAAuC,4BAA4B;AACpE,OAAI,KAAK,iCAAiC;AAC1C,OAAI,KAAK,eAAe,UAAU,KAAK,KAAK,GAAG;AAC/C,OAAI,KAAK,kBAAkB,eAAe;AAC1C,OAAI,KAAK,cAAc,gBAAgB;AAKvC,OAAI,CAACC,cAAkB,EAAE;AACvB,QAAI,KAAK,mEAAmE;AAC5E;;GAGF,IAAI;AACJ,OAAI;AACF,cAAUD,eAAmB;YACtB,KAAc;AACrB,QAAI,KACF,0EAA0E,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAC3H;AACD;;AAGF,YAAS,IAAI,eAAe;IAAE,QAAQ,QAAQ;IAAQ,QAAQ,QAAQ;IAAQ,CAAC;AAC/E,gBAAa,iBAAiB;IAAE;IAAe;IAAQ,CAAC;AACxD,OAAI,KAAK,0BAA0B;AAGnC,OAAI,iBAAiB,WACnB,KAAI;AACF,kBAAc,MAAM,aAAa;KAC/B;KACA,YAAY;KACZ,WAAW,OAAO,UAAU;AAC1B,UAAI,CAAC,WAAY;AACjB,UAAI,MAAM,kBAAkB,OAAO,MAAM,OAAO,CAAC,kBAAkB;AACnE,UAAI;AACF,wBAAiB,MAAM,WAAW,KAAK,OAAO,EAAE,OAAO,MAAM,CAAC;eACvD,KAAc;AACrB,WAAI,MAAM,yBAAyB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;;KAG3F,CAAC;AACF,QAAI,KAAK,yCAAyC;YAC3C,KAAc;AACrB,QAAI,KAAK,iCAAiC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;OAG/F,eAAc,cAAc,IAAI;AAIlC,qBAAkB,MAAM,gBAAgB,YAAY,IAAI;GAIxD,IAAI,aAAmC;AACvC,OAAI;AAEF,kBADe,MAAM,OAAO,cAAc,EACtB;AACpB,cAAU,WAAW;YACd,KAAc;AACrB,QAAI,KAAK,yBAAyB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;AAIvF,OAAI,YAAY;AACd,QAAI;AAEF,mBAAc,MAAM,mBADH,aAAa,gBAAgB,eAAe,QAAQ,OAAO,EAG1E,QAAQ,QACR,WAAW,SACX,IACD;aACM,KAAc;AACrB,SAAI,MACF,kCAAkC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GACnF;;AAIH,QAAI,aAAa,eAAe,MAC9B,KAAI;AACF,wBAAmB,uBAAuB;MAAE;MAAe;MAAQ,EAAE,IAAI;AACzE,SAAI,KAAK,sEAAsE;aACxE,KAAc;AACrB,SAAI,MACF,+BAA+B,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAChF;;;;EAMT,MAAM,kBAAkB,YAAY;AACjC,cAAuC,4BAA4B;AACpE,kBAAe;AACf,wBAAqB;AAErB,OAAI,aAAa;AACf,QAAI;AACF,WAAM,aAAa;AACnB,SAAI,KAAK,uBAAuB;aACzB,KAAc;AACrB,SAAI,MAAM,2BAA2B,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;AAE1F,kBAAc;;AAGhB,OAAI,iBAAiB;AACnB,QAAI;AACF,qBAAgB,MAAM;AACtB,SAAI,KAAK,gCAAgC;aAClC,KAAc;AACrB,SAAI,MAAM,oCAAoC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;AAEnG,sBAAkB;;AAGpB,YAAS;AACT,aAAU;AACV,gBAAa;AACb,sBAAmB;AACnB,oBAAiB;AACjB,mBAAgB,EAAE;AAElB,OAAI,KAAK,+BAA+B;;AAG1C,MAAI,OAAO,IAAI,0BAA0B,YAAY;AACnD,OAAI,sBAAsB,YAAY,YAAY;AAChD,QAAI,CAAC,WACH,QAAO;KAAE,IAAI;KAAO,OAAO;KAAkD;AAE/E,QAAI;AACF,sBAAiB,MAAM,WAAW,SAAS,EAAE,OAAO,MAAM,CAAC;AAC3D,YAAO;MAAE,IAAI;MAAM,QAAQ;MAAgB;aACpC,KAAc;AACrB,YAAO;MAAE,IAAI;MAAO,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;MAAE;;KAE/E;AACF,OAAI,KAAK,0CAA0C;AAEnD,OAAI,sBAAsB,qBACxB,QAAQ,QAAQ;IACd,IAAI;IACJ,aAAa,CAAC,CAAC;IACf;IACA,UAAU,cAAc,gBAAgB;IACxC,OAAO,cAAc,aAAa;KAAC;KAAU;KAAiB;KAAS;IACvE,YAAY;IACZ,eAAe,CAAC,CAAC;IAClB,CAAC,CACH;AACD,OAAI,KAAK,6CAA6C;;AAGxD,MAAI,IAAI,gBACN,KAAI,gBAAgB;GAClB,IAAI;GACJ,aAAa,kBAAkB;GAC/B,YAAY,iBAAiB;GAC9B,CAAC;MAEG,mBAAkB,CAAC,OAAO,QAAiB;AAC9C,OAAI,MAAM,kCAAkC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;IAC/F;AAGJ,MAAI,KAAK,6BAA6B;;CAGxC,MAAM,WAAW,KAAgB;AAC9B,aAAuC,4BAA4B;EACpE,MAAM,MAAM,IAAI;AAChB,MAAI,KAAK,mCAAmC;AAE5C,iBAAe;AACf,uBAAqB;AAErB,MAAI,aAAa;AACf,OAAI;AACF,UAAM,aAAa;AACnB,QAAI,KAAK,uBAAuB;YACzB,KAAc;AACrB,QAAI,MAAM,2BAA2B,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;AAE1F,iBAAc;;AAGhB,MAAI,iBAAiB;AACnB,OAAI;AACF,oBAAgB,MAAM;AACtB,QAAI,KAAK,gCAAgC;YAClC,KAAc;AACrB,QAAI,MAAM,oCAAoC,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;AAEnG,qBAAkB;;AAGpB,WAAS;AACT,YAAU;AACV,eAAa;AACb,qBAAmB;AACnB,mBAAiB;AACjB,kBAAgB,EAAE;AAElB,MAAI,KAAK,+BAA+B;;CAG1C,MAAM,UAAU,KAAgB,QAA0B;EACxD,MAAM,MAAM,IAAI;AAChB,MAAI,KAAK,oCAAoC;AAC7C,kBAAgB;GAAE,GAAG;GAAe,GAAG;GAAQ;AAE/C,MAAI,OAAO;OACL,OAAO,iBAAiB,cAAc,cAAc,CAAC,aAAa;AAEpE,kBAAc,MAAM,aAAa;KAC/B,eAFoB,cAAc,iBAAiB,WAAW;KAG9D,YAAY;KACZ,WAAW,OAAO,UAAU;AAC1B,UAAI,CAAC,WAAY;AACjB,UAAI;AACF,wBAAiB,MAAM,WAAW,KAAK,OAAO,EAAE,OAAO,MAAM,CAAC;eACvD,KAAc;AACrB,WAAI,MAAM,yBAAyB,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAAG;;;KAG3F,CAAC;AACF,mBAAe;AACf,QAAI,KAAK,4BAA4B;cAC5B,OAAO,iBAAiB,YAAY;AAC7C,QAAI,aAAa;AACf,WAAM,aAAa;AACnB,mBAAc;;AAEhB,kBAAc,OAAO,cAAc,IAAI;;;AAI3C,MAAI,OAAO,UACT,KAAI,KAAK,uBAAuB,OAAO,UAAU,KAAK,KAAK,GAAG;AAGhE,MAAI,KAAK,gCAAgC;;CAE5C"}
1
+ {"version":3,"file":"plugin2.js","names":["resolveAlfeConfig","alfeConfigExists"],"sources":["../src/watcher.ts","../src/shared-sync.ts","../src/plugin.ts"],"sourcesContent":["/**\n * AlfeSync watcher — recursive file watcher with debounce and ignore support.\n *\n * Uses chokidar to watch the workspace root, debounces per-file changes\n * by 2 seconds, and emits batches of changed paths.\n */\n\nimport { watch } from \"chokidar\";\nimport { relative } from \"node:path\";\nimport { loadIgnorePatterns, shouldIgnore } from \"./ignore.js\";\n\nexport interface WatcherOptions {\n workspacePath: string;\n /** Debounce delay per file in milliseconds. Default: 2000 */\n debounceMs?: number;\n /** Callback invoked with batches of changed relative paths */\n onChanges: (paths: string[]) => void | Promise<void>;\n}\n\n/**\n * Start watching a workspace for file changes.\n *\n * Returns a cleanup function to stop watching.\n */\nexport async function startWatcher(\n options: WatcherOptions,\n): Promise<() => Promise<void>> {\n const { workspacePath, debounceMs = 2000, onChanges } = options;\n const ignorePatterns = await loadIgnorePatterns(workspacePath);\n\n // Pending changes map: relativePath → timeout handle\n const pending = new Map<string, ReturnType<typeof setTimeout>>();\n // Batch accumulator for flushing\n let batchPaths = new Set<string>();\n let flushTimer: ReturnType<typeof setTimeout> | null = null;\n\n function scheduleBatch() {\n if (flushTimer) return;\n flushTimer = setTimeout(() => {\n flushTimer = null;\n if (batchPaths.size === 0) return;\n\n const paths = [...batchPaths];\n batchPaths = new Set();\n void onChanges(paths);\n }, debounceMs);\n }\n\n function handleChange(absolutePath: string) {\n const relativePath = relative(workspacePath, absolutePath);\n\n // Skip ignored files\n if (shouldIgnore(relativePath, ignorePatterns)) return;\n\n // Clear existing timer for this file\n const existingTimer = pending.get(relativePath);\n if (existingTimer) clearTimeout(existingTimer);\n\n // Debounce: wait before adding to batch\n const timer = setTimeout(() => {\n pending.delete(relativePath);\n batchPaths.add(relativePath);\n scheduleBatch();\n }, debounceMs);\n\n pending.set(relativePath, timer);\n }\n\n const watcher = watch(workspacePath, {\n persistent: true,\n ignoreInitial: true,\n followSymlinks: false,\n depth: undefined, // unlimited depth\n ignored: [\n \"**/node_modules/**\",\n \"**/.alfesync/**\",\n \"**/.git/**\",\n \"**/.sst/**\",\n ],\n });\n\n watcher.on(\"add\", handleChange);\n watcher.on(\"change\", handleChange);\n watcher.on(\"unlink\", handleChange);\n\n // Return cleanup function\n return async () => {\n // Clear all pending timers\n for (const timer of pending.values()) {\n clearTimeout(timer);\n }\n pending.clear();\n\n if (flushTimer) {\n clearTimeout(flushTimer);\n flushTimer = null;\n }\n\n await watcher.close();\n };\n}\n","/**\n * Shared file sync — mirrors org/team/project files to a `shared/`\n * directory in the agent's workspace, organised by scope:\n *\n * shared/org/<files…>\n * shared/teams/<scopeId>/<files…>\n * shared/projects/<scopeId>/<files…>\n *\n * Backed by the agent self-service API (`AgentApiClient.sharedListFiles`,\n * `AgentApiClient.sharedDownloadUrl`).\n */\n\nimport { join, dirname, normalize, sep } from \"node:path\";\nimport { mkdir, writeFile, unlink, rm } from \"node:fs/promises\";\nimport type { AgentApiClient } from \"@alfe.ai/agent-api-client\";\n\nconst MAX_SHARED_FILE_SIZE = 100 * 1024 * 1024; // 100 MB\n\n/** Throw if `resolvedPath` would escape `baseDir`. */\nfunction assertContained(baseDir: string, resolvedPath: string): void {\n const normalizedBase = normalize(baseDir) + sep;\n const normalizedPath = normalize(resolvedPath);\n if (\n !normalizedPath.startsWith(normalizedBase) &&\n normalizedPath !== normalize(baseDir)\n ) {\n throw new Error(`Path traversal blocked: ${resolvedPath} escapes ${baseDir}`);\n }\n}\n\nexport interface SharedScope {\n scopeType: \"team\" | \"project\" | \"org\";\n scopeId: string;\n name: string;\n}\n\nexport interface SharedSyncConfig {\n workspacePath: string;\n client: AgentApiClient;\n}\n\ninterface PluginLogger {\n info(msg: string): void;\n warn(msg: string): void;\n error(msg: string): void;\n debug(msg: string): void;\n}\n\nexport interface SharedSyncEngine {\n initialize(scopes: SharedScope[]): Promise<void>;\n updateScopes(scopes: SharedScope[]): Promise<void>;\n handleNotification(filePath: string, eventType: \"created\" | \"deleted\"): Promise<void>;\n fullSync(): Promise<void>;\n getScopes(): SharedScope[];\n}\n\nexport function createSharedSyncEngine(\n config: SharedSyncConfig,\n log: PluginLogger,\n): SharedSyncEngine {\n let activeScopes: SharedScope[] = [];\n const sharedDir = join(config.workspacePath, \"shared\");\n\n function scopeDir(scope: SharedScope): string {\n if (scope.scopeType === \"org\") return join(sharedDir, \"org\");\n const plural = scope.scopeType === \"team\" ? \"teams\" : \"projects\";\n return join(sharedDir, plural, scope.scopeId);\n }\n\n async function downloadFile(\n scope: SharedScope,\n filePath: string,\n localPath: string,\n ): Promise<void> {\n assertContained(scopeDir(scope), localPath);\n\n const { downloadUrl } = await config.client.sharedDownloadUrl({\n scope: scope.scopeType,\n scopeId: scope.scopeId,\n filePath,\n });\n\n // Presigned URL → S3 directly (raw fetch is the right tool here).\n const response = await fetch(downloadUrl);\n if (!response.ok) {\n throw new Error(`Download failed: HTTP ${String(response.status)}`);\n }\n\n const contentLength = parseInt(\n response.headers.get(\"content-length\") ?? \"0\",\n 10,\n );\n if (contentLength > MAX_SHARED_FILE_SIZE) {\n throw new Error(\n `File too large: ${String(contentLength)} bytes exceeds ${String(MAX_SHARED_FILE_SIZE)} limit`,\n );\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n if (buffer.length > MAX_SHARED_FILE_SIZE) {\n throw new Error(`Downloaded file exceeds size limit: ${String(buffer.length)} bytes`);\n }\n\n await mkdir(dirname(localPath), { recursive: true });\n await writeFile(localPath, buffer);\n }\n\n async function syncScope(scope: SharedScope): Promise<void> {\n const dir = scopeDir(scope);\n await mkdir(dir, { recursive: true });\n\n try {\n const { files } = await config.client.sharedListFiles({\n scope: scope.scopeType,\n scopeId: scope.scopeId,\n });\n\n for (const file of files) {\n const localPath = join(dir, file.filePath);\n try {\n await downloadFile(scope, file.filePath, localPath);\n log.debug(\n `Shared sync: downloaded ${scope.scopeType}/${scope.scopeId}/${file.filePath}`,\n );\n } catch (err: unknown) {\n log.error(\n `Shared sync: failed to download ${file.filePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n } catch (err: unknown) {\n log.error(\n `Shared sync: failed to list files for ${scope.scopeType}/${scope.scopeId}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n function parseScopedPath(\n filePath: string,\n ): { scope: SharedScope; relativePath: string } | null {\n if (filePath.includes(\"..\")) return null;\n\n const orgMatch = /^shared\\/org\\/(.+)$/.exec(filePath);\n if (orgMatch) {\n const scope = activeScopes.find((s) => s.scopeType === \"org\");\n if (scope) return { scope, relativePath: orgMatch[1] };\n }\n\n const teamMatch = /^shared\\/teams\\/([^/]+)\\/(.+)$/.exec(filePath);\n if (teamMatch) {\n const scope = activeScopes.find(\n (s) => s.scopeType === \"team\" && s.scopeId === teamMatch[1],\n );\n if (scope) return { scope, relativePath: teamMatch[2] };\n }\n\n const projectMatch = /^shared\\/projects\\/([^/]+)\\/(.+)$/.exec(filePath);\n if (projectMatch) {\n const scope = activeScopes.find(\n (s) => s.scopeType === \"project\" && s.scopeId === projectMatch[1],\n );\n if (scope) return { scope, relativePath: projectMatch[2] };\n }\n\n return null;\n }\n\n return {\n async initialize(scopes: SharedScope[]): Promise<void> {\n activeScopes = [...scopes];\n log.info(`Shared sync: initializing with ${String(scopes.length)} scope(s)`);\n await mkdir(sharedDir, { recursive: true });\n for (const scope of scopes) {\n await syncScope(scope);\n }\n log.info(\"Shared sync: initialization complete\");\n },\n\n async updateScopes(newScopes: SharedScope[]): Promise<void> {\n const oldIds = new Set(activeScopes.map((s) => `${s.scopeType}:${s.scopeId}`));\n const newIds = new Set(newScopes.map((s) => `${s.scopeType}:${s.scopeId}`));\n\n for (const scope of activeScopes) {\n const key = `${scope.scopeType}:${scope.scopeId}`;\n if (!newIds.has(key)) {\n const dir = scopeDir(scope);\n try {\n await rm(dir, { recursive: true, force: true });\n log.info(`Shared sync: removed scope directory ${dir}`);\n } catch (err: unknown) {\n log.warn(\n `Shared sync: failed to remove ${dir}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n\n for (const scope of newScopes) {\n const key = `${scope.scopeType}:${scope.scopeId}`;\n if (!oldIds.has(key)) {\n log.info(\n `Shared sync: new scope ${scope.scopeType}/${scope.scopeId} — syncing files`,\n );\n await syncScope(scope);\n }\n }\n\n activeScopes = [...newScopes];\n },\n\n async handleNotification(\n filePath: string,\n eventType: \"created\" | \"deleted\",\n ): Promise<void> {\n const parsed = parseScopedPath(filePath);\n if (!parsed) {\n log.debug(`Shared sync: ignoring notification for unknown path: ${filePath}`);\n return;\n }\n\n const dir = scopeDir(parsed.scope);\n const localPath = join(dir, parsed.relativePath);\n\n try {\n assertContained(dir, localPath);\n } catch {\n log.warn(`Shared sync: path traversal blocked for ${filePath}`);\n return;\n }\n\n if (eventType === \"deleted\") {\n try {\n await unlink(localPath);\n log.debug(`Shared sync: deleted ${filePath}`);\n } catch {\n // idempotent — file may not exist locally on out-of-order events\n }\n return;\n }\n\n try {\n await downloadFile(parsed.scope, parsed.relativePath, localPath);\n log.debug(`Shared sync: pulled ${filePath}`);\n } catch (err: unknown) {\n log.error(\n `Shared sync: failed to pull ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n },\n\n async fullSync(): Promise<void> {\n log.info(`Shared sync: full sync across ${String(activeScopes.length)} scope(s)`);\n for (const scope of activeScopes) {\n await syncScope(scope);\n }\n },\n\n getScopes(): SharedScope[] {\n return [...activeScopes];\n },\n };\n}\n","/**\n * @alfe.ai/openclaw-sync — OpenClaw Sync plugin.\n *\n * Wraps the sync engine as a lifecycle-managed integration. Same shape as\n * @alfe.ai/openclaw-memory-cloud / -secrets / -google: one AgentApiClient\n * is constructed in `activate()` and reused for every API call. The agent's\n * identity is resolved server-side from the API key — the plugin never\n * touches `/auth/validate`, never plumbs an `agentId` around, never writes\n * a `.alfesync/` directory.\n *\n * Lifecycle:\n * - activate(api): construct client, start sync engine + watcher\n * - deactivate(api): stop watcher, drop relay connections, clean up\n * - configure(api, config): swap schedule/scope at runtime\n *\n * Registers gateway RPC methods: `sync.now`, `sync.status`.\n */\n\nimport { createRequire } from 'node:module';\nimport {\n resolveConfig as resolveAlfeConfig,\n configExists as alfeConfigExists,\n DEFAULT_SOCKET_PATH,\n DEFAULT_WORKSPACE_PATH,\n type ResolvedConfig as AlfeResolvedConfig,\n} from '@alfe.ai/config';\nimport { AgentApiClient, type SyncAgentInfo } from '@alfe.ai/agent-api-client';\n\nimport { createSyncEngine, type SyncEngine, type SyncResult } from './sync-engine.js';\nimport { startWatcher } from './watcher.js';\nimport { createSharedSyncEngine, type SharedSyncEngine, type SharedScope } from './shared-sync.js';\n\nconst require = createRequire(import.meta.url);\nconst pkg = require('../package.json') as { version: string };\n\n// ── Constants ───────────────────────────────────────────────\nconst SYNC_CAPABILITIES = ['sync.push', 'sync.pull', 'sync.fullSync'] as const;\nconst SYNC_RELAY_RECONNECT_BASE_MS = 1000;\nconst SYNC_RELAY_RECONNECT_MAX_MS = 30000;\nconst SYNC_RELAY_DEBOUNCE_MS = 500;\n\n// ── Types ───────────────────────────────────────────────────\n\ninterface PluginLogger {\n info(msg: string): void;\n warn(msg: string): void;\n error(msg: string): void;\n debug(msg: string): void;\n}\n\ninterface PluginServiceContext {\n config: Record<string, unknown>;\n workspaceDir?: string;\n stateDir: string;\n logger: PluginLogger;\n}\n\ninterface PluginApi {\n logger: PluginLogger;\n registrationMode?: 'full' | 'setup-only' | 'setup-runtime' | 'cli-metadata';\n config?: SyncPluginConfig;\n registerGatewayMethod?: (name: string, handler: () => Promise<unknown>) => void;\n registerService?(service: {\n id: string;\n start: (ctx: PluginServiceContext) => void | Promise<void>;\n stop?: (ctx: PluginServiceContext) => void | Promise<void>;\n }): void;\n}\n\ninterface IpcClient {\n on(event: string, handler: (...args: unknown[]) => void): void;\n request(method: string, params: unknown): Promise<{ ok: boolean; error?: { message: string } }>;\n start(): void;\n stop(): void;\n}\n\ninterface SyncRelaySocket {\n on(event: string, handler: (...args: never[]) => void): void;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n}\n\ninterface RelayMessage {\n type: string;\n status?: string;\n agentId?: string;\n message?: string;\n filePath?: string;\n etag?: string;\n eventType?: string;\n}\n\nexport interface SyncPluginConfig {\n /** Workspace path to sync. Defaults to the resolved Alfe workspace. */\n workspacePath?: string;\n /** Sync scope — which data categories to sync. */\n syncScope?: ('config' | 'conversations' | 'memory')[];\n /** Sync schedule — how often to auto-sync. */\n syncSchedule?: 'realtime' | 'hourly' | 'daily' | 'weekly';\n /** IPC socket path override. */\n socketPath?: string;\n /** Sync relay URL override (default: derived from apiUrl). */\n syncRelayUrl?: string;\n /** Enable shared file sync for org/team/project scopes. Default: true. */\n sharedSync?: boolean;\n}\n\n// ── Plugin State ────────────────────────────────────────────\n\nlet client: AgentApiClient | null = null;\nlet agentId: string | null = null;\nlet syncEngine: SyncEngine | null = null;\nlet sharedSyncEngine: SharedSyncEngine | null = null;\nlet stopWatcher: (() => Promise<void>) | null = null;\nlet daemonIpcClient: IpcClient | null = null;\nlet scheduledInterval: ReturnType<typeof setInterval> | null = null;\nlet currentConfig: SyncPluginConfig = {};\nlet lastSyncResult: SyncResult | null = null;\nlet syncRelayWs: SyncRelaySocket | null = null;\nlet syncRelayReconnectTimer: ReturnType<typeof setTimeout> | null = null;\nlet syncRelayReconnectAttempt = 0;\nlet syncRelayDebounceTimer: ReturnType<typeof setTimeout> | null = null;\nconst syncRelayPendingPaths = new Map<\n string,\n { etag?: string; eventType: 'created' | 'deleted' }\n>();\n\n// ── Schedule Helpers ────────────────────────────────────────\n\nconst SCHEDULE_INTERVALS_MS: Record<string, number> = {\n hourly: 60 * 60 * 1000,\n daily: 24 * 60 * 60 * 1000,\n weekly: 7 * 24 * 60 * 60 * 1000,\n};\n\nfunction clearSchedule() {\n if (scheduledInterval) {\n clearInterval(scheduledInterval);\n scheduledInterval = null;\n }\n}\n\nfunction setupSchedule(schedule: string, log: PluginLogger) {\n clearSchedule();\n if (schedule === 'realtime') {\n log.info('Sync schedule: realtime (file watcher active)');\n return;\n }\n\n const intervalMs = SCHEDULE_INTERVALS_MS[schedule];\n if (!intervalMs) {\n log.warn(`Unknown sync schedule: ${schedule}, defaulting to hourly`);\n setupSchedule('hourly', log);\n return;\n }\n\n log.info(`Sync schedule: ${schedule} (every ${String(intervalMs / 1000)}s)`);\n scheduledInterval = setInterval(() => {\n if (!syncEngine) return;\n const engine = syncEngine;\n void (async () => {\n try {\n log.info(`Scheduled sync (${schedule}) starting...`);\n lastSyncResult = await engine.fullSync({ quiet: true });\n log.info(\n `Scheduled sync complete: ${String(lastSyncResult.pushed)} pushed, ${String(lastSyncResult.pulled)} pulled`,\n );\n } catch (err: unknown) {\n log.error(`Scheduled sync failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n })();\n }, intervalMs);\n}\n\n// ── Daemon IPC ──────────────────────────────────────────────\n\nasync function connectToDaemon(socketPath: string, log: PluginLogger): Promise<IpcClient | null> {\n try {\n const modPath = '@alfe.ai/openclaw';\n const mod = (await import(/* webpackIgnore: true */ modPath)) as {\n IPCClient: new (socketPath: string, log: PluginLogger) => IpcClient;\n };\n const ipc = new mod.IPCClient(socketPath, log);\n\n ipc.on('connected', () => {\n void (async () => {\n log.info('Connected to Alfe daemon — registering sync capabilities...');\n const response = await ipc.request('capability.register', {\n plugin: '@alfe.ai/openclaw-sync',\n capabilities: [...SYNC_CAPABILITIES],\n });\n if (response.ok) {\n log.info('Sync capabilities registered with daemon');\n } else {\n log.warn(`Failed to register sync capabilities: ${response.error?.message ?? 'unknown'}`);\n }\n })();\n });\n\n ipc.on('disconnected', (...args: unknown[]) => {\n const reason = typeof args[0] === 'string' ? args[0] : String(args[0]);\n log.warn(`Disconnected from Alfe daemon: ${reason}`);\n });\n\n ipc.on('message', (...args: unknown[]) => {\n const msg = args[0] as Record<string, unknown> | undefined;\n if (msg?.type === 'SYNC_NOW' || msg?.command === 'SYNC_NOW') {\n log.info('Received SYNC_NOW command — triggering immediate sync...');\n if (syncEngine) {\n const engine = syncEngine;\n void (async () => {\n try {\n lastSyncResult = await engine.fullSync({ quiet: true });\n log.info(\n `SYNC_NOW complete: ${String(lastSyncResult.pushed)} pushed, ${String(lastSyncResult.pulled)} pulled`,\n );\n } catch (err: unknown) {\n log.error(`SYNC_NOW failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n })();\n }\n }\n\n if (msg?.type === 'SHARED_SCOPES') {\n const scopes = msg.scopes as SharedScope[] | undefined;\n const engine = sharedSyncEngine;\n if (scopes && engine) {\n log.info(`Received SHARED_SCOPES update: ${String(scopes.length)} scope(s)`);\n void (async () => {\n try {\n await engine.updateScopes(scopes);\n } catch (err: unknown) {\n log.error(\n `SHARED_SCOPES update failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n })();\n }\n }\n });\n\n ipc.on('error', (...args: unknown[]) => {\n const err = args[0];\n log.debug(`Daemon IPC error: ${err instanceof Error ? err.message : String(err)}`);\n });\n\n ipc.start();\n return ipc;\n } catch {\n log.info('Alfe daemon not available — Sync plugin running standalone');\n return null;\n }\n}\n\n// ── Sync Relay Connection ───────────────────────────────────\n\nfunction clearSyncRelayReconnect() {\n if (syncRelayReconnectTimer) {\n clearTimeout(syncRelayReconnectTimer);\n syncRelayReconnectTimer = null;\n }\n}\n\nfunction clearSyncRelayDebounce() {\n if (syncRelayDebounceTimer) {\n clearTimeout(syncRelayDebounceTimer);\n syncRelayDebounceTimer = null;\n }\n}\n\nasync function processPendingNotifications(log: PluginLogger) {\n if (syncRelayPendingPaths.size === 0) return;\n\n const entries = new Map(syncRelayPendingPaths);\n syncRelayPendingPaths.clear();\n\n const sharedEntries = new Map<string, { etag?: string; eventType: 'created' | 'deleted' }>();\n const privateEntries = new Map<string, { etag?: string; eventType: 'created' | 'deleted' }>();\n\n for (const [filePath, info] of entries) {\n if (filePath.startsWith('shared/')) {\n sharedEntries.set(filePath, info);\n } else {\n privateEntries.set(filePath, info);\n }\n }\n\n if (sharedEntries.size > 0 && sharedSyncEngine) {\n for (const [filePath, info] of sharedEntries) {\n try {\n await sharedSyncEngine.handleNotification(filePath, info.eventType);\n } catch (err: unknown) {\n log.error(\n `Shared sync relay: failed ${info.eventType} ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n\n if (privateEntries.size > 0 && syncEngine) {\n const engine = syncEngine;\n const toPull: string[] = [];\n const toDelete: string[] = [];\n\n for (const [filePath, info] of privateEntries) {\n if (info.eventType === 'deleted') {\n toDelete.push(filePath);\n } else {\n toPull.push(filePath);\n }\n }\n\n for (const filePath of toDelete) {\n try {\n await engine.removeLocalFile(filePath, { quiet: true });\n log.debug(`Sync relay: deleted ${filePath}`);\n } catch (err: unknown) {\n log.error(\n `Sync relay: failed to delete ${filePath}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n if (toPull.length > 0) {\n try {\n const result = await engine.pullFiles(toPull, { quiet: true });\n if (result.pulled > 0) log.info(`Sync relay: pulled ${String(result.pulled)} file(s)`);\n if (result.errors > 0) log.warn(`Sync relay: ${String(result.errors)} pull error(s)`);\n } catch (err: unknown) {\n log.error(`Sync relay: pull failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n }\n}\n\nasync function connectToSyncRelay(\n relayUrl: string,\n token: string,\n agentIdForSubscribe: string,\n log: PluginLogger,\n): Promise<SyncRelaySocket | null> {\n try {\n const { default: WebSocket } = await import('ws');\n\n const wsUrl = `${relayUrl}?token=${encodeURIComponent(token)}`;\n const ws = new WebSocket(wsUrl);\n\n ws.on('open', () => {\n log.info('Connected to Sync Relay');\n syncRelayReconnectAttempt = 0;\n ws.send(JSON.stringify({ type: 'SUBSCRIBE', agentId: agentIdForSubscribe }));\n });\n\n ws.on('message', (data: Buffer | string) => {\n let message: RelayMessage;\n try {\n message = JSON.parse(data.toString()) as RelayMessage;\n } catch {\n return;\n }\n\n switch (message.type) {\n case 'SUBSCRIBE_ACK':\n if (message.status === 'ok') {\n log.info(`Subscribed to sync notifications for agent ${message.agentId ?? agentIdForSubscribe}`);\n const sharedEngine = sharedSyncEngine;\n if (sharedEngine) {\n void (async () => {\n try {\n await sharedEngine.fullSync();\n log.info('Shared sync: reconnect full sync complete');\n } catch (err: unknown) {\n log.error(\n `Shared sync: reconnect full sync failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n })();\n }\n } else {\n log.warn(`Sync relay subscribe failed: ${message.message ?? 'unknown'}`);\n }\n break;\n\n case 'FILE_CHANGED':\n if (message.filePath) {\n syncRelayPendingPaths.set(message.filePath, {\n etag: message.etag,\n eventType: message.eventType === 'deleted' ? 'deleted' : 'created',\n });\n }\n clearSyncRelayDebounce();\n syncRelayDebounceTimer = setTimeout(\n () => void processPendingNotifications(log),\n SYNC_RELAY_DEBOUNCE_MS,\n );\n break;\n\n case 'PING':\n try {\n ws.send(JSON.stringify({ type: 'PONG' }));\n } catch {\n // ignore\n }\n break;\n }\n });\n\n ws.on('close', (code: number) => {\n log.info(`Sync Relay disconnected (code=${String(code)})`);\n syncRelayWs = null;\n scheduleSyncRelayReconnect(relayUrl, token, agentIdForSubscribe, log);\n });\n\n ws.on('error', (err: Error) => {\n log.debug(`Sync Relay error: ${err.message}`);\n });\n\n return ws as SyncRelaySocket;\n } catch (err: unknown) {\n log.debug(`Failed to connect to Sync Relay: ${err instanceof Error ? err.message : String(err)}`);\n scheduleSyncRelayReconnect(relayUrl, token, agentIdForSubscribe, log);\n return null;\n }\n}\n\nfunction scheduleSyncRelayReconnect(\n relayUrl: string,\n token: string,\n agentIdForSubscribe: string,\n log: PluginLogger,\n) {\n clearSyncRelayReconnect();\n const delay = Math.min(\n SYNC_RELAY_RECONNECT_BASE_MS * Math.pow(2, syncRelayReconnectAttempt),\n SYNC_RELAY_RECONNECT_MAX_MS,\n );\n syncRelayReconnectAttempt++;\n log.debug(\n `Reconnecting to Sync Relay in ${String(delay)}ms (attempt ${String(syncRelayReconnectAttempt)})`,\n );\n\n syncRelayReconnectTimer = setTimeout(() => {\n void (async () => {\n syncRelayWs = await connectToSyncRelay(relayUrl, token, agentIdForSubscribe, log);\n })();\n }, delay);\n}\n\nfunction disconnectSyncRelay() {\n clearSyncRelayReconnect();\n clearSyncRelayDebounce();\n syncRelayPendingPaths.clear();\n\n if (syncRelayWs) {\n try {\n syncRelayWs.send(JSON.stringify({ type: 'UNSUBSCRIBE' }));\n syncRelayWs.close(1000, 'Plugin deactivating');\n } catch {\n // ignore\n }\n syncRelayWs = null;\n }\n}\n\nfunction deriveRelayUrl(apiUrl: string): string {\n if (apiUrl.includes('dev.alfe.ai')) return 'wss://sync.dev.alfe.ai/ws';\n if (apiUrl.includes('demo.alfe.ai')) return 'wss://sync.demo.alfe.ai/ws';\n if (apiUrl.includes('test.alfe.ai')) return 'wss://sync.test.alfe.ai/ws';\n return 'wss://sync.alfe.ai/ws';\n}\n\n// ── Plugin Definition ───────────────────────────────────────\n\nconst plugin = {\n id: '@alfe.ai/openclaw-sync',\n name: 'Alfe Sync Plugin',\n description:\n 'Back up agent configuration, conversations, and memory to the cloud with scheduled or real-time sync.',\n version: pkg.version,\n\n activate(api: PluginApi) {\n const log = api.logger;\n\n const pluginConfig: SyncPluginConfig = api.config ?? {};\n currentConfig = pluginConfig;\n\n let alfeConfig: { workspacePath: string; socketPath: string } | null = null;\n try {\n alfeConfig = resolveAlfeConfig();\n } catch {\n // alfe login hasn't run; logged below\n }\n\n const workspacePath =\n pluginConfig.workspacePath ?? alfeConfig?.workspacePath ?? DEFAULT_WORKSPACE_PATH;\n\n const syncScope = pluginConfig.syncScope ?? ['config', 'conversations', 'memory'];\n const syncSchedule = pluginConfig.syncSchedule ?? 'daily';\n const socketPath =\n pluginConfig.socketPath ?? alfeConfig?.socketPath ?? DEFAULT_SOCKET_PATH;\n\n const startSyncService = async () => {\n if ((globalThis as Record<string, unknown>).__alfeSyncPluginActivated === true) {\n log.debug('Alfe Sync plugin already activated — skipping duplicate');\n return;\n }\n (globalThis as Record<string, unknown>).__alfeSyncPluginActivated = true;\n log.info('Alfe Sync plugin activating...');\n log.info(`Sync scope: ${syncScope.join(', ')}`);\n log.info(`Sync schedule: ${syncSchedule}`);\n log.info(`Workspace: ${workspacePath}`);\n\n // Sync needs `~/.alfe/config.toml` (the existing `alfe login` config).\n // Identity (agentId / tenantId) is resolved server-side from the API\n // key on every AgentApiClient call.\n if (!alfeConfigExists()) {\n log.info('Sync skipped — no Alfe config found. Run `alfe login` to enable.');\n return;\n }\n\n let syncCfg: AlfeResolvedConfig;\n try {\n syncCfg = resolveAlfeConfig();\n } catch (err: unknown) {\n log.warn(\n `Sync skipped — failed to resolve credentials from ~/.alfe/config.toml: ${err instanceof Error ? err.message : String(err)}`,\n );\n return;\n }\n\n client = new AgentApiClient({ apiKey: syncCfg.apiKey, apiUrl: syncCfg.apiUrl });\n syncEngine = createSyncEngine({ workspacePath, client });\n log.info('Sync engine initialized');\n\n // Realtime mode → initial push-only seed of pre-existing files\n // (chokidar ignoreInitial means the watcher only emits for\n // post-activation changes; without this the workspace tree never\n // reaches the cloud unless a file is touched). Push-only — not\n // fullSync — so we don't drag down stale cloud files into a fresh\n // local workspace or write .conflict-<ts> markers on first run.\n if (syncSchedule === 'realtime') {\n try {\n lastSyncResult = await syncEngine.push(undefined, { quiet: true });\n log.info('Initial workspace push complete');\n } catch (err: unknown) {\n log.warn(`Initial workspace push failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n try {\n stopWatcher = await startWatcher({\n workspacePath,\n debounceMs: 2000,\n onChanges: async (paths) => {\n if (!syncEngine) return;\n log.debug(`Realtime sync: ${String(paths.length)} file(s) changed`);\n try {\n lastSyncResult = await syncEngine.push(paths, { quiet: true });\n } catch (err: unknown) {\n log.error(`Realtime push failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n });\n log.info('File watcher started for realtime sync');\n } catch (err: unknown) {\n log.warn(`Failed to start file watcher: ${err instanceof Error ? err.message : String(err)}`);\n }\n } else {\n setupSchedule(syncSchedule, log);\n }\n\n // Daemon IPC (for SYNC_NOW + SHARED_SCOPES messages)\n daemonIpcClient = await connectToDaemon(socketPath, log);\n\n // Register with the sync service to materialize the SyncAgent record\n // and learn our own agentId for relay subscription.\n let registered: SyncAgentInfo | null = null;\n try {\n const result = await client.syncRegister();\n registered = result.agent;\n agentId = registered.agentId;\n } catch (err: unknown) {\n log.warn(`Sync register failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Sync relay (real-time file change notifications)\n if (registered) {\n try {\n const relayUrl = pluginConfig.syncRelayUrl ?? deriveRelayUrl(syncCfg.apiUrl);\n syncRelayWs = await connectToSyncRelay(\n relayUrl,\n syncCfg.apiKey,\n registered.agentId,\n log,\n );\n } catch (err: unknown) {\n log.debug(\n `Sync Relay connection skipped: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n // Shared sync (org/team/project scopes pushed by gateway)\n if (pluginConfig.sharedSync !== false) {\n try {\n sharedSyncEngine = createSharedSyncEngine({ workspacePath, client }, log);\n log.info('Shared sync engine created — waiting for SHARED_SCOPES from gateway');\n } catch (err: unknown) {\n log.debug(\n `Shared sync engine skipped: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n };\n\n const stopSyncService = async () => {\n (globalThis as Record<string, unknown>).__alfeSyncPluginActivated = false;\n clearSchedule();\n disconnectSyncRelay();\n\n if (stopWatcher) {\n try {\n await stopWatcher();\n log.info('File watcher stopped');\n } catch (err: unknown) {\n log.debug(`Error stopping watcher: ${err instanceof Error ? err.message : String(err)}`);\n }\n stopWatcher = null;\n }\n\n if (daemonIpcClient) {\n try {\n daemonIpcClient.stop();\n log.info('Disconnected from Alfe daemon');\n } catch (err: unknown) {\n log.debug(`Error disconnecting from daemon: ${err instanceof Error ? err.message : String(err)}`);\n }\n daemonIpcClient = null;\n }\n\n client = null;\n agentId = null;\n syncEngine = null;\n sharedSyncEngine = null;\n lastSyncResult = null;\n currentConfig = {};\n\n log.info('Alfe Sync plugin deactivated');\n };\n\n if (typeof api.registerGatewayMethod === 'function') {\n api.registerGatewayMethod('sync.now', async () => {\n if (!syncEngine) {\n return { ok: false, error: 'Sync engine not initialized — run `alfe login`' };\n }\n try {\n lastSyncResult = await syncEngine.fullSync({ quiet: true });\n return { ok: true, result: lastSyncResult };\n } catch (err: unknown) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n });\n log.info('Registered gateway RPC method: sync.now');\n\n api.registerGatewayMethod('sync.status', () =>\n Promise.resolve({\n ok: true,\n initialized: !!syncEngine,\n agentId,\n schedule: currentConfig.syncSchedule ?? 'daily',\n scope: currentConfig.syncScope ?? ['config', 'conversations', 'memory'],\n lastResult: lastSyncResult,\n watcherActive: !!stopWatcher,\n }),\n );\n log.info('Registered gateway RPC method: sync.status');\n }\n\n if (api.registerService) {\n api.registerService({\n id: 'alfe-sync-engine',\n start: () => startSyncService(),\n stop: () => stopSyncService(),\n });\n } else {\n void startSyncService().catch((err: unknown) => {\n log.error(`Sync plugin async init failed: ${err instanceof Error ? err.message : String(err)}`);\n });\n }\n\n log.info('Alfe Sync plugin activated');\n },\n\n async deactivate(api: PluginApi) {\n (globalThis as Record<string, unknown>).__alfeSyncPluginActivated = false;\n const log = api.logger;\n log.info('Alfe Sync plugin deactivating...');\n\n clearSchedule();\n disconnectSyncRelay();\n\n if (stopWatcher) {\n try {\n await stopWatcher();\n log.info('File watcher stopped');\n } catch (err: unknown) {\n log.debug(`Error stopping watcher: ${err instanceof Error ? err.message : String(err)}`);\n }\n stopWatcher = null;\n }\n\n if (daemonIpcClient) {\n try {\n daemonIpcClient.stop();\n log.info('Disconnected from Alfe daemon');\n } catch (err: unknown) {\n log.debug(`Error disconnecting from daemon: ${err instanceof Error ? err.message : String(err)}`);\n }\n daemonIpcClient = null;\n }\n\n client = null;\n agentId = null;\n syncEngine = null;\n sharedSyncEngine = null;\n lastSyncResult = null;\n currentConfig = {};\n\n log.info('Alfe Sync plugin deactivated');\n },\n\n async configure(api: PluginApi, config: SyncPluginConfig) {\n const log = api.logger;\n log.info('Reconfiguring Alfe Sync plugin...');\n currentConfig = { ...currentConfig, ...config };\n\n if (config.syncSchedule) {\n if (config.syncSchedule === 'realtime' && syncEngine && !stopWatcher) {\n const workspacePath = currentConfig.workspacePath ?? syncEngine.workspacePath;\n stopWatcher = await startWatcher({\n workspacePath,\n debounceMs: 2000,\n onChanges: async (paths) => {\n if (!syncEngine) return;\n try {\n lastSyncResult = await syncEngine.push(paths, { quiet: true });\n } catch (err: unknown) {\n log.error(`Realtime push failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n },\n });\n clearSchedule();\n log.info('Switched to realtime sync');\n } else if (config.syncSchedule !== 'realtime') {\n if (stopWatcher) {\n await stopWatcher();\n stopWatcher = null;\n }\n setupSchedule(config.syncSchedule, log);\n }\n }\n\n if (config.syncScope) {\n log.info(`Updated sync scope: ${config.syncScope.join(', ')}`);\n }\n\n log.info('Alfe Sync plugin reconfigured');\n },\n};\n\nexport default plugin;\n"],"mappings":"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"}
@@ -3,6 +3,7 @@
3
3
  "name": "Alfe Sync Plugin",
4
4
  "description": "Agent workspace backup and sync — S3-backed, automatic pull/push on start/stop",
5
5
  "entry": "./dist/plugin.js",
6
+ "activation": { "onStartup": true },
6
7
  "hooks": {
7
8
  "onAgentStart": "alfesync pull --quiet",
8
9
  "onAgentStop": "alfesync push --quiet",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfe.ai/openclaw-sync",
3
- "version": "0.0.18",
3
+ "version": "0.0.21",
4
4
  "description": "AlfeSync — agent workspace backup and sync skill for OpenClaw",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -21,8 +21,8 @@
21
21
  "commander": "^13.0.0",
22
22
  "micromatch": "^4.0.8",
23
23
  "ws": "^8.18.0",
24
- "@alfe.ai/agent-api-client": "0.1.1",
25
- "@alfe.ai/config": "0.0.8"
24
+ "@alfe.ai/config": "0.0.8",
25
+ "@alfe.ai/agent-api-client": "0.1.2"
26
26
  },
27
27
  "files": [
28
28
  "dist",